एक खेल में हमला करने और हमले के प्रकार के लिए प्रोग्रामिंग डिजाइन पर कुछ अंतर्दृष्टि की तलाश


14

इसलिए, मैं अपने 2D स्पेस RTS पर हमला करना शुरू कर रहा हूं (यह एकता में है, इसलिए यह घटक संचालित है)। प्रारंभ में यह "रेंज में दुश्मन, क्षति लागू" के रूप में सरल था। हालांकि हथियारों / हमलों के कई "प्रकार" होंगे जो उनके विशेष जहाज या संरचना से जुड़े हैं। साथ ही अन्य कारकों में केवल कच्ची क्षति शामिल है जैसे कि क्षति प्रकार, और भविष्य में संभवतः जड़ता।

क्या आप लोगों के पास प्रत्येक इकाई और संरचना प्रकार होगा, यह स्वयं का हमलावर प्रकार है। मतलब आप प्रत्येक इकाई / संरचना के लिए एक स्क्रिप्ट बनाते हैं जो यह परिभाषित करती है कि यह हमला प्रकार, क्षति, प्रभाव, सीमा, कण, स्प्राइट ... आदि है और एक घटक के रूप में संलग्न है?

या एक स्क्रिप्ट बनाते हैं जो एक हमले के प्रकार को परिभाषित करता है, उस के साथ जुड़े प्रोजेक्टाइल प्रकार के लिए एक स्क्रिप्ट ... आदि और फिर उन का विस्तार करें और प्रत्येक इकाई के लिए उन सभी को संशोधित करें, प्रत्येक स्क्रिप्ट को इकाई / संरचना में संलग्न करें।


मुझे आशा है कि मैं कुछ समझ पा रहा हूं, मैं इसे इतने लंबे समय से विचार कर रहा हूं, मुझे यकीन नहीं है कि मैं एक समस्या को हल कर रहा हूं, या बस अपनी समस्याओं को बना रहा हूं और खुद को एक छेद में खोद रहा हूं।

जब आपके पास एक ऐसा खेल होता है जिसमें कई प्रकार के हमले हो सकते हैं जो एक विशिष्ट इकाई / संरचना तक सीमित हो सकते हैं या नहीं हो सकते हैं, तो आप उस ढाँचे को कैसे डिज़ाइन करते हैं जो एक घटक-संचालित डिज़ाइन वातावरण में विशिष्ट इकाइयों / संरचनाओं से एक साथ बंधा हो। ?

यदि यह स्पष्ट नहीं है तो मुझे बताएं।

संपादित करें: महान जवाब, धन्यवाद।

विस्तारित प्रश्न:

उत्तर "प्रत्येक वस्तु की अपनी आक्रमण लिपि हो सकती है" से भिन्न प्रतीत होते हैं, "आक्रमण के प्रकारों को अपनी स्वयं की लिपियों के रूप में रखना और प्रत्येक वस्तु को अधिक पुन: प्रयोज्य समाधान के लिए निर्दिष्ट करना"। आइए कहते हैं कि मेरे पास "ब्लास्टर" हमला है, यह एक निश्चित गति से लाल प्रक्षेप्य को गोली मारता है। यह क्षति है, आग की दर, और प्रक्षेप्य आकार इसे फायरिंग करने वाली इकाई पर निर्भर है। क्या उस इकाई के लिए केवल एक हमले की स्क्रिप्ट बनाना बेहतर है, या प्रत्येक इकाई के उद्देश्य को फिट करने के लिए "ब्लास्टर हमले" को आज़माना और संशोधित करना है जो इसका उपयोग करना चाहता है?


1
सामान्य गेम प्रोग्रामिंग विचारों के लिए, मुझे आरपीजी FFV की पूरी कल्पना का उल्लेख करना पसंद है - gamefaqs.com/snes/588331-final-fantasy-v/faqs/30040
कोड व्हिस्परर

जवाबों:


12

खैर, मैं ईमानदारी से इस पर एक विशेषज्ञ नहीं हूं ... लेकिन मुझे लगता है कि यह इस बात पर निर्भर करता है कि हमले कितने जटिल और विविध हैं। चूंकि यह एक आरटीएस है जिसका मैं अनुमान लगा रहा हूं कि आपके पास अपने हमले के प्रकारों के साथ शायद 10-50 या इतनी अलग-अलग इकाइयाँ या संरचनाएँ होंगी।

विकल्प 1: यदि अपेक्षाकृत कम संख्या में इकाइयाँ होती हैं, जिनमें ऐसे हमले होंगे जो कुछ इसी तरह के होते हैं तो मैं बस एक बड़ी पटकथा में सब कुछ डाल देता हूं और निरीक्षक में प्रयुक्त मापदंडों को परिभाषित करता हूं।

विकल्प 2: यदि, दूसरे पर आप असमान व्यवहार के साथ बड़ी संख्या में हमले के प्रकार की कल्पना करते हैं, तो आप सब कुछ तोड़ सकते हैं ताकि प्रत्येक इकाई और इमारत को अपनी अनूठी हमले की स्क्रिप्ट मिल जाए। मैं सोच रहा हूं कि यदि आप ऐसा करते हैं, तो आप "हेल्पर" स्क्रिप्ट बनाना चाहते हैं जो आमतौर पर उपयोग किए जाने वाले कोड को परिभाषित करता है जो कि कई व्यक्तिगत स्क्रिप्ट से पकड़ सकता है। इस तरह आपको सब कुछ फिर से लिखना नहीं पड़ेगा और आपको पता चल जाएगा कि यह सब कहाँ है।

विकल्प 3: आपको जो संभवत: नहीं करना चाहिए, उसमें कुछ समूहों की इकाइयां हैं जो स्क्रिप्ट साझा करते हैं, यह संभवतः आपको भ्रमित करेगा और एक गड़बड़ हो जाएगा यदि आपको हमले के लिए आवश्यक कोड 10 अलग-अलग लिपियों में है।

यहां, मैंने आपको एक तस्वीर खींची।

यहाँ छवि विवरण दर्ज करें


2
उत्तर के लिए बहुत - बहुत धन्यवाद। मैं किसी कारण से विकल्प 3 की ओर झुकना शुरू कर रहा था, और मुझे इसे सही ठहराने का एक कठिन समय मिल रहा था। मैं शायद दूसरा मार्ग ले जाऊंगा, प्रत्येक इकाई को अपनी कस्टम अटैकिंग स्क्रिप्ट मिलती है जिसमें प्रत्येक कोड / भवन के एक घटक के रूप में साझा किए जाने वाले कॉमन कोड को साझा किया जाता है। मुझे यकीन नहीं है कि जहां मैं विचार की ट्रेन के साथ जा रहा था, जिसने मुझे विकल्प 3 तक पहुंचाया, धन्यवाद। मैं यह खुला छोड़ रहा हूं जब तक मैं AM में उठता हूं, अगर कोई अन्य पोस्टर है जिसमें झंकार करना चाहते हैं।
डगलस गास्केल

कोई समस्या नहीं है, यह एक निश्चित जवाब नहीं है, लेकिन आशा है कि यह मदद करता है।
मीर

1
आप 1 और 2 को एक बड़ी स्क्रिप्ट में समान हमले डालकर अलग कर सकते हैं और अलग-थलग पड़ने वाले हमलों को अलग कर सकते हैं
शाफ़्ट फ्रीक

4
मैं हैरान हूँ # 3 के खिलाफ सिफारिश की है? क्या मॉड्यूलर / जेनेरिक कक्षाओं के पूरे बिंदु नहीं हैं ताकि प्रत्येक इकाई को अपने स्वयं के प्रकार को परिभाषित न करना पड़े? यदि कोई खेल एक आरटीएस है, और घेराबंदी क्षति (आमतौर पर "लंबी रेंज") एक क्षति प्रकार है, तो आप इसे एक बार परिभाषित करना चाहते हैं और कई आर्टिलरी-शैली की इकाइयाँ इसे संदर्भित करती हैं जब वे अपनी क्षति को शांत करते हैं, ताकि यदि घेराबंदी को नुकसान पहुंचे कभी नफ़र (असंतुलित) होने की ज़रूरत है, आपको केवल एक वर्ग को अपडेट करना होगा?
HC_

1
"Here, I drew you a picture."मुझे यह
FreeAsInBeer

4

मुझे एकता के बारे में पूरी जानकारी नहीं है और मैंने कुछ समय में खेल का विकास नहीं किया है, इसलिए मैं आपको इस सवाल का सामान्य प्रोग्रामिंग उत्तर दूंगा। मैंने सामान्य रूप से इकाई-घटक प्रणालियों के बारे में जो ज्ञान दिया है, उस पर मेरा जवाब आधारित है, जहाँ एक इकाई एक संख्या है जो N कई घटकों से जुड़ी है, एक घटक में केवल डेटा होता है, और एक सिस्टम घटकों के सेट पर संचालित होता है जो इसके साथ जुड़े होते हैं एक ही इकाई।

आपकी समस्या का स्थान यह है:

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

मैं निम्नलिखित की तरह समाधान की संरचना करेगा:

  • एक हमले में एक पहचानकर्ता होता है - यह एक स्ट्रिंग हो सकता है।
  • एक इकाई 'जानता' है कि यह एक हमले का उपयोग कर सकता है (हमले के पहचानकर्ता के आधार पर)।
  • जब इकाई द्वारा हमले का उपयोग किया जाता है, तो इसी प्रदर्शन घटक को दृश्य में जोड़ा जाता है।
  • आपके पास कुछ तर्क हैं जो हमले के लक्ष्य, हमलावर और इस्तेमाल किए जा रहे हमले के बारे में जानते हैं - इस तर्क को तय करना चाहिए कि आप कितना नुकसान करते हैं (और जड़ता या दोनों संस्थाओं में से जो भी हैं) तक पहुंच है।

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

// components
var bulletStrength = { strength: 50 };
var inertia = { inertia: 100 };
var target = { entityId: 0 };
var bullets = {};
var entity = entityManager.create([bulletStrength, inertia, target, bullets]);

var bulletSystem = function() {
  this.update = function(deltaTime, entityId) {
    var bulletStrength = this.getComponentForEntity('bulletStrength', entityId);
    var targetComponent = this.getComponentForEntity('target', entityId);
    // you may instead elect to have the target object contain properties for the target, rather than expose the entity id
    var target = this.getComponentForEntity('inertia', targetComponent.entityId);

    // do some calculations based on the target and the bullet strength to determine what damage to deal
    target.health -= ....;
  }
};

register(bulletSystem).for(entities.with(['bullets']));

क्षमा करें, यह उत्तर थोड़ा 'पानी वाला' है। मेरे पास केवल आधे घंटे का लंच ब्रेक है और एकता के बारे में पूरी तरह से जानने के बिना कुछ के साथ आना मुश्किल है :(


3

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

विस्तारित उत्तर
यह है कि मैं इस दृष्टिकोण के साथ ब्लास्टर हमले का सामना कैसे करूंगा । मैं दूसरों को अपने लिए जवाब दूंगा।

मैं अपनी इकाइयों को एक IAttacker इंटरफ़ेस या क्लास को बुनियादी हमले के आँकड़ों / विधियों के साथ लागू करूँगा। जब एक IAttacker एक IDamageable पर हमला करता है, तो वह अपना विशिष्ट आक्रमण स्वयं और अपने लक्ष्य (IAttacker और IDamageable, या शायद IDamageables का एक संग्रह) बनाता है। यह हमला IAttacker के लिए आवश्यक आँकड़ों को पकड़ लेता है (जैसे उन्नयन के दौरान परिवर्तन से बचने के लिए या ऐसा कुछ भी - हम नहीं चाहते हैं कि हमले उसके आँकड़ों को बदलने के बाद पहले ही लॉन्च हो चुके हैं) और अगर उसे विशेष आँकड़ों की ज़रूरत है, तो IAttacker को कास्ट करें इसके आवश्यक प्रकार (उदाहरण के लिए। IBlasterAttacker) और उस तरह से विशेष आँकड़े प्राप्त करता है।

इस दृष्टिकोण के साथ, एक ब्लास्टरअटैकर को बस एक ब्लास्टरअटैक बनाने की जरूरत है, और ब्लास्टरअटैक बाकी की देखभाल करता है। आप BlasterAttack को उप-वर्ग कर सकते हैं या अलग FastBlasterAttacker, MegaBlasterAttacker, SniperBlasterAttacker, आदि बना सकते हैं, और प्रत्येक के लिए हमलावर कोड समान है (और संभवतः ब्लास्टरअटैक से विरासत में मिला है): BlasterAttack बनाएं और ब्लास्टरएटर में अपना और मेरा लक्ष्य (s) बनाएं। ।


अनिवार्य रूप से, यूनिट एक IAttacker इंटरफ़ेस से विरासत में मिली (मेरे पास यह पहले से ही है), और "दुश्मन" (यह भी है) के लिए एक पहचानने योग्य इंटरफ़ेस है। जब हमलावर हमला करता है, तो एक ब्लास्टरअटैक (या व्युत्पन्न वर्ग) कहा जाता है। यह "हमला" IAttacker से इसकी ज़रूरत के डेटा को पुनः प्राप्त करेगा, और प्रोजेक्ट हिट होने पर इसे IDagageable पर लागू करेगा? क्या प्रक्षेप्य में ही ब्लास्टरअटैक वर्ग शामिल है, ताकि एक बार इसे निकाल देने के बाद यह आईएटैकर के परिवर्तनों से प्रभावित न हो, और आईडीएमागैबल पर इसके नुकसान / प्रभाव को लागू कर सकता है यदि यह प्रक्षेप्य वास्तव में हिट हो।
डगलस गास्केल

जब आप कहते हैं "एक ब्लास्टरअटैक (या व्युत्पन्न वर्ग) कहा जाता है" मैं कहूंगा कि एक ब्लास्टरअटैक बनाया गया है। BlasterAttack के इस नव निर्मित उदाहरण, किरण (या गोली या रे या जो कुछ भी) का प्रतिनिधित्व करता है, तो यह है फेंकने। BlasterAttack ने IAttacker और IDamageable ऑब्जेक्ट्स से जो भी आँकड़े की आवश्यकता होती है उन्हें कॉपी किया है: स्थिति, हमलावर आँकड़े, आदि। BlasterAttack तब अपनी स्थिति को ट्रैक करता है और यदि लागू हो, तो "संपर्क" पर नुकसान को लागू करता है। आपको यह पता लगाने की आवश्यकता होगी कि अगर यह चूक जाता है या अपने गंतव्य (लक्ष्य की पुरानी स्थिति) तक पहुंच जाता है तो क्या करना है। जमीन जला दो? गायब होना? तुम्हारा फोन।
रिक्शे की

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

आह, यह समझ में आता है। मिस्ड अटैक के लिए प्रोजेक्टाइल की अपनी पूर्व निर्धारित सीमा / जीवनकाल होगा। यदि यह उस जीवनकाल के अंत से पहले कुछ और हिट करता है, तो यह जिस भी वस्तु के साथ टकराता है, उसके स्वामित्व का संदर्भ प्राप्त करेगा, और क्षति उस तरह से लागू होगी। वास्तव में यह है कि सभी प्रोजेक्टाइल कैसे काम करेंगे, वे नहीं जानते कि "क्या" वे यात्रा कर रहे हैं, बस वे यात्रा कर रहे हैं (मिसाइल जैसी होमिंग-जैसी प्रोजेक्टाइल को छोड़कर)। AEO प्रभाव बस गंतव्य पर एक गोले कोलाइडर को सक्षम कर सकते हैं और सभी वस्तुओं को प्राप्त कर सकते हैं जो इसके अंदर हैं। सहायता के लिए धन्यवाद।
डगलस गास्केल

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