我有一个名为food的精灵,通过使用计时器添加到屏幕上。随着时间的推移,更多食品被添加到屏幕上。我如何用另一个物体测试所有这些食物精灵? (makeItem函数创建精灵btw)
private function placeFood(event:TimerEvent = null):void{
var rndI:uint = Math.floor(Math.random() * DIM); //sets a random integer based on the the floor
var rndJ:uint = Math.floor(Math.random() * DIM);
var rndX:Number = grid[rndI][rndJ].x; // sets a grid position for the food item to go
var rndY:Number = grid[rndI][rndJ].y;
food = makeItem(Math.random() * 0xFFFFFF);// random color
food.x = rndX;
food.y = rndY;
var foodArray:Array = new Array();
foodArray.push(food);
trace(foodArray.length)
addChild(food); //adds the food to the board
for (var i:uint = 0; i < snake.length; i++){
if (rndY == snake[i].y && rndX == snake[i].x){
placeFood();
}
}
}
答案 0 :(得分:3)
将食物项添加到数组中并循环遍历执行hitTestObject的数组。类似的东西:
var foods:Array = new Array();
foods.push(makeItem(blah));
...
for each (food in foods) {
food.hitTestObject(object);
}
答案 1 :(得分:1)
看起来你正在把物品放在固定的网格上。食物是否会四处移动?你的食物不会移动,你的蛇(或与食物碰撞的任何东西)都可以,你可以通过弄清楚移动物体占据的网格方格并且只检查当地的食物来大大优化你的碰撞检测。 / p>
一般来说,当您需要在多个对象之间进行碰撞检测时,可以多次执行。第一遍将包括计算成本最低的检查,以剔除不可能发生碰撞的事物,例如相距很远的物体,彼此远离的物体等。您的下一次通过可能类似于简单的边界框或圆形测试。最后,当您了解通过所有廉价测试的少数项目时,您可以在命中掩码之间使用更昂贵,更准确的命中测试,例如逐像素测试。
答案 2 :(得分:1)
避免数组的另一种方法是使用包含所有食物的精灵。每个精灵都是精灵的集合,因此是一棵树。这就是我用于命中检测的内容:1个特殊的精灵只包含敌人/食物。贯穿所有孩子,你甚至不需要检查他们的类型。如果需要,可以施放它们。
// begin
var foodCollection: Sprite = new Sprite();
// time passes, food is added
foodCollection.addChild(food);
// hit test
for (var i:int = 0; i < foodCollection.NumChildren; i++)
{
var food: Sprite = foodCollection.getChildAt(i);
// test
}