내가 생각하지 않는 한 이 개념을 구현하는 허용 방법은,하지만 난 정말 공유하고 싶은 방법 나는 보통 내 게임이 처리합니다. Command 디자인 패턴과 Composite 디자인 패턴 의 조합입니다 .
Update
각 프레임이라고 하는 메소드 주위의 래퍼에 불과 Finished
하고 액션 실행이 완료되었음을 나타내는 플래그 인 액션에 대한 추상 기본 클래스 가 있습니다.
abstract class Action
{
abstract void Update(float elapsed);
bool Finished;
}
또한 복합 디자인 패턴을 사용하여 다른 작업을 호스팅하고 실행할 수있는 작업 유형을 만듭니다. 이것 역시 추상 클래스입니다. 아래로 비등합니다 :
abstract class CompositeAction : Action
{
void Add(Action action) { Actions.Add(action); }
List<Action> Actions;
}
그런 다음 병렬 실행 과 순차적 실행 을 위한 복합 작업의 두 가지 구현이 있습니다. 그러나 병렬 및 시퀀스는 작업 자체이므로 더 복잡한 실행 흐름을 만들기 위해 결합 할 수 있다는 것이 장점 입니다.
class Parallel : CompositeAction
{
override void Update(float elapsed)
{
Actions.ForEach(a=> a.Update(elapsed));
Actions.RemoveAll(a => a.Finished);
Finished = Actions.Count == 0;
}
}
그리고 순차적 인 행동을 지배하는 것.
class Sequence : CompositeAction
{
override void Update(float elapsed)
{
if (Actions.Count > 0)
{
Actions[0].Update(elapsed);
if (Actions[0].Finished)
Actions.RemoveAt(0);
}
Finished = Actions.Count == 0;
}
}
이를 통해 구체적인 액션 구현을 만들고 Parallel
및 Sequence
액션을 사용하여 실행 흐름을 제어하는 것만으로도 간단합니다 . 예를 들어 보겠습니다.
// Create a parallel action to work as an action manager
Parallel actionManager = new Parallel();
// Send character1 to destination
Sequence actionGroup1 = new Sequence();
actionGroup1.Add(new MoveAction(character1, destination));
actionGroup1.Add(new TalkAction(character1, "Arrived at destination!"));
actionManager.Add(actionGroup1);
// Make character2 use a potion on himself
Sequence actionGroup2 = new Sequence();
actionGroup2.Add(new RemoveItemAction(character2, ItemType.Potion));
actionGroup2.Add(new SetHealthAction(character2, character2.MaxHealth));
actionGroup2.Add(new TalkAction(character2, "I feel better now!"));
actionManager.Add(actionGroup2);
// Every frame update the action manager
actionManager.Update(elapsed);
나는이 시스템을 사용하여 그래픽 어드벤처에서 모든 게임 플레이를 이끌어 냈지만 아마도 거의 모든 것이 가능할 것입니다. 또한 실행 루프 및 조건을 생성하는 데 사용 된 다른 유형의 복합 작업을 추가 할 수있을 정도로 간단했습니다.