Bagaimana cara membuat entitas bergerak ke suatu arah?

11

Saya memiliki Entitycontoh yang diperbarui setiap centang game. Anggap saja entitas bergerak maju terus-menerus. Saya ingin dapat memberikan sudut entitas ke fungsi yang membuatnya bergerak ke arah itu:

moveForward(90);harus membuat mereka bergerak ke kanan. Jika saya menyatakan rotasi saya sebagai global int, maka lakukan

moveForward(rotation);
rotation++;

akan membuatnya melacak lingkaran kecil dengan gerakannya.

Bagaimana saya bisa melakukan ini? Saya menganggap ini melibatkan matematika vektor; Saya tidak tahu, jadi penjelasan singkat akan menyenangkan.

Shaun Wild
sumber

Jawaban:

16

Nah dalam arti paling sederhana Anda memiliki sesuatu seperti ini.

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

Namun kecepatannya cepat, adalah musuh, dan Anda dapat menentukan berapa banyak mereka harus bergerak ke arah x dan berapa banyak mereka bergerak ke arah y dengan mengambil dosa atau cos sudut dan mengalikan dengan kecepatan. Karena...

 sin(a) = x / speed

Begitu:

 x = speed * sin(a)

Dan:

cos(a) = y / speed

Begitu:

y = speed * cos(a)

Dalam contoh Anda moveForward(90)akan menghasilkan speed * sin(90)atau speed * 1dalam arah x dan speed * cos(90)atau 0di arah y (Ini harus bergerak ke kanan seperti yang Anda tentukan). Itu seharusnya membantu Anda memulai dalam pengertian dasar.

Menjadikannya umum:

moveForward(float angle)
{
    x += speed * sin(angle);
    y += speed * cos(angle);
}
Kevin DiTraglia
sumber
Ahh, itu jauh lebih sederhana dari yang saya bayangkan, terima kasih banyak :)
Shaun Wild
Saya cukup yakin Anda perlu mengganti y dan x. sin (alpha) = b / c.
jcora
@ Ball cocok dengan gambar yang saya buat SOH-CAH-TOA, dosa bertolak belakang dengan sisi miring yang dalam gambar adalah x / kecepatan. Jika sudut berada di sisi lain segitiga itu akan terbalik (dan jika itu lebih praktis untuk tujuan desain game saya bisa mengubahnya, tapi saya merasa semuanya sewenang-wenang).
Kevin DiTraglia
Saya menggunakan ponsel saya sehingga cukup sulit untuk menafsirkannya. Saya baru saja membaca formula ...
jcora
Itu segitiga yang sangat bagus di sana. +1
Bro Kevin D.
3

Jawaban lain salah seperti yang sekarang, untuk bergerak dengan benar di sepanjang pesawat berdasarkan rotasi Anda melakukan hal berikut:

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

Namun saya akan merekomendasikan membuat variabel untuk cos / sin yang Anda perbarui hanya ketika rotasi berubah sehingga Anda tidak menghitungnya 4 kali centang.

StrafeSpeed ​​akan bergerak dari sisi ke sisi, forwardSpeed ​​untuk bergerak maju sepanjang rotasi Anda.

sunting: tesselode melakukan hal yang sama kecuali dia tidak memiliki gerakan dari sisi ke sisi.

bit bit
sumber
2

Anda mengatakan perbarui kutu, jadi saya berasumsi Anda tidak memiliki frame rate variabel. Jika begitu:

x + = kecepatan * math.cos (sudut)

y + = kecepatan * math.sin (sudut)

Jika Anda menggunakan frame rate variabel, Anda perlu mengalikannya dengan waktu delta juga.

tesselode
sumber