मुझे नहीं लगता कि इस अवधारणा को लागू करने का एक स्वीकृत तरीका है, लेकिन मैं वास्तव में यह साझा करना चाहूंगा कि मैं आमतौर पर अपने खेलों में इससे कैसे निपटता हूं। यह कमांड डिजाइन पैटर्न और समग्र डिजाइन पैटर्न के संयोजन का एक सा है ।
मेरे पास क्रियाओं के लिए एक सार आधार वर्ग है जो एक 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);
मैंने पहले गेमप्ले के सभी गेम को ग्राफिक साहसिक में चलाने के लिए सफलतापूर्वक इस प्रणाली का उपयोग किया है, लेकिन यह शायद बहुत ज्यादा कुछ के लिए काम करना चाहिए। यह अन्य प्रकार की समग्र क्रियाओं को जोड़ने के लिए भी सरल था, जो निष्पादन छोरों और सशर्त बनाने के लिए उपयोग किए गए थे।