Saya membuat game luar angkasa sederhana dalam JavaScript, tapi sekarang saya sudah menabrak vektor.
Tampilan game top-down pada grid 2d. Ketika pengguna mengklik pada grid, kapal ruang angkasa akan terbang ke tempat itu.
Jadi, jika saya memiliki dua set poin:
{ x : 100.2, y : 100.6 }; // the ship
{ x : 20.5, y : 55.95 }; // the clicked coordinates
Jika loop game berdetak pada 60 iterasi per detik, dan kecepatan kapal yang diinginkan adalah 0,05 poin per tick (3 poin per detik), bagaimana cara menghitung set koordinat baru untuk kapal untuk setiap centang dari loop game?
ps Saya tidak ingin menghitung inersia, atau beberapa vektor yang mempengaruhi kapal, saya hanya ingin kapal menghentikan apa pun yang dilakukannya (yaitu terbang satu arah) dan pindah ke koordinat yang diklik dengan kecepatan statis.
javascript
vector
coordinates
Stephen
sumber
sumber
goal_dist
di Andaif
kondisi?LERP - Interpolasi Linier
Saya memberikan jawaban ini untuk masalah yang sama beberapa hari yang lalu, tetapi di sini kita mulai:
Interpolasi Linear adalah fungsi yang memberi Anda angka di antara dua angka, berdasarkan progresnya. Anda sebenarnya bisa, mendapatkan poin antara dua poin.
The Great Formula - Cara menghitungnya
Formula LERP umum diberikan oleh
pu = p0 + (p1 - p0) * u
. Dimana:Cara mendapatkan persentase
Anda mungkin bertanya-tanya, "Bagaimana saya bisa mendapatkan persentase ini !?" Jangan khawatir. Seperti ini: Berapa banyak waktu yang dibutuhkan untuk melakukan perjalanan untuk memulai vektor untuk menyelesaikan? Oke, bagi dengan waktu yang sudah berlalu. Ini akan memberi Anda persentase.
Lihat, seperti ini:
percentage = currentTime / finalTime;
Menghitung Vektor
Untuk mendapatkan vektor yang dihasilkan, yang perlu Anda lakukan adalah menerapkan rumus dua kali, satu untuk komponen X dan satu untuk komponen Y. Sesuatu seperti ini:
Menghitung waktu variasi
Anda mungkin ingin memiliki poin Anda untuk bepergian dengan kecepatan 0,5 poin, ya? Jadi katakanlah, jarak yang lebih jauh akan ditempuh dalam waktu yang lebih lama.
Anda dapat melakukannya sebagai berikut:
Dapatkan jarak panjang Untuk itu, Anda akan membutuhkan dua hal. Dapatkan vektor jarak, lalu ubah dalam nilai panjang.
distancevec = final - start;
distance = distancevec.length();
Saya harap Anda tahu vektor matematika. Jika tidak, Anda dapat menghitung panjang vektor dengan rumus ini
d = sqrt(pow(v.x, 2) + pow(v.y, 2));
.Dapatkan waktu yang dibutuhkan dan perbarui waktu akhir. Yang ini mudah. Karena Anda ingin setiap kutu Anda mendapatkan panjang 0,5, kita hanya perlu membagi dan mendapatkan berapa banyak kutu yang kita dapatkan.
finalTime = distance / 0.5f;
Selesai
PEMBERITAHUAN: Mungkin, ini mungkin bukan kecepatan yang dimaksudkan untuk Anda, tetapi ini adalah haknya. sehingga Anda memiliki gerakan linier, bahkan pada gerakan diagonal. Jika Anda ingin melakukan x + = 0,5f, y + = 0,5f, maka baca buku matematika vektor dan periksa kembali rencana Anda.
sumber
progress
sebagaimana dinyatakan dalam jawaban ini, itu harus dalam0..1
kisaran. Lakukan saja:progressLeft = 1.0 - progress;
Ini dapat dilakukan dengan menghitung normal arah dan kemudian menghitung posisi saat ini melalui persamaan parametrik
Di mana t adalah waktu yang berlalu sejak kapal mulai bepergian ke arah yang diinginkan. Anda juga dapat melakukan ini per pembaruan melalui
Dan Anda hanya menghitung ini di setiap frame / fisika / dll. memperbarui hingga kapal mencapai tujuannya.
sumber