मैं वीडियो गेम में प्रोजेक्टाइल का प्रतिनिधित्व कैसे करूं?


14

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

हालांकि, यह कई प्रोजेक्टाइल के साथ बड़े दृश्यों में महंगा लगता है; मैं सोच रहा हूं कि इस प्रकार के उपयोग के मामले में अन्य प्रकार की रणनीतियों या कार्यान्वयन का क्या उपयोग किया जाता है। ट्रैकिंग प्रोजेक्टाइल (गोलियों, टैंक के गोले, आदि) के लिए एफपीएस जैसे खेल क्या करते हैं?


5
बहुत सारे एफपीएस गेम यह मानते हैं कि गोलियां तत्काल होती हैं, लेकिन ऐसे भी हैं जो प्रक्षेपवक्र और यात्रा के समय की गणना करते हैं।
जॉन मैकडॉनल्ड्स

2
+1 यह एक बड़ा सवाल है, और मैं इसे 3 डी तक सीमित नहीं करूंगा।
ashes999

जवाबों:


8

के लिए बहुत तेजी से प्रोजेक्टाइल (जैसे लेज़रों या गोलियों के रूप में), तो आप इस्तेमाल कर सकते हैं, एक रे

एक किरण में एक प्रारंभिक बिंदु और एक अंतिम बिंदु होता है। किरण के लिए A (बहुत न्यूनतम) डेटा संरचना है:

struct Ray
{
  Vector3f start, end ;
} ;

इस तरह दिखता है:

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

(आप दिशा की वेक्टर और लंबाई को भी कैश कर सकते हैं, लेकिन मैंने ऊपर एक बहुत ही सरल मानदंड का उपयोग किया है)।

यदि किरण एक लेज़र बीम है जो प्रकाश की गति से यात्रा करती है, तो आप किरण को एक जोड़ी फ्रेम के लिए (बंदूक की नोक पर शुरू करने और कहीं पर एक दीवार पर समाप्त होने के रूप में) जारी रखेंगे। कुछ भी किरण को काटना प्रत्येक फ्रेम को नुकसान पहुंचाता है।

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

किरणों को कुशलतापूर्वक गोलाकार, आब्ज, उत्तल कुल्हाड़ियों आदि से टकराया जा सकता है। एक वास्तविक चल रहे कार्यक्रम के लिए मेरी हलिनेटर परियोजना देखें (CTRL + किरणों पर क्लिक करें)


1
कई प्रोजेक्टाइल के लिए एक किरण बहुत अच्छी तरह से काम नहीं करती है। उदाहरण के लिए, किसी भी प्रक्षेप्य को लोब किया जा सकता है, जैसे टैंक के गोले। किरणें सीधे शॉट प्रोजेक्टाइल के लिए महान हैं।
MichaelHouse

खैर, अगर शेल बेहद धीमी गति से चल रहा है (एक बुलेट या लेजर की तुलना में), तो हाँ मैं इसे एक नियमित निकाय के रूप में (बस खिलाड़ी के रूप में) मॉडल करूँगा
bobobobo

7
तकनीकी रूप से, एक किरण एक प्रारंभिक बिंदु और एक दिशा है। यह एक शुरुआत बिंदु और एक अन्य बिंदु के साथ निर्धारित किया जा सकता है, लेकिन यह इसकी परिभाषा का हिस्सा नहीं है। परिभाषा के अनुसार, किरणें अनंत हैं, और कोई अंतिम बिंदु नहीं है।
केसी कुबाल

1
आप सही हैं, मैंने जो वर्णन किया है वह वास्तव में एक खंड खंड है , लेकिन ज्यादातर लोग टक्कर का पता लगाने के बारे में बात करते समय उन्हें किरण कहते हैं।
बोब्बोबो

3

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

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


2

जब आप टकराव का पता लगाने के लिए अनुकूलन करना चाहते हैं, तो आप सभी खेल वस्तुओं को दो या तीन आयामी पेड़ में संग्रहीत कर सकते हैं । यह डेटा संरचना एक निश्चित क्षेत्र में सभी वस्तुओं को पुनः प्राप्त करने के लिए बहुत कुशल बनाती है।

हालांकि, बाइनरी पेड़ों में नुकसान है कि वे आसानी से पतित हो जाते हैं जब ऑब्जेक्ट जोड़े जाते हैं, हटाए जाते हैं और अपनी स्थिति बदलते हैं, इसलिए आपको इसे ऑटो-बैलेंस करने की आवश्यकता होगी ।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.