खेल क्रिया करने के लिए पैटर्न


11

क्या किसी खेल के भीतर विभिन्न क्रियाओं को करने के लिए आम तौर पर स्वीकृत पैटर्न है? एक खिलाड़ी जिस तरह से क्रिया कर सकता है और यह भी कि एक एआई कार्रवाई कर सकता है, जैसे कि चाल, हमला, आत्म-विनाश, आदि।

वर्तमान में मेरे पास एक अमूर्त BaseAction है जो विभिन्न क्रियाओं द्वारा वापस आने वाली विभिन्न वस्तुओं को निर्दिष्ट करने के लिए .NET जेनरिक का उपयोग करता है। यह सभी कमांड के समान एक पैटर्न में लागू किया जाता है, जहां प्रत्येक क्रिया स्वयं के लिए जिम्मेदार होती है और वह सब करती है जिसकी उसे आवश्यकता होती है।

अमूर्त होने के लिए मेरा तर्क इतना है कि मेरे पास एक एक्शनहैंडलर हो सकता है, और एआई बस बेस एक्शन को लागू करने वाली विभिन्न कार्रवाई को कतारबद्ध कर सकता है। और इसका कारण यह है कि यह सामान्य है ताकि विभिन्न क्रियाएं परिणाम से संबंधित जानकारी वापस कर सकें (क्योंकि विभिन्न क्रियाएं खेल में पूरी तरह से अलग परिणाम हो सकती हैं), साथ ही कुछ सामान्य पहले और बाद में कार्यान्वयन।

तो ... क्या ऐसा करने का अधिक स्वीकृत तरीका है, या यह ध्वनि ठीक है?


यह अच्छा लगता है, सवाल यह है कि आप कतार से क्या मतलब है? अधिकांश खेलों में बहुत त्वरित प्रतिक्रिया होती है? "एआई अलग-अलग कार्रवाई को कतारबद्ध कर सकता है"
AturSams

अच्छी बात। कोई कतार नहीं है। बस यह जानने की जरूरत है कि क्या व्यस्त है, और यदि नहीं, तो कार्रवाई को निष्पादित करें।
आर्किलिकम

जवाबों:


18

मुझे नहीं लगता कि इस अवधारणा को लागू करने का एक स्वीकृत तरीका है, लेकिन मैं वास्तव में यह साझा करना चाहूंगा कि मैं आमतौर पर अपने खेलों में इससे कैसे निपटता हूं। यह कमांड डिजाइन पैटर्न और समग्र डिजाइन पैटर्न के संयोजन का एक सा है ।

मेरे पास क्रियाओं के लिए एक सार आधार वर्ग है जो एक 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);

मैंने पहले गेमप्ले के सभी गेम को ग्राफिक साहसिक में चलाने के लिए सफलतापूर्वक इस प्रणाली का उपयोग किया है, लेकिन यह शायद बहुत ज्यादा कुछ के लिए काम करना चाहिए। यह अन्य प्रकार की समग्र क्रियाओं को जोड़ने के लिए भी सरल था, जो निष्पादन छोरों और सशर्त बनाने के लिए उपयोग किए गए थे।


यह एक बहुत अच्छा समाधान की तरह लग रहा है। जिज्ञासा से बाहर, फिर आप यूआई को कैसे आकर्षित करने दें? क्या आपके खेल की वस्तुओं (पात्रों की तरह) में राज्य होता है जो यह बताने के लिए उपयोग किया जाता है कि प्रतिपादन उद्देश्यों के लिए क्या हुआ है, या क्या यह स्वयं ऐसा है जो ऐसा करता है?
आर्किलिकम

1
आमतौर पर मेरे कार्य केवल संस्थाओं की स्थिति को बदलते हैं , और प्रदान किए गए आउटपुट में कोई भी परिवर्तन उस राज्य परिवर्तन के परिणामस्वरूप होता है, न कि कार्यों के माध्यम से। उदाहरण के लिए, तत्काल-मोड रेंडर के साथ कोई अतिरिक्त कदम की आवश्यकता नहीं है क्योंकि Drawविधि पहले से ही इकाई की स्थिति के शीर्ष पर बनाई गई है, और परिवर्तन स्वचालित हैं। फ्लैश की तरह एक बरकरार-मोड रेंडरर में, आप प्रदर्शन करने वाली वस्तुओं में परिवर्तन के लिए अपनी संस्थाओं में परिवर्तन करने के लिए अवलोकन पैटर्न का उपयोग कर सकते हैं या इकाई के अंदर मैन्युअल रूप से कनेक्शन बना सकते हैं।
डेविड गौवेया

1
पहली स्थिति में, मान लें कि आपकी Characterकक्षा में एक Positionसंपत्ति है, और एक Drawविधि है जो पढ़ती है कि वर्तमान मूल्य क्या Positionहै और सही छवि को वहां खींचता है। इस स्थिति में, आपको केवल उस मूल्य को अपडेट करने की आवश्यकता Positionहै जो परिणाम स्क्रीन पर स्वचालित रूप से दिखाई देगा।
डेविड गाविया

1
दूसरी स्थिति यह है, जब आपके Characterपास एक Positionसंपत्ति होती है, लेकिन यह किसी प्रकार की Spriteवस्तु को प्रदान करता है जो स्वचालित रूप से एक दृश्य ग्राफ या कुछ और द्वारा प्रस्तुत किया जा रहा है। इस स्थिति में आपको यह सुनिश्चित करना होगा कि चरित्र की स्थिति और स्प्राइट की स्थिति दोनों हमेशा सिंक में हों, जिसमें थोड़ा और काम शामिल हो। फिर भी, किसी भी मामले में, मैं यह नहीं देखता कि एक्शन मैनेजर का इससे कोई लेना-देना क्यों है। :)
डेविड गौवेया

1
दोनों तरीकों के फायदे और नुकसान हैं .. मैं अपने 2 डी गेम के लिए दूसरी विधि के साथ गया, और मैंने इसे कई बार पछतावा किया है क्योंकि यह सब कुछ सिंक में रखने के लिए काफी अधिक जटिल है। लेकिन इसके फायदे भी हैं, उदाहरण के लिए, यह पता लगाने की कोशिश करते समय कि किस इकाई को क्लिक किया गया था, या क्या निकाला जाना चाहिए या नहीं निकाला जाना चाहिए, क्योंकि जो कुछ भी प्रदान किया जाएगा वह एन निकाय प्रकारों के बीच बिखरे हुए के बजाय समान डेटा संरचना में निहित है।
डेविड गाविया
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.