पृष्ठभूमि
मैं एक शौक के रूप में खेल विकास करता हूं, और उन्हें डिजाइन करने के लिए बेहतर तरीके की तलाश कर रहा हूं। वर्तमान में, मैं एक मानक OOP दृष्टिकोण का उपयोग कर रहा हूं (मैं 8 साल से उद्यम विकास कर रहा हूं इसलिए यह निष्पक्ष रूप से आता है)। उदाहरण के लिए एक "बैडी" लें
public class Baddie:AnimatedSprite //(or StaticSprite if needed, which inherit Sprite)
{
//sprite base will have things like what texture to use,
//what the current position is, the base Update/Draw/GetInput methods, etc..
//an AnimatedSprite contains helpers to animated the player while
//a StaticSprite is just one that will draw whatever texture is there
}
समस्या
कहते हैं कि मैं एक 2d platformer बना रहा हूं, और बड्डी को कूदने में सक्षम होने की आवश्यकता है। आमतौर पर मैं जो भी करता हूं वह अद्यतन / GetInput विधियों में उपयुक्त कोड जोड़ देता है। फिर अगर मुझे खिलाड़ी को क्रॉल, बतख, चढ़ाई, आदि बनाने की आवश्यकता है ... तो कोड वहां जाएगा।
यदि मैं सावधान नहीं हूँ, तो वे विधियाँ अव्यवस्थित हो जाती हैं, इसलिए मैं इस तरह से विधियाँ जोड़ियाँ बनाता हूँ
CheckForJumpAction(Input input)
तथा DoJump()
CheckforDuckAction(Input input)
तथा DoDuck()
इसलिए GetInput जैसा दिखता है
public void DoInput(Input input)
{
CheckForJumpAction(input);
CheckForDuckAction(input);
}
और अपडेट जैसा दिखता है
public void Update()
{
DoJump();
DoDuck();
}
अगर मैं जाता हूं और एक और खेल बनाता हूं जहां खिलाड़ी को कूदने और डक करने की आवश्यकता होती है, तो मैं आमतौर पर एक ऐसे खेल में जाता हूं जिसमें कार्यक्षमता होती है और इसे कॉपी करता है। गन्दा, मुझे पता है। Thats मैं क्यों मैं कुछ बेहतर के लिए देख रहा हूँ।
समाधान?
मुझे वास्तव में पसंद है कि ब्लेंड में किस तरह का व्यवहार होता है जो मैं किसी तत्व से जुड़ सकता हूं। मैं अपने खेलों में उसी अवधारणा का उपयोग करने के बारे में सोच रहा हूं। तो आइए उन्हीं उदाहरणों को देखें।
मैं एक आधार व्यवहार वस्तु बनाऊंगा
public class Behavior
{
public void Update()
Public void GetInput()
}
और मैं उस का उपयोग करके व्यवहार बना सकता हूं। JumpBehavior:Behavior
तथाDuckBehavior:Behavior
फिर मैं स्प्राइट बेस पर व्यवहारों का एक संग्रह जोड़ सकता हूं और प्रत्येक इकाई के लिए मुझे जो कुछ भी चाहिए उसे जोड़ सकता हूं।
public class Baddie:AnimatedSprite
{
public Baddie()
{
this.behaviors = new Behavior[2];
this.behaviors[0] = new JumpBehavior();
//etc...
}
public void Update()
{
//behaviors.update
}
public GetInput()
{
//behaviors.getinput
}
}
तो अब अगर मैं कई खेलों में जंप और डक का उपयोग करना चाहता था, तो मैं व्यवहार को खत्म कर सकता हूं। मैं आम लोगों के लिए एक पुस्तकालय भी बना सकता था।
क्या यह काम करता है?
मैं यह पता नहीं लगा सकता कि उनके बीच की स्थिति को कैसे साझा किया जाए। जंप और डक को देखते हुए, दोनों न केवल बनावट के वर्तमान भाग को प्रभावित करते हैं, बल्कि खिलाड़ी की स्थिति को भी प्रभावित करते हैं। (कूद समय के साथ ऊपर की ओर बल की एक घटती मात्रा लागू करने के लिए जा रहा है, जबकि बतख बस आंदोलन को रोकने के लिए जा रहा है, बुद्दि की बनावट और टकराव के आकार को बदल सकता है।
मैं इसे एक साथ कैसे बांध सकता हूं ताकि यह काम करे? क्या मुझे व्यवहारों के बीच निर्भरता गुण पैदा करने चाहिए? क्या मुझे माता-पिता के बारे में प्रत्येक व्यवहार जानना चाहिए और इसे सीधे संशोधित करना चाहिए? एक बात मुझे लगा कि एक प्रतिनिधि को व्यवहार में लाने के लिए सक्षम किया जा रहा है जब इसे ट्रिगर किया जाता है।
मुझे यकीन है कि अधिक मुद्दे हैं जो मैं देख रहा हूं, लेकिन पूरा उद्देश्य मेरे लिए एक ही गेम में गेम, और संस्थाओं के बीच इन व्यवहारों का आसानी से पुन: उपयोग करने में सक्षम होना है।
इसलिए मैं इसे आप पर पलट देता हूं। यह समझाने के लिए कि यह कैसे किया जा सकता है? क्या आपके पास एक बेहतर विचार है? मैं सुन रहा हु।