कल, मैंने अटार्नी / व्यवहार इकाई प्रणाली के बारे में जीडीसी कनाडा से एक प्रस्तुति पढ़ी है और मुझे लगता है कि यह बहुत अच्छा है। हालांकि, मुझे यकीन नहीं है कि इसे केवल व्यावहारिक रूप से कैसे उपयोग किया जाए। सबसे पहले, मैं आपको जल्दी से समझाऊंगा कि यह प्रणाली कैसे काम करती है।
प्रत्येक खेल इकाई (गेम ऑब्जेक्ट) विशेषताओं (= डेटा, जो व्यवहारों द्वारा पहुँचा जा सकता है, लेकिन 'बाहरी कोड') और व्यवहारों (= तर्क, जिसमें सम्मिलित है OnUpdate()
और OnMessage()
) से बना है। तो, उदाहरण के लिए, एक ब्रेकआउट क्लोन में, प्रत्येक ईंट से बना होता जा (उदाहरण!): PositionAttribute , ColorAttribute , HealthAttribute , RenderableBehaviour , HitBehaviour । अंतिम व्यक्ति इस तरह दिख सकता है (यह C # में लिखा गया एक गैर-काम करने वाला उदाहरण है):
void OnMessage(Message m)
{
if (m is CollisionMessage) // CollisionMessage is inherited from Message
{
Entity otherEntity = m.CollidedWith; // Entity CollisionMessage.CollidedWith
if (otherEntity.Type = EntityType.Ball) // Collided with ball
{
int brickHealth = GetAttribute<int>(Attribute.Health); // owner's attribute
brickHealth -= otherEntity.GetAttribute<int>(Attribute.DamageImpact);
SetAttribute<int>(Attribute.Health, brickHealth); // owner's attribute
// If health is <= 0, "destroy" the brick
if (brickHealth <= 0)
SetAttribute<bool>(Attribute.Alive, false);
}
}
else if (m is AttributeChangedMessage) // Some attribute has been changed 'externally'
{
if (m.Attribute == Attribute.Health)
{
// If health is <= 0, "destroy" the brick
if (brickHealth <= 0)
SetAttribute<bool>(Attribute.Alive, false);
}
}
}
यदि आप इस प्रणाली में रुचि रखते हैं, तो आप यहाँ (.ppt) अधिक पढ़ सकते हैं ।
मेरा प्रश्न इस प्रणाली से संबंधित है, लेकिन आमतौर पर प्रत्येक घटक आधारित इकाई प्रणाली। मैंने कभी नहीं देखा कि इनमें से कोई भी वास्तव में वास्तविक कंप्यूटर गेम में कैसे काम करता है, क्योंकि मुझे कोई भी अच्छा उदाहरण नहीं मिल सकता है और अगर मुझे एक मिलता है, तो यह दस्तावेज नहीं है, कोई टिप्पणी नहीं है और इसलिए मैं इसे नहीं समझता।
तो, मैं क्या पूछना चाहता हूँ? व्यवहार (घटकों) को कैसे डिज़ाइन करें। मैंने यहाँ GameDev SE पर पढ़ा है, कि सबसे आम गलती कई घटक बनाना है और बस, "सब कुछ एक घटक बनाना है"। मैंने पढ़ा है कि यह एक घटक में रेंडरिंग नहीं करने का सुझाव दिया गया है, लेकिन इसे इसके बाहर करो (इसलिए RenderableBehaviour के बजाय , यह शायद RenderableAttribute हो सकता है , और यदि किसी इकाई ने RenderableAttribute को सही पर सेट किया है, तो Renderer
(वर्ग से संबंधित नहीं) घटकों, लेकिन इंजन को ही) इसे स्क्रीन पर खींचना चाहिए?)।
लेकिन, व्यवहार / घटकों के बारे में कैसे? मान लीजिए कि मुझे एक स्तर मिला है, और स्तर में, ए Entity button
, Entity doors
और है Entity player
। जब खिलाड़ी बटन से टकराता है (यह एक फ्लोर बटन है, जिसे दबाव से टॉगल किया जाता है), इसे दबाया जाता है। जब बटन दबाया जाता है, तो यह दरवाजे खोलता है। खैर, अब यह कैसे करना है?
मैं कुछ इस तरह से आया हूं: खिलाड़ी को CollisionBehaviour मिला है , जो यह जांचता है कि खिलाड़ी किसी चीज से टकराता है या नहीं। यदि वह एक बटन से टकराता है, तो यह इकाई CollisionMessage
को भेजता है button
। संदेश में सभी आवश्यक informations होंगे: जो बटन से टकरा गया। बटन को ToggleableBehaviour मिला है , जो प्राप्त करेगा CollisionMessage
। यह जाँच करेगा कि यह किसके साथ टकराया था और यदि उस इकाई का वजन बटन को टॉगल करने के लिए काफी बड़ा है, तो बटन टॉगल हो जाता है। अब, यह बटन के ToggledAttribute को सही पर सेट करता है। ठीक है, लेकिन अब क्या?
क्या बटन को अन्य सभी वस्तुओं के लिए एक और संदेश भेजना चाहिए ताकि उन्हें बताया जा सके कि यह टॉगल किया गया है? मुझे लगता है कि अगर मैंने ऐसा सब कुछ किया, तो मेरे पास हजारों संदेश आएंगे और यह बहुत ही गन्दा होगा। तो शायद यह बेहतर है: दरवाजे लगातार जांचते हैं कि क्या बटन जो उनसे जुड़ा हुआ है, दबाया गया है या नहीं, और उसके अनुसार अपने ओपनएडर्न्स को बदलें । लेकिन फिर इसका मतलब है कि दरवाजे की OnUpdate()
विधि लगातार कुछ कर रही होगी (क्या यह वास्तव में एक समस्या है?)।
और दूसरी समस्या: क्या होगा अगर मेरे पास अधिक प्रकार के बटन हैं। एक को दबाव के द्वारा दबाया जाता है, दूसरे को गोली मारकर उतारा जाता है, तीसरे को टॉगल किया जाता है अगर उस पर पानी डाला जाता है, आदि इसका मतलब है कि मुझे अलग-अलग व्यवहार करना होगा, कुछ इस तरह से:
Behaviour -> ToggleableBehaviour -> ToggleOnPressureBehaviour
-> ToggleOnShotBehaviour
-> ToggleOnWaterBehaviour
क्या यह असली खेल है या मैं सिर्फ बेवकूफ हूं? शायद मैं सिर्फ एक हो सकता था ToggleableBehaviour और यह के अनुसार व्यवहार करेंगे ButtonTypeAttribute । तो अगर यह एक है ButtonType.Pressure
, यह यह करता है, अगर यह एक है ButtonType.Shot
, यह कुछ और करता है ...
तो मुझे क्या चाहिए? मैं आपसे पूछना चाहता हूं कि क्या मैं इसे सही कर रहा हूं, या मैं सिर्फ बेवकूफ हूं और मुझे घटकों की बात समझ में नहीं आई। मुझे इस बात का कोई अच्छा उदाहरण नहीं मिला कि खेल में घटक वास्तव में कैसे काम करते हैं, मैंने सिर्फ कुछ ट्यूटोरियल बताए कि घटक प्रणाली कैसे बनाई जाए, लेकिन इसका उपयोग कैसे करें।