मैंने हाल ही में एक 'यूनिट सिस्टम' का उपयोग करके एक साधारण स्पेस इनवॉडर्स गेम बनाया है। यह एक ऐसा पैटर्न है जो विशेषताओं और व्यवहारों को बहुत अच्छी तरह से अलग करता है। इसे पूरी तरह से समझने के लिए मुझे कुछ पुनरावृत्तियों की ज़रूरत थी, लेकिन एक बार जब आप कुछ घटकों को डिज़ाइन कर लेते हैं तो यह आपके मौजूदा घटकों का उपयोग करके नई वस्तुओं की रचना करने के लिए बेहद सरल हो जाता है।
आपको इसे पढ़ना चाहिए:
http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/
यह एक बेहद जानकार आदमी द्वारा अक्सर अपडेट किया जाता है। यह ठोस कोड उदाहरणों के साथ एकमात्र इकाई प्रणाली चर्चा भी है।
मेरी पुनरावृत्तियों इस प्रकार है:
पहले पुनरावृत्ति में एक "एंटिटी सिस्टम" ऑब्जेक्ट था जो एडम के रूप में वर्णित था; हालाँकि मेरे घटकों में अभी भी विधियाँ थीं- मेरे 'रेंडर करने योग्य' घटक में एक पेंट () विधि थी, और मेरी स्थिति घटक में एक चाल () विधि और आदि थे जब मैंने उन संस्थाओं को बाहर करना शुरू कर दिया जिन्हें मैंने महसूस किया कि मुझे बीच संदेश भेजने की आवश्यकता है। घटकों और घटकों अद्यतन के निष्पादन का आदेश .... जिस तरह से बहुत गड़बड़ है।
इसलिए, मैंने वापस जाकर टी-मशीनों के ब्लॉग को फिर से पढ़ा। टिप्पणी थ्रेड्स में बहुत सारी जानकारी है- और उनमें वह वास्तव में इस बात पर जोर देता है कि घटकों में व्यवहार नहीं है- व्यवहार इकाई प्रणालियों द्वारा प्रदान किए जाते हैं। इस तरह आपको कंपोनेंट्स और ऑर्डर कंपोनेंट अपडेट के बीच मेसेज पास करने की जरूरत नहीं है क्योंकि ऑर्डर सिस्टम के निष्पादन के ग्लोबल ऑर्डर से तय होता है । ठीक है। शायद यह बहुत सार है।
वैसे भी यात्रा # 2 के लिए यह वही है जो मैंने ब्लॉग से प्राप्त किया था:
EntityManager - घटक "डेटाबेस" के रूप में कार्य करता है, जो कि उन संस्थाओं के लिए क्वियर किया जा सकता है जिनमें कुछ प्रकार के घटक होते हैं। यह भी शीघ्र पहुँच के लिए इन-मेमोरी डेटाबेस द्वारा समर्थित हो सकता है ... अधिक जानकारी के लिए टी-मशीन पार्ट 5 देखें।
EntitySystem - प्रत्येक प्रणाली अनिवार्य रूप से केवल एक विधि है जो एंटाइट्स के सेट पर संचालित होती है। प्रत्येक सिस्टम एक एक्स या वाई के घटक x का उपयोग करेगा ताकि वह काम कर सके। तो आप घटक x, y और z के साथ संस्थाओं के लिए प्रबंधक को क्वेरी करेंगे और फिर उस परिणाम को सिस्टम में पास करेंगे।
इकाई - सिर्फ एक आईडी, एक लंबे समय की तरह। इकाई वह है जो समूहों के एक समूह को एक 'इकाई' में एक साथ सम्मिलित करती है।
घटक - खेतों का एक सेट .... कोई व्यवहार नहीं! जब आप व्यवहार जोड़ना शुरू करते हैं तो यह गड़बड़ हो जाता है ... यहां तक कि एक साधारण अंतरिक्ष आक्रमणकारियों के खेल में भी।
संपादित करें : वैसे, 'dt' अंतिम मुख्य लूप आह्वान के बाद का डेल्टा समय है
तो मेरा मुख्य आक्रमणकारी पाश यह है:
Collection<Entity> entitiesWithGuns = manager.getEntitiesWith(Gun.class);
Collection<Entity> entitiesWithDamagable =
manager.getEntitiesWith(BulletDamagable.class);
Collection<Entity> entitiesWithInvadorDamagable = manager.getEntitiesWith(InvadorDamagable.class);
keyboardShipControllerSystem.update(entitiesWithGuns, dt);
touchInputSystem.update(entitiesWithGuns, dt);
Collection<Entity> entitiesWithInvadorMovement = manager.getEntitiesWith(InvadorMovement.class);
invadorMovementSystem.update(entitiesWithInvadorMovement);
Collection<Entity> entitiesWithVelocity = manager.getEntitiesWith(Velocity.class);
movementSystem.move(entitiesWithVelocity, dt);
gunSystem.update(entitiesWithGuns, System.currentTimeMillis());
Collection<Entity> entitiesWithPositionAndForm = manager.getEntitiesWith(Position.class, Form.class);
collisionSystem.checkCollisions(entitiesWithPositionAndForm);
यह पहली बार में थोड़ा अजीब लगता है, लेकिन यह अविश्वसनीय रूप से लचीला है। इसे अनुकूलित करना भी बहुत आसान है; विभिन्न घटक प्रकारों के लिए आपके पास पुनर्प्राप्ति को तेज़ बनाने के लिए अलग-अलग बैकिंग डेटस्टोर्स हो सकते हैं। A फॉर्म ’वर्ग के लिए आप टक्कर का पता लगाने के लिए गति बढ़ाने के लिए इसे क्वाडट्री के साथ रख सकते हैं।
मैं आप की तरह हूँ; मैं एक अनुभवी डेवलपर हूं, लेकिन गेम लिखने का कोई अनुभव नहीं था। मैंने कुछ समय शोध करके देव पैटर्न दिया, और इसने मेरी आंख को पकड़ लिया। यह किसी भी तरह से चीजों को करने का एकमात्र तरीका नहीं है, लेकिन मैंने इसे बहुत सहज और मजबूत पाया है। मेरा मानना है कि श्रृंखला "गेम प्रोग्रामिंग जेम्स" की पुस्तक 6 में पैटर्न पर आधिकारिक रूप से चर्चा की गई थी - http://www.amazon.com/Game-Programming-Gems/dp/1584500492 । मैंने स्वयं कोई पुस्तक नहीं पढ़ी है लेकिन मुझे लगता है कि वे गेम प्रोग्रामिंग के लिए वास्तविक संदर्भ हैं।