Làm thế nào để tôi thực hiện một thực thể di chuyển theo một hướng?


10

Tôi có một Entityví dụ được cập nhật mỗi tích tắc trò chơi. Chúng ta hãy giả sử rằng thực thể di chuyển về phía trước liên tục. Tôi muốn có thể cung cấp góc của thực thể cho một chức năng khiến nó di chuyển theo hướng đó:

moveForward(90);nên làm cho họ di chuyển sang phải. Nếu tôi tuyên bố vòng quay của mình là toàn cầu int, thì hãy làm

moveForward(rotation);
rotation++;

sẽ làm cho nó theo dõi một vòng tròn nhỏ với chuyển động của nó.

Tôi có thể làm cái này như thế nào? Tôi giả sử điều này liên quan đến toán học vectơ; Tôi không biết gì cả, vì vậy một lời giải thích ngắn gọn sẽ rất hay.

Câu trả lời:


15

Theo nghĩa đơn giản nhất, bạn có một cái gì đó như thế này.

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

Tuy nhiên, tốc độ của kẻ địch rất nhanh và bạn có thể xác định được chúng nên di chuyển theo hướng x bao nhiêu và chúng di chuyển theo hướng y bằng cách lấy sin hoặc cos của góc và nhân với tốc độ. Bởi vì...

 sin(a) = x / speed

Vì thế:

 x = speed * sin(a)

Và:

cos(a) = y / speed

Vì thế:

y = speed * cos(a)

Trong ví dụ của bạn moveForward(90)sẽ mang lại speed * sin(90)hoặc speed * 1theo hướng x và speed * cos(90)hoặc 0theo hướng y (Nó sẽ di chuyển sang bên phải như bạn đã chỉ định). Điều đó sẽ giúp bạn bắt đầu theo nghĩa cơ bản.

Làm cho nó chung chung:

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

Ahh, điều đó đơn giản hơn nhiều so với tôi tưởng tượng, cảm ơn rất nhiều :)
Shaun Wild

Tôi khá chắc chắn rằng bạn cần phải chuyển đổi y và x. tội lỗi (alpha) = b / c.
jcora

@Bane nó phù hợp với bản vẽ tôi đã tạo ra SOH-CAH-TOA, tội lỗi ngược lại với hypotenuse mà trong bản vẽ là x / speed. Nếu góc nằm ở phía bên kia của tam giác thì nó sẽ bị đảo ngược (và nếu điều đó thực tế hơn cho mục đích thiết kế trò chơi, tôi có thể thay đổi nó, nhưng tôi cảm thấy tất cả đều tùy ý).
Kevin DiTraglia

Tôi đang sử dụng điện thoại di động nên rất khó để giải thích điều đó. Tôi chỉ lướt qua các công thức ...
jcora

Đó là một tam giác thực sự tốt đẹp mà bạn có ở đó. +1
Bro Kevin D.

3

Câu trả lời khác là sai cho đến bây giờ, để di chuyển chính xác dọc theo một mặt phẳng dựa trên một vòng quay bạn làm như sau:

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

Tuy nhiên, tôi khuyên bạn nên tạo một biến cho cos / sin mà bạn chỉ cập nhật khi xoay thay đổi để bạn không tính toán nó 4 lần một tích tắc.

StrafeSpeed ​​sẽ di chuyển từ bên này sang bên kia, phía trước Tốc độ để di chuyển về phía trước dọc theo vòng quay của bạn.

chỉnh sửa: tesselode làm điều tương tự ngoại trừ anh ta không có chuyển động từ bên này sang bên kia.


2

Bạn nói rằng cập nhật tick, vì vậy tôi cho rằng bạn không có tốc độ khung hình thay đổi. Nếu vậy:

x + = speed * math.cos (góc)

y + = speed * math.sin (góc)

Nếu bạn đang sử dụng tốc độ khung hình thay đổi, bạn cũng cần nhân với thời gian delta.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.