Orada sanmıyorum biri bu kavramı uygulanması kabul yolu, ama gerçekten paylaşmak istiyorum nasıl ben genellikle benim oyunlarda bu başa. Komut tasarım deseni ile Kompozit tasarım deseninin bir kombinasyonudur .
Update
Her çerçeve denilen bir yöntem ve bir Finished
eylemin ne zaman tamamlandığını gösteren bir bayrak etrafında bir sarıcı başka bir şey değildir eylemler için soyut bir temel sınıf var.
abstract class Action
{
abstract void Update(float elapsed);
bool Finished;
}
Bileşik tasarım desenini, diğer eylemleri barındırabilen ve yürütebilecek bir tür eylem oluşturmak için de kullanıyorum. Bu da soyut bir sınıf. İndirgenir:
abstract class CompositeAction : Action
{
void Add(Action action) { Actions.Add(action); }
List<Action> Actions;
}
Sonra, biri paralel yürütme ve diğeri sıralı yürütme için olmak üzere iki bileşik eylemim var . Ancak güzellik şu ki, paralel ve dizi eylemler kendileri olduğundan, daha karmaşık yürütme akışları oluşturmak için birleştirilebilirler .
class Parallel : CompositeAction
{
override void Update(float elapsed)
{
Actions.ForEach(a=> a.Update(elapsed));
Actions.RemoveAll(a => a.Finished);
Finished = Actions.Count == 0;
}
}
Ve sıralı eylemleri yöneten.
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;
}
}
Bunun yerinde olması, basitçe somut eylem uygulamaları yaratma ve yürütme akışını kontrol etmek için Parallel
ve Sequence
eylemlerini kullanma meselesidir . Bir örnekle bitireceğim:
// 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);
Bu sistemi daha önce bir grafik macerada tüm oyunu sürmek için başarıyla kullandım, ancak muhtemelen hemen hemen her şey için çalışmalıdır. Ayrıca, yürütme döngüleri ve koşullarını oluşturmak için kullanılan diğer bileşik eylem türlerini eklemek de yeterince basitti.