मैं एक इकाई को एक दिशा में कैसे ले जाऊं?


11

मेरे पास एक Entityउदाहरण है जो हर गेम टिक को अपडेट करता है। चलो मान लेते हैं कि इकाई लगातार आगे बढ़ती है। मैं उस फ़ंक्शन को इकाई का कोण देने में सक्षम होना चाहता हूं जो इसे उस दिशा में ले जाता है:

moveForward(90);उन्हें दाईं ओर ले जाना चाहिए। अगर मैंने अपने रोटेशन को वैश्विक घोषित किया int, तो कर रहा हूं

moveForward(rotation);
rotation++;

यह अपने आंदोलन के साथ एक छोटे वृत्त का पता लगाएगा।

मैं यह कैसे कर सकता हूँ? मुझे लगता है कि इसमें वेक्टर गणित शामिल है; मुझे कोई जानकारी नहीं है, इसलिए एक संक्षिप्त विवरण अच्छा होगा।

जवाबों:


16

वैसे सबसे सरल अर्थ में आपके पास कुछ ऐसा है।

   y  |\
      | \
   m  |  \         s
   o  |   \        p
   v  |(a) \       e
(y)e  |angle\      e
   m  |      \     d
   e  |       \
   n  |        \
   t  |         \
      |__________\
      x movement
        (x)

हालांकि गति शत्रु की तीव्र गति है, और आप यह निर्धारित कर सकते हैं कि उन्हें x दिशा में कितना बढ़ना चाहिए और कोण के पाप या कोस को बढ़ाकर y की दिशा में कितना बढ़ना चाहिए और गति से गुणा करना चाहिए। चूंकि...

 sin(a) = x / speed

इसलिए:

 x = speed * sin(a)

तथा:

cos(a) = y / speed

इसलिए:

y = speed * cos(a)

अपने उदाहरण में moveForward(90)प्राप्त होते हैं speed * sin(90)या speed * 1एक्स दिशा में और speed * cos(90)या 0y दिशा में (यह सही करने के लिए आगे बढ़ना चाहिए के रूप में आपके द्वारा निर्दिष्ट)। आपको मूल अर्थों में शुरुआत करनी चाहिए।

इसे सामान्य बनाना:

moveForward(float angle)
{
    x += speed * sin(angle);
    y += speed * cos(angle);
}

आह, मैंने कल्पना की तुलना में बहुत सरल है, बहुत बहुत धन्यवाद :)
शॉन वाइल्ड

मुझे पूरा यकीन है कि आपको y और x को स्विच करना होगा। sin (अल्फ़ा) = b / c।
जकोरा

@ यह ड्राइंग मैं SOH-CAH-TOA से मेल खाता है, पाप कर्ण के विपरीत है जो ड्राइंग में x या गति है। यदि कोण त्रिभुज के दूसरी तरफ था, तो इसे उल्टा कर दिया जाएगा (और यदि यह गेम डिज़ाइन के उद्देश्य के लिए अधिक व्यावहारिक है तो मैं इसे बदल सकता हूं, लेकिन मुझे इसकी सभी मनमानी लगती है)।
केविन डिट्रालिया

मैं अपने मोबाइल फोन पर हूं इसलिए इसकी व्याख्या करना बहुत कठिन था। मैंने फ़ार्मुलों पर स्किम किया ...
jcora

यह एक बहुत अच्छा त्रिकोण है जो आपको वहां मिला है। +1
भाई केविन डी।

3

अन्य उत्तर गलत है, जैसा कि आप निम्नलिखित में से एक रोटेशन के आधार पर एक विमान के साथ सही ढंग से आगे बढ़ने के लिए करते हैं:

posX += Math.cos(rotation) *  forwardSpeed + Math.sin(rotation) * strafeSpeed;
posY -= -Math.cos(rotation) * strafeSpeed + Math.sin(rotation) * forwardSpeed;

हालाँकि, मैं आपको cos / sin के लिए एक चर बनाने की सलाह दूंगा जिसे आप केवल तभी अपडेट करते हैं जब रोटेशन बदल जाता है इसलिए आप इसे 4 बार टिक की गणना नहीं कर रहे हैं।

StrafeSpeed ​​आपके रोटेशन के साथ-साथ आगे बढ़ने के लिए, अगल-बगल से आगे बढ़ेगा।

संपादित करें: tesselode एक ही काम करता है, सिवाय इसके कि उसके पास साइड टू मूवमेंट नहीं है।


2

आपने कहा कि टिक्स अपडेट करें, इसलिए मैं मान रहा हूं कि आपके पास वैरिएबल फ्रेम रेट नहीं है। यदि ऐसा है तो:

x + = गति * math.cos (कोण)

y + = गति * math.sin (कोण)

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

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