मैं ऐसे कण कैसे बनाता हूं जो खिलाड़ी और दुश्मनों पर प्रतिक्रिया करता है?


38

मैं वर्तमान में अपने गेम इंजन के साथ एक गेम बना रहा हूं जिसे मैंने C ++ में लिखा है और मैं सबसे हालिया डायरेक्ट एसडीके का उपयोग कर रहा हूं।

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

जब C C ++ की बात आती है तो मैं एक अनुभवी प्रोग्रामर हूं। हालांकि, मुझे नहीं पता कि इस प्रभाव को कैसे लागू किया जाए। क्या किसी के पास कोई अच्छा विचार या डिज़ाइन विकल्प है जिसे मैं देखना चाहता हूँ? आप जो भी गहराई से कल्पना करते हैं, उसका जवाब देने के लिए स्वतंत्र महसूस करें।

जवाबों:


65

यह एक अच्छा विचार है। आप अपने जहाज के आसपास प्रसार ढाल के कुछ प्रकार की आवश्यकता होगी। तीन शारीरिक मॉडल हैं जो मैं सोच सकता हूं कि आप चाहते हैं:

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

  2. यदि आप चाहते हैं कि वे जहाज से दूर चले जाएँ, और एक बार चले जाने के बाद उन्हें आगे बढ़ाएँ। यह आम तौर पर खाली जगह में मानक भौतिकी की तरह होता है जहां दबाव ढाल नहीं होते हैं (या बहुत छोटे) होते हैं।

  3. आप जैसे ही (1) और (2) पहुंचते हैं, वैसे ही आप कणों को तेज़ी से जहाज से दूर ले जाना चाहते हैं, लेकिन एक बार जहाज चले जाने के बाद, कण धीरे-धीरे आपके जागने में स्वयं के बराबर हो जाएगा।

सभी तीन समाधानों के लिए सामान्य : आपके पास एक प्रसार क्षेत्र होना चाहिए जो आपके जहाज के साथ चलता हो। इस उदाहरण में हम इसे वृत्ताकार बनाएंगे। फिर आप वेक्टर का पता लगाते हैं, इसे v1 कहते हैं, जहाज और उस क्षेत्र के प्रत्येक कण के बीच। अपने कण को ​​उस वेक्टर के साथ दूर धकेलें। आप इसे कितनी जोर से धक्का देंगे, यह जहाज से दूरी पर निर्भर करेगा: उपयोग 1 - v1.magnitude। यह सूत्र आपको एक रैखिक शक्ति देगा, हालांकि आप इसे एक और ताकत का उपयोग करने के लिए संशोधित कर सकते हैं जैसे कि एक परिपत्र ताकत वक्र जो किनारों की ओर ताकत में कम हो जाती है। इससे इसे और अधिक देखने को मिलेगा, क्योंकि जहाज के चारों ओर गोलाकार दबाव ढाल के बजाय एक गोलाकार है।

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

समाधान 2 के लिए : केवल v1 को दृश्य स्थिति पर लागू करने के बजाय, इसे प्रत्येक तर्क अद्यतन पर कण की स्थिति में लागू करें। तो, p1.position += v1। तो आप कण में एक त्वरक बल लगा रहे हैं, जो वेग में तब्दील हो जाता है। संभवतः, आप चाहते हैं कि प्रत्येक कण के वेग को कम कर दिया जाए ताकि वे धीरे-धीरे धीमा हो जाएं और एक बार आपके पास आने पर रुक जाएं। आप देख सकते हैं कि इस समाधान का परिणाम आपके नेबुला में गुच्छेदार कणों के रूप में होगा, क्योंकि वे कभी भी पुनर्परिभाषित नहीं करेंगे। बहुत यथार्थवादी नहीं, मुझे यकीन है, क्योंकि निहारिका उनके भीतर दबाव ढाल है, चाहे वास्तविकता में कोई भी कमजोर क्यों न हो।

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

वहाँ सभी प्रकार के प्रसार सूत्र हैं आदि, लेकिन मुझे लगता है कि इस मामले में एक सरल समाधान सबसे अच्छा काम करता है।


मेट, दुर्भाग्य से मेरे पास आपके जवाब को बढ़ाने के लिए वर्तमान में प्रतिष्ठा नहीं है (और मैं केवल एक बार ही ऐसा कर पाऊंगा, जो इससे कम है)। आपने अपने पहले समाधान में जो कुछ भी खोजा है, वह आपको बिल्कुल पसंद नहीं आया। शानदार जवाब। ईमानदारी से। धन्यवाद!
मैट मैकडॉनल्ड्स

कुल आनंद मैट, यह एक अच्छा सवाल है और इसके लिए दिमाग को फ्लेक्स करने लायक है!
इंजीनियर

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