Her şeyden önce, sadece kısa bir süre için kendi oyun mantığımı yazıyorum, bu yüzden bu doğru görünüyorsa özür dilerim.
Dörtlü ağaçlar ve ızgara tabanlı çarpışma tespiti hakkında çok şey okudum. Mantık anlıyorum - temelde nesneler yakın olmadığı sürece temelde çarpışma kontrolü yapmayın. Ancak bunun gerçekte nasıl yürütüldüğünden asla bahsedilmez.
Kafamda birkaç olası yöntem var ama hangisinin en iyisi olduğundan emin değilim
Genel çarpışma testi - optimizasyon yok
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
}
}
komşuları depola (yöntem 1) Ancak, çarpışmaları yalnızca yakınlardaki nesneleri denetlemek üzere en iyi duruma getirmek istiyorsak. Hala tüm nesneler üzerinde mi çalışıyoruz, yoksa kontrol edilecek yakın nesnelerle bir dizi oluşturuyor muyuz?
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
}
}
}
tüm nesneleri döngüye sokun, ancak sadece komşuları çarpışma açısından kontrol edin (yöntem 3) Diğer olasılık, yine de her şeyi döngüden geçirmemiz, ancak çarpışmayı test etmeden önce nesnelerin yakın olup olmadığını kontrol etmemizdir.
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
}
}
}
}
Nesneleri döşeme verilerinde saklama (yöntem 3) Döşeme tabanlı bir sistem kullanmak başka bir seçeneğe izin verir; Döşeme verilerindeki belirli bir döşemede bulunan nesneleri saklayın. Nesnenin etrafındaki döşemenin hangi döşemede olduğunu, çarpışabileceği nesneleri içerdiğini kontrol edin:
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
}
}
}
Her zaman gerçek dünyaya örnek olarak bakmaya çalışıyorum. Öğeleri aynı renkle karşılaştırmak istersem, renkle eşleşmese bile tüm öğelerin tümünü kontrol etmek mantıksız görünecektir (Yöntem 2, her öğeyi kontrol edin). Muhtemelen her şeyi kontrol etmek yerine aynı renkteki öğeleri (birbirine yakın nesneler) toplar ve bunları (yöntem 1) kontrol ederim.
Çarpışma kontrolündeki öğeler sürekli hareket ettiği için sipariş karışık hale geldiği için bu uygun bir karşılaştırma değildir. Beni şaşırtan şey bu.
Her öğeyi kontrol etmek daha verimli olur mu, böylece bir dizi komşu üretmeye devam etme zorluğunu ortadan kaldırır mıydı.
Yoksa çarpışmayı kontrol etmek için çok fazla nesne arasında dolaşmak zorunda kalmadan komşuları bulmak daha mı verimli?
Her kiremit veri değiştirmek de çok yoğun görünüyor, bu yüzden bu iyi bir fikir olup olmadığından emin değilim ..
Kulenin nesneleri vurmadan önce menzil içinde olup olmadığını tespit etmesi gereken bir kule savunma oyunu düşünüyordum. Ve tüm öğeleri kontrol etmek aptalca görünürken, bazı zamanlarda yakınlarda herhangi bir nesne olmayacaktır.
Uzun yazı için özür diliyorum, her zaman kendimi açıklamakta zorlanıyorum!