首先,我只是在短时间内编写了自己的游戏逻辑,所以如果这看起来很简单,我深表歉意。
我已经阅读了很多有关四叉树和基于网格的碰撞检测的信息。我了解逻辑-除非物体基本靠近,否则基本上不检查碰撞。但从未提及如何实际执行此操作。
我脑子里有几种可能的方法,但不确定哪种方法最好
通用碰撞测试-没有优化
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
}
}
存储邻居(方法1) 但是,如果我们要优化冲突以仅检查附近的对象该怎么办。我们是否仍然遍历所有对象,还是创建带有近对象以进行检查的数组?
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
}
}
}
循环所有对象,但仅检查邻居是否有碰撞(方法3) 。另一个可能性是,我们仍会遍历所有对象,但在测试碰撞之前检查对象是否在附近。
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
}
}
}
}
在图块数据中存储对象(方法3) 使用基于图块的系统允许使用其他选项;将特定图块上的对象存储在图块数据本身中。检查对象在哪个图块上,周围的图块包含可能与之碰撞的任何对象:
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
}
}
}
我总是尝试以现实世界为例。如果我想比较具有相同颜色的项目,即使它们与颜色不匹配,检查每个项目似乎也不合逻辑(方法2,请检查每个项目)。我可能会收集具有相同颜色的物品(彼此靠近的对象)并检查它们(方法1),而不是检查所有内容。
这不是一个适当的比较,因为碰撞检查中的项目一直在移动,因此顺序混乱了。那让我感到困惑。
检查每个项目会更有效,从而消除保持生成邻居数组的压力。
还是找到邻居从而不必遍历那么多对象来检查冲突是否更有效率?
不断更改每个图块上的数据似乎也很费力,所以我不确定这是一个好主意。
我一直在思考一种塔防游戏,其中如果在射击目标之前物体在射程内,则该塔需要检测物体。检查所有项目似乎很愚蠢,而有时根本没有任何物体在附近。
我为冗长的帖子致歉,总是无法解释自己!