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.

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);
}

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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.