Pertahanan menara 2D - Peluru ke musuh


14

Saya mencoba mencari solusi yang bagus agar peluru dapat mengenai musuh. Permainan ini adalah pertahanan menara 2D, menara ini seharusnya menembakkan peluru dan mengenai musuh yang dijamin.

Saya mencoba solusi ini - http://blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-1/

Tautan yang disebutkan untuk mengurangi asal peluru dan musuh juga (pengurangan vektor). Saya mencobanya tetapi sebutir peluru mengikuti musuh.

float diffX = enemy.position.x - position.x;
float diffY = enemy.position.y - position.y;

velocity.x = diffX;
velocity.y = diffY;

position.add(velocity.x * deltaTime, velocity.y * deltaTime);

Saya kenal vektor tetapi tidak yakin langkah apa (operasi matematika vektor) yang harus dilakukan untuk mendapatkan solusi ini.


Jawaban:


11

Alasan Anda sempurna: gunakan vektor untuk berpindah dari posisi saya ke target saya. Ini adalah tujuan dari vektor ; Anda lupa kecepatannya !

Kecepatan adalah vektor: kecepatan dan arah. Namun, jika Anda lupa untuk menormalkan vektor perbedaan dan mengalikannya dengan kecepatan peluru (skalar), Anda pada dasarnya mengatakan bahwa jika Anda dekat dengan target (vektor perbedaan kecil) peluru melambat ; sedangkan jika Anda jauh, kecepatan peluru lebih besar.

Ini adalah masalah mendasar: Anda perlu menghitung arah dan besarnya vektor.


Terima kasih telah membantu. Saya mencoba menggunakan skalar setelah saya menghitung selisih vektor, kelihatannya berhasil tetapi tampilannya tidak bagus. Saya mencoba melihat apakah saya menghitung selisih vektor, menormalkan, lalu skalar kecepatannya. Terlihat lebih baik sekarang. Ya, saya pikir saya perlu rudal pengarah di game ini beberapa waktu kemudian. Terima kasih lagi.
Tashu

1
Apakah jawaban ini tidak masuk akal bagi orang lain?
BlueRaja - Danny Pflughoeft

@ Flxll: Ok, saya pikir saya mengerti apa yang ingin Anda katakan. Ada banyak masalah yang tidak terkait dengan jawaban di awal / akhir, dan saya juga bingung dengan bahasa Inggris Anda (yang saya sadari mungkin bukan salah Anda) . Saya telah mengirimkan saran edit untuk membersihkan jawaban ini.
BlueRaja - Danny Pflughoeft

@BlueRaja - Danny Pflughoeft terima kasih atas upaya Anda!
FxIII

7

Jika target bergerak ke arah yang stabil dengan kecepatan yang stabil, dan jalur peluru Anda berada di garis lurus dengan kecepatan yang stabil, Anda dapat menggunakan persamaan kuadrat untuk memprediksi tempat yang tepat mereka akan berpotongan dan mengarahkan senjata menara Anda di tempat itu .

Karena ini adalah kepastian bahwa peluru akan mengenai sasarannya, dan Anda dapat menghitung waktu yang tepat untuk menembak, tidak ada deteksi tabrakan yang diperlukan, cukup tembak pistol, tunggu rentang waktu yang dihitung, daftarkan hit.

Berikut adalah kode semu untuk persamaan kuadrat:

Vector totarget =  target.position - tower.position;

float a = Vector.Dot(target.velocity, target.velocity) - (bullet.velocity * bullet.velocity);
float b = 2 * Vector.Dot(target.velocity, totarget);
float c = Vector.Dot(totarget, totarget);

float p = -b / (2 * a);
float q = (float)Math.Sqrt((b * b) - 4 * a * c) / (2 * a);

float t1 = p - q;
float t2 = p + q;
float t;

if (t1 > t2 && t2 > 0)
{
    t = t2;
}
else
{
    t = t1;
}

Vector aimSpot = target.position + target.velocity * t;
Vector bulletPath = aimSpot - tower.position;
float timeToImpact = bulletPath.Length() / bullet.speed;//speed must be in units per second

Terima kasih untuk kode semu, saya akan memeriksanya untuk melihat bagaimana persamaan kuadrat bekerja dengan situasi ini. Terima kasih lagi.
Tashu

Masalahnya adalah bahwa pengguna dapat bergerak ke arah peluru dan tepat sebelum memukul, ia bisa lolos dari jejak peluru. Dalam hal ini, apakah solusi ini cukup baik?
Martin.

Tidak, sebagaimana memenuhi syarat dalam kalimat pertama. Ini bukan untuk semua game tetapi untuk game di mana target bergerak dengan kecepatan konstan saja. Kecepatan konstan berarti arah dan kecepatan. Misalnya, game gim gaya Defense Grid dapat menggunakan pendekatan ini.
Steve H

3

Anda perlu 'memprediksi' posisi objek pada saat peluru akan mencapainya. Anda dapat melakukan ini dengan menggunakan objek kecepatan / kecepatan (mudah-mudahan itu konstan;)) dan itu adalah vektor arah.

Saya tidak yakin apa rumus tepatnya di atas kepala saya, tetapi saya pikir itu adalah sesuatu seperti ini:

NewPosition = OldPosition + (Kecepatan * DirectionVector);

Jika Anda memiliki jalur yang ditetapkan, Anda harus menghitung ulang saat objek berubah arah. Gunakan NewPosisi ini sebagai musuh Anda. Vektor posisi dan peluru harus mengenai objek tanpa 'efek homing'. Homing terjadi karena fakta bahwa objek musuh telah bergerak sejak vektor asli dihitung, ia hanya bisa mengejar ketika sebuah objek bergerak dalam satu arah cukup lama.

Semoga ini membantu :)


3
Atau Anda dapat menipu dan menekan secara otomatis, lalu gunakan sprite bergerak sebagai umpan balik visual. Atau tembak peluru Anda di ketinggian 50.000 mph.
Jonathan Connell

1

Anda dapat menghindari menggunakan akar kuadrat & kekuatan 2.

var distX:Float = target.x - x;
var distY:Float = target.y - y;
_velX = distX / timeTravel;
_velY = distY / timeTravel;

// Take out if you want a nice slow down as approaches effect.  
timeTravel -= 1.0; // make sure u have a positive timeTravel.
x += _velX;
y += _velY;

if (distX < 0)
    distX = -distX;

if (distY < 0)
    distY = -distY;

if (_velX < 0)
    _velX = -_velX;

if (_velY < 0)
    _velY = -_velY;

// Should both snap @ the same time.
if (distX < _velX)
x = target.x; // snap & see what happens.

if (distY < _velY)
y = target.y; // snap & see what happens.

// TODO: call your onHitTarget here ...
// Hopefully this shall provide 10x the performance 
// of using Math.sqrt and all the extra multiplications.

Semuanya ditulis dari memori. Ngomong-ngomong, gunakan elemen-elemen yang berfungsi - ujilah baris demi baris jika Anda baru dalam hal ini Float adalah Angka dalam AS3.

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.