Pertama-tama, saya hanya menulis logika permainan saya sendiri sebentar, jadi saya minta maaf jika ini mungkin terlihat lurus ke depan.
Saya telah membaca banyak tentang quad tree dan grid collision detection. Saya mengerti logika - pada dasarnya tidak memeriksa tabrakan kecuali objek dekat pada dasarnya. Namun tidak pernah disebutkan bagaimana sebenarnya melaksanakan ini.
Saya memiliki beberapa metode kemungkinan di kepala saya tetapi saya tidak yakin mana yang terbaik
Tes tabrakan umum - tanpa optimasi
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
tetangga toko (metode 1) Tetapi bagaimana jika kita ingin mengoptimalkan tabrakan hanya memeriksa objek yang dekat. Apakah kita masih menjalankan semua objek, atau kita membuat array dengan objek dekat untuk memeriksa?
var objects:Array = new Array();
var neighbours:Array = new Array();
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.isNear(objectB){
neighbours.push(objectA, objectB);
}
}
}
//somewhere else
for(i:int = 0; i < neighbours.length; i++){
//only check neighbours
for(j:int = i + 1; j < neighbours.length; j++){
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
}
loop semua objek tetapi hanya memeriksa tetangga untuk tabrakan (metode 3) Kemungkinan lain adalah bahwa kita masih mengulangi semuanya tetapi memeriksa apakah objek dekat sebelum menguji tabrakan.
for(var i:int = 0; i < objects.length; i++){
//find object A
var objectA = objects[i];
for(var j:int = i + 1; j < objects.length; j++){
//find object B
var objectB = objects[j];
if(objectA.isNear(objectB){
//they are near - check collision!
if(objectA.collidesWith(objectB){
//handle collision logic
}
}
}
}
Menyimpan objek dalam data ubin (metode 3) Menggunakan sistem berbasis ubin memungkinkan opsi lain; Simpan objek yang ada di ubin tertentu dalam data ubin itu sendiri. Periksa untuk melihat di mana ubin objek adalah ubin di sekitarnya berisi objek yang bisa bertabrakan:
var ObjectA;
for(var i:int = 0; i < 4; i ++){
//check 4 surrounding tiles from object A
if(Object.currentTile + surroundingTile[i] CONTAINS collidable object){
//check collision!
if(objectA.collidesWith(surroundingTile.object){
//handle collision logic
}
}
}
Saya selalu mencoba melihat dunia nyata sebagai contoh. Jika saya ingin membandingkan item dengan warna yang sama, akan tampak tidak masuk akal untuk memeriksa setiap item meskipun tidak cocok dengan warna (Metode 2, periksa setiap item). Saya mungkin akan mengumpulkan barang-barang dengan warna yang sama (objek yang saling berdekatan) dan mengeceknya (metode 1), daripada memeriksa semuanya.
Ini bukan perbandingan yang tepat karena item dalam pemeriksaan tabrakan terus bergerak sehingga pesanan jadi tercampur. Itu yang membingungkan saya.
Apakah akan lebih efisien untuk memeriksa setiap item, sehingga menghilangkan tekanan terus menghasilkan array tetangga.
Atau lebih efisien untuk menemukan tetangga sehingga tidak harus melewati begitu banyak objek untuk memeriksa tabrakan?
Terus mengubah data pada setiap ubin juga tampaknya sangat intensif, jadi saya tidak yakin apakah itu ide yang bagus ..
Saya telah memikirkan permainan menara pertahanan di mana menara perlu mendeteksi objek jika benda-benda berada dalam jangkauan sebelum menembaknya. Dan sepertinya konyol untuk memeriksa semua item sementara pada beberapa waktu tidak akan ada benda di dekat sama sekali.
Saya minta maaf untuk posting lama, selalu mengalami kesulitan menjelaskan sendiri!