我一直在研究命中检测算法一段时间,其中我有一系列阵列(块)中的正方形,并且通过循环,数组经过并检查是否有项目(公共汽车)与它相交。
原始代码如下:
// Gets important variables from controller class
var blocks:Array = main.blocks;
var map:Map = main.game.gameMap;
var game:GameMapScreen = main.game;
var bus:Bus = main.game.gameMap.bus;
var busSpeed:uint = 5;
// Centers the 'map' around the 'bus'
game.x = (bus.x) * -1 + stage.stageWidth / 2;
game.y = (bus.y) * -1 + stage.stageHeight / 2;
map.setChildIndex(bus, map.numChildren - 1);
// Creates the new x and y values for where the bus will move
var angle:Number = (bus.rotation / 360) * (Math.PI * 2);
var dx:Number = Math.cos(angle);
var dy:Number = Math.sin(angle);
var newX:Number = dx * busSpeed;
var newY:Number = dy * busSpeed;
// Gets a clone of rectangle around bus, moves it to new x and y
busRect.x += newX;
busRect.y += newY;
然后它通过块数组并再次测试每个块的矩形
的总线矩形var hitting:Boolean = false;
for(var i:uint = 0; i < blocks.length; i++)
{
if(busRect.intersects(blocks[i].getRect(map))
{
hitting = true;
break;
}
}
然后它检查是否击中,然后移动,如果不是
if(!hitting)
{
bus.x += newX;
bus.y += newY;
}
我发现的问题是,当总线没有与一个块交叉时,它似乎是“交叉”两个块。
块以网格状的方式排列,其间不应该相交......但它看起来是交叉点2,实际插入块时只有一个。
经过多次检查并与他人协商后,我们无法找出问题所在。为什么当我们像时尚一样在网格中排列块时,然后在数组中粘贴,并检查它是否正在击中某个东西,如果没有实际相交则交叉2个块,如果它是交叉点则为1 ...
有什么想法吗?
答案 0 :(得分:0)
我解决了这个问题。我没有使用实际的&#34;块&#34;而是在顶部制作了矩形,这些矩形与空间重叠。当玩家不再与2个以上的矩形相交时,命中检测会发挥作用。