मैं अपने आरपीजी में जावा गेम जैसी वस्तुओं को कैसे परिभाषित कर सकता हूं?


21

मैं जावा में एक आरपीजी प्रकार के खेल पर लापरवाही से काम कर रहा हूं, लेकिन मुझे यह पता लगाने में परेशानी हो रही है कि मेरे पास कैसे आइटम हो सकते हैं जो हर आइटम के लिए एक अलग वर्ग बनाए बिना कई अलग-अलग चीजें कर सकते हैं।

एक उदाहरण के रूप में, मैं एक एक्स कैसे बनाऊंगा जो पेड़ों को काट सकता है और राक्षसों पर हमला कर सकता है?

अगर मैं या तो काट या हथियार वर्ग का विस्तार करता हूं तो मैं अन्य वर्ग का विस्तार नहीं कर सकता।

अगर मेरे पास चॉपिंग और हथियार एक इंटरफेस है तो मेरे पास बहुत सारे डुप्लिकेट कोड होंगे जब एक खंजर राक्षसों पर भी हमला कर सकता है और एक अलग कुल्हाड़ी पेड़ों को काट सकती है।

मैं उम्मीद कर रहा हूँ कि किसी एक आइटम वर्ग और एक फ़ाइल से आइटम और उनकी संबंधित क्षमताओं को लोड करने का एक तरीका है। यदि यह संभव है तो यह कैसे किया जा सकता है? यदि ऐसा नहीं है तो किसी खेल में आइटम करने का सबसे अच्छा तरीका क्या है?

जवाबों:


15

ग्रेगरी वियर का उत्तर यह है कि कई भूमिकाएं निभाने के लिए आइटम उदाहरणों की संरचना कैसे की जाती है।

फ़ाइल से लोड करने के लिए:

सबसे पहले, YAML का उपयोग करें। YAML एक विशिष्ट डेटा विवरण भाषा है; यह मनुष्यों द्वारा अपेक्षाकृत जल्दी से पढ़ा, संपादित और संपादित किया जा सकता है, बाइनरी डेटा का समर्थन करता है, और अधिकांश जावा सहित प्रोग्रामिंग भाषाओं के लिए पुस्तकालय मौजूद हैं। यह "मैं फ़ाइलों में वस्तुओं से डेटा कैसे प्राप्त करूं?"

दूसरा, फ्लाईवेट पैटर्न का उपयोग करें । उन फ़ाइलों से पढ़ा जाने वाला अधिकांश डेटा स्थिर है। यह प्रति उदाहरण बदलने नहीं जा रहा है ("कुल्हाड़ी 1d10 आधार को नुकसान पहुंचाती है और लकड़ी को तोड़ती है लेकिन पत्थर को नहीं" - यह एक खिलाड़ी के सभी पांच कुल्हाड़ियों का सच है)। क्या आप वास्तव में YAML फ़ाइलों से पढ़ते हैं ये प्लैटॉनिक परिभाषा हैं, और आपके व्यक्तिगत आइटम उदाहरणों में इनका उल्लेख नहीं है (और लगातार), प्रति-उदाहरण डेटा के साथ जैसे "मैं कितने ब्रेक से पहले झूलता हूं?", "क्या खिलाड़ी ने दिया था?" मुझे एक कस्टम नाम? ", और इसी तरह।

किसी एकल ऑब्जेक्ट में क्रॉस-इंस्टेंस डेटा को साझा करके, आप बहुत सारी मेमोरी को संरक्षित करते हैं, और गेम स्टेट (गेम या प्लेयर डेटाबेस को बचाने) के बिना आइटम को अपडेट करना आसान बनाते हैं।

तो आपकी कक्षा संरचना कुछ इस तरह दिखती है:

  • वर्ग आइटम - प्रति आइटम एक उदाहरण
    • मालिक-एक हथियार उदाहरण
    • एक उपकरण उदाहरण के मालिक हैं
    • एक कस्टम नाम है, आदि।
  • वर्ग हथियार - (ऊपर) प्रति आइटम एक उदाहरण
    • एक आइटम है
    • रेफर-टू वेपनडेफ
    • हैस बोनस बोनस स्तर, आदि।
  • क्लास टूल - (प्रति आइटम) एक उदाहरण के लिए
    • एक आइटम है
    • रिफ़र-टू टूलडिफ
    • हैस टिकाऊपन, आदि।
  • वर्ग हथियार - एक प्रकार का हथियार प्रति उदाहरण
    • किसी फ़ाइल से पढ़ें, फ़ील्ड स्थिर होनी चाहिए।
    • आधार क्षति राशि, 1 या 2 हाथ, आदि है।
  • क्लास टूलडेफ - उपकरण के प्रति एक उदाहरण
    • किसी फ़ाइल से पढ़ें, फ़ील्ड स्थिर होनी चाहिए।
    • एक आधार स्थायित्व है, जो सामग्री इसे तोड़ सकती है, आदि।

18

इस उद्देश्य के लिए कंपोनेंट (कंपोजिट नहीं) डिजाइन पैटर्न बहुत अच्छा है: http://gameprogrammingpatterns.com/component.html

मूल रूप से, एक एक्स आइटम श्रेणी का एक उदाहरण होगा जिसमें एक हथियार-निर्माण और एक टूलकंपेंट (शायद) शामिल था। यह जांचने के लिए कि किसी चीज़ को हथियार के रूप में इस्तेमाल किया जा सकता है या नहीं, यह जाँच लें कि उसमें WeaponComponent संलग्न है या नहीं, और उसके बाद हथियार हथियार जानकारी प्राप्त करने के लिए उस WeaponComponent उदाहरण से बात करें।

एक फ़ाइल से लोड करना एक अलग अभ्यास है, निश्चित रूप से।


और हां, आपके पास एक बार घटक होने पर आप फिर से इंटरफेस का अच्छा उपयोग कर सकते हैं। आपका कुल्हाड़ी का प्रकार IChopper और IWeapon को लागू कर सकता है, लेकिन फिर इसके लिए घटक के व्यवहार को उजागर कर सकता है, जिससे आप दोनों प्रकार और कार्यान्वयन को आवश्यकतानुसार पुन: उपयोग कर सकते हैं और घटकों के लिए परीक्षण काट सकते हैं। यदि सभी कुल्हाड़ियों में समान क्षमताएं हैं लेकिन अलग-अलग आँकड़े हैं, तो आप सुनहरे हैं। यदि आपको अद्वितीय क्षमता रखने के लिए वस्तुओं की आवश्यकता है, तो आपको गेम-कंपोनेंट-कलेक्शन को लागू करने की आवश्यकता हो सकती है और आपके अपडेट रूटीन में ऑब्जेक्ट्स को क्वेरी करना है कि वे किन घटकों के माध्यम से मौजूद हैं।
कोडेक्सअर्केनम

6
@CodexArcanum: "आपका एक्स प्रकार IChopper और IWeapon को लागू कर सकता है, लेकिन फिर इसके लिए घटक के व्यवहार को उजागर कर सकता है" - इसका क्या मतलब है? यह आपकी कक्षा पदानुक्रम को समाप्त कर देता है। घटक पैटर्न की बात यह है कि आपको एक एक्स क्लास या एक IChopper इंटरफ़ेस या एक IWeapon इंटरफ़ेस, बस ठोस चॉपर और हथियार घटकों और एक शीर्ष-स्तरीय आइटम की आवश्यकता नहीं है।

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