Saya memiliki objek dalam permainan saya yang bergerak lebih cepat pada 45 derajat kemudian pada 90 derajat.
Setiap objek memiliki
- Titik (x, y) posisi
- Arah Vector2D (x, y)
- Kecepatan int
Dan yang saya lakukan saat pembaruan adalah posisi baru dihitung sebagai:
position.x += direction.x * speed
position.y += direction.y * speed
Bagaimana saya memperbaikinya? Saya ingin bergerak dengan kecepatan yang sama di sudut mana pun.
Jawaban:
Ini dapat dijelaskan dengan Teorema Pythagoras , yang merupakan rumus berikut:
Dalam kasus Anda, saat bergerak ke kanan, Anda menggunakan (x: 1, y: 0) yang memberi kami
Saat bergerak ke atas dan ke kanan, Anda menggunakan (x: 1, y: 1) yang memberi kami
Jadi seperti yang Anda lihat, panjang diagonal lebih panjang dari panjang pada sumbu kardinal.
Seperti yang disebutkan orang lain, Anda harus menormalkan vektor arah Anda. Jika Anda menggunakan XNA, dilakukan seperti ini:
sumber
Normalisasi vektor arah Anda sebelum digunakan.
Seperti yang dijelaskan oleh MindWorX, ini dapat dipahami dengan mudah, jika Anda khawatir tentang vektor arah Anda mungkin memberi Anda kesedihan, pastikan mereka vektor satuan (besaran / panjang 1).
Jika dinormalkan:
sumber
Bagaimana Anda menghitung arah Anda? Jika 45 derajat
(1,1)
, maka itu pasti akan lebih cepat dari 90 derajat(1,0)
.Saya sarankan Anda menggunakan sesuatu seperti ini:
Untuk mendapatkan sudut dalam radian, Anda harus melipatgandakan gelar Anda dengan
PI / 180
atau bahkan lebih baik, gunakanMathHelper
. Misalnya.sumber
Jason,
Daripada memiliki tiga atribut objek,
seringkali lebih mudah untuk menggabungkan arah dan kecepatan menjadi vektor kecepatan. Maka Anda hanya memiliki dua atribut,
Memperbarui posisi
Saat Anda perlu memperbarui posisi objek, sesederhana:
di mana
Δt
delta waktu Anda - atau perbedaan waktu - atau langkah waktu.Memperbarui posisi dan kecepatan
Cara menangani akselerasi (seperti dari gravitasi) juga sangat mudah. Jika Anda memiliki vektor percepatan, Anda dapat memperbarui kecepatan dan posisi bersama-sama seperti ini:
(Ini pada dasarnya adalah rumus s = vt + ½at² dari Fisika 101.)
Menerapkan kecepatan
Jika Anda ingin menerapkan kecepatan tertentu dalam beberapa arah yang dinormalkan, Anda dapat mengatur kecepatan seperti ini:
Turunkan kecepatan
Dan jika Anda perlu melakukan sebaliknya - menurunkan kecepatan dan arah dari vektor kecepatan yang diberikan - Anda cukup menggunakan teorema Pythagoras atau
.Length()
metode:Dan begitu kecepatan diketahui, arah yang dinormalisasi dapat dihitung dengan membagi kecepatan dengan kecepatan (berhati-hati untuk menghindari membagi dengan nol):
sumber