ฉันจะทำให้เอนทิตีย้ายไปในทิศทางได้อย่างไร?


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 ได้เท่าใดโดยการทำบาปหรือ cos ของมุมและคูณด้วยความเร็ว เพราะ...

 sin(a) = x / speed

ดังนั้น:

 x = speed * sin(a)

และ:

cos(a) = y / speed

ดังนั้น:

y = speed * cos(a)

ในตัวอย่างของคุณmoveForward(90)จะให้ผลผลิตspeed * sin(90)หรือspeed * 1ในทิศทาง x และspeed * cos(90)หรือ0ในทิศทาง y (ควรเลื่อนไปทางขวาตามที่คุณระบุ) ที่ควรให้คุณเริ่มต้นในแง่พื้นฐาน

ทำให้เป็นเรื่องทั่วไป:

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

อ่า, thats มากง่ายกว่าที่ฉันคิดขอบคุณมาก :)
ฌอนป่า

ฉันค่อนข้างแน่ใจว่าคุณต้องเปลี่ยน y และ x ของ sin (alpha) = b / c
jcora

@ มันตรงกับรูปวาดที่ฉันทำ SOH-CAH-TOA บาปอยู่ตรงข้ามกับด้านตรงข้ามมุมฉากซึ่งในการวาดคือ x / speed ถ้ามุมอยู่อีกด้านหนึ่งของสามเหลี่ยมมันจะกลับด้าน (และถ้ามันมีประโยชน์มากกว่าสำหรับวัตถุประสงค์ของการออกแบบเกมฉันสามารถเปลี่ยนมันได้
Kevin DiTraglia

ฉันอยู่ในโทรศัพท์มือถือของฉันดังนั้นจึงเป็นการยากที่จะตีความสิ่งนั้น ฉันแค่อ่านสูตรต่าง ๆ ...
jcora

นั่นคือสามเหลี่ยมที่สวยงามจริงๆที่คุณไปถึงที่นั่น +1
Bro Kevin D.

3

คำตอบอื่น ๆ ผิดในขณะนี้หากต้องการเคลื่อนที่ไปตามระนาบอย่างถูกต้องตามการหมุนคุณต้องปฏิบัติดังนี้

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

อย่างไรก็ตามฉันขอแนะนำให้สร้างตัวแปรสำหรับ cos / sin ที่คุณอัปเดตเฉพาะเมื่อการหมุนเปลี่ยนไปดังนั้นคุณจะไม่คำนวณมัน 4 ครั้งเห็บ

strafeSpeed ​​จะเคลื่อนที่จากทางด้านข้างไปข้างหน้า forwardSpeed ​​สำหรับการเคลื่อนที่ไปข้างหน้าตามการหมุนของคุณ

แก้ไข: tesselode ทำสิ่งเดียวกันยกเว้นเขาไม่มีการเคลื่อนไหวแบบเคียงข้างกัน


2

คุณพูดว่า ticks ที่อัปเดตดังนั้นฉันสมมติว่าคุณไม่มีอัตราเฟรมที่เปลี่ยนแปลง ถ้าเป็นเช่นนั้น:

x + = speed * math.cos (มุม)

y + = speed * math.sin (มุม)

หากคุณใช้อัตราเฟรมที่ผันแปรคุณจะต้องคูณด้วยเวลาเดลต้าเช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.