Bagaimana mempertimbangkan gravitasi saat memindahkan AI


9

Saya membuat game 2D. Saat ini ada helikopter terbang di sekitar, dikendalikan oleh pemain. Itu dikendalikan menggunakan tombol panah: ATAS, KIRI dan KANAN.

Kecepatan di sepanjang sumbu y adalah dy, dan kecepatan di sepanjang sumbu x adalah dx.

Fisika itu adalah sebagai berikut:

Setiap kali UP tidak ditekan , dyakselerasi dalam akselerasi konstan, tanpa batas ke bawah. (Gravitasi). dxtetap dalam nilai saat ini.

Ketika UP ditekan , dyakselerasi dalam akselerasi konstan dari apa pun itu, hingga 4 (ke atas, hingga mencapai kecepatan 4). dxtetap dalam nilai saat ini.

Ketika KIRI ditekan , dxakselerasi dalam akselerasi konstan, dari apa pun itu saat ini, hingga -4 .

Ketika KANAN ditekan , dx berakselerasi dalam akselerasi konstan, dari apa pun saat ini, hingga 4 .

(Ketika KIRI atau KANAN ditekan dan UP tidak ditekan secara bersamaan, seperti yang saya katakan: dysemakin menjadi lebih kecil dan lebih kecil, karena gravitasi mempengaruhi helikopter)

Semua ini membuat helikopter sering mengikuti lengkungan di udara, bukan garis lurus.

Ini menciptakan fisika yang tampaknya cukup realistis.

Pertanyaanku adalah:

Helikopter lawan, AI, harus bergerak menggunakan sistem fisika yang sama.

Katakanlah AI ingin mendapatkan dari tempatnya sekarang, ke titik B.

masukkan deskripsi gambar di sini

Jika tidak ada gravitasi dan tidak ada akselerasi bertahap dalam permainan, itu akan mudah. Saya hanya akan menggambar vektor dari posisi AI ke titik B, dan membuat AI mengikutinya.

Tetapi karena ada gravitasi dan percepatan bertahap, AI tidak pernah bisa bergerak dalam garis lurus (hampir). apa yang akan menjadi cara terbaik untuk membuat AI menuju ke titik B, seefisien mungkin?

Bagaimana saya bisa mempertimbangkan gravitasi ketika menggerakkan AI menuju tujuan tertentu?

(Jika lebih mudah dijelaskan, harap pertimbangkan titik B berada pada level yang sama pada sumbu y seperti AI, dan tidak diagonal untuk itu.)

Terima kasih


Bisakah Anda menonaktifkan fisika di AI saat sedang bergerak? Jika demikian, maka Anda dapat menonaktifkannya saat bergerak ke titik, dan mengaktifkannya ketika mencapai titik tersebut.
Zhafur

@Zhafur Ini akan membuat gerakan AI tampak tidak realistis, atau setidaknya berbeda dari bagaimana gerakan pemain tampak. Saya ingin gerakan AI terlihat sama dengan gerakan pemain.
user3150201

Jawaban:


4

tl; dr:

TimeToStop.x = CurrentSpeed.x / Accelaration.x;

if (TimeToStop.x * CurrentSpeed.x >= 1.99 * DistanceFromTarget.x)
    slow_down_x(); // CurrentSpeed += Acc.x * direction;
else
    speed_up_towards_target_x(); // CurrentSpeed += Acc.x * direction;

Sama dengan y. Ingat untuk mengikat kecepatan jadi itu antara nol dan kecepatan maksimal. Jika musuh memiliki kecepatan yang sangat lambat di beberapa titik dan ia mencoba untuk berhenti, ia mungkin mulai bergerak ke arah yang berlawanan. Jangan izinkan. Hentikan jika itu melambat dan kecepatannya di bawah 1 * Acc.

Versi panjang: Jika tidak ada hambatan, gerakan pada sumbu y benar-benar tidak relevan dengan (dan tidak mempengaruhi) gerakan pada sumbu x. Jadi pertanyaan yang Anda uraikan dapat dipecah menjadi dua pertanyaan terpisah.

  1. Pindah ke sana dengan x-Axis
  2. Dan pindah ke sana dengan y-Axis.

CS.x& CS.yadalah kecepatan kita saat ini pada sumbu x dan y.

TS.x& TS.yApakah waktu yang Anda perlukan hanya berhenti secara vertikal atau horizontal mengingat kecepatan Anda saat ini di sumbu yang relevan.

D.x& D.yadalah jarak pada setiap sumbu.

tl; dr: Anda terus berakselerasi (jika mungkin [kecuali Anda mencapai kecepatan tertinggi]) pada sumbu x hingga Anda mencapai tempat di mana kondisi berikut ini benar:

if (TS.x * CS.x >= 1.99 * D.x) hit_the_breaks_on_x();

Sama dengan y.


2

Salah satu pendekatan yang saya gunakan untuk masalah serupa adalah pertama-tama menggambar vektor ke target, kemudian membandingkannya dengan arah kecepatan saat ini.

Jadi, ambil sudut yang ditandatangani antara vektor kecepatan dan vektor target dan terapkan dorongan relatif ke ukuran vektor.

Jadi, jika sudut a antara vektor kecepatan merah dan vektor target hijau negatif maka terapkan dorongan positif, jika tidak gunakan dorongan dan biarkan gravitasi mengatasinya.masukkan deskripsi gambar di sini

Perhatikan bahwa Anda harus memperlakukan keempat kuadran di mana target mungkin berbeda (seolah-olah target berada di sudut kiri atas, sudut positif akan membutuhkan penerapan dorongan).

Juga, pastikan untuk menerapkan jumlah daya dorong relatif terhadap penyimpangan dari kecepatan target.

Secara teknis ini tidak memperhitungkan gravitasi, itu mengimbangi keadaan saat ini dan itu berarti helikopter AI mungkin tidak terbang dalam garis lurus ke target tetapi akan sedikit goyah. Ini mungkin atau mungkin tidak berfungsi untuk game Anda.


1
Terima kasih. Beberapa pertanyaan tentang ini: 1- "... terapkan dorongan relatif ke ukuran vektor " . Apakah maksud Anda, "ukuran sudut " ? 2- Dengan 'sudut yang ditandatangani', maksud Anda positif atau negatif - benar? Jika demikian, maka dari sudut positif jika di atas garis coklat, dan negatif jika di bawah garis coklat. Baik? 3 - Jika saya mengerti dengan benar, yang Anda maksud adalah: Setiap frame, dapatkan sudut antara vektor kecepatan saat ini dan vektor saat ini ke target. Kemudian tambahkan / kurangi dari dx dan celupkan sesuai. Apakah ini benar?
user3150201

@ user3150201 Ya pada pertanyaan sudut. Ya pada pertanyaan yang ditandatangani / tidak ditandatangani, atan2 dapat memberi Anda sudut yang ditandatangani antara dua vektor. Sepertinya Anda mengerti maksud saya, minta maaf jika saya tidak jelas.
bornander

1

Anda bisa menghitung ulang pergerakan setiap frame X. Dengan asumsi Anda tidak menempatkan terlalu banyak frame di antara, tetapi cukup sehingga tidak mempengaruhi kinerja, gravitasi pada helikopter seharusnya tidak cukup kuat untuk benar-benar melihat lintasan berubah. Ditambah lagi, saya pikir seorang pemain mungkin bisa bergerak dengan cara yang sama, beradaptasi dengan gravitasi saat bergerak dan tidak merencanakannya.

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.