2011-04-01 69 views
1

我有一个称为食物的精灵,它通过使用计时器添加到屏幕上。随着时间的推移,屏幕上会添加更多的食物。我会如何用另一个物体来测试所有这些食物精灵? (该makeItem函数创建者均基于精灵)Sprites and Arrays as3

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(); 
      } 
     } 
    } 

回答

3

通过阵列做hitTestObject添加食品到一个数组和循环。例如:

var foods:Array = new Array(); 
foods.push(makeItem(blah)); 
... 
for each (food in foods) { 
    food.hitTestObject(object); 
} 
+0

您好,我已经修改了我的文章与您的想法。除非它只返回长度为1. – DIM3NSION 2011-04-01 12:12:45

+0

在你的函数之外声明foodArray。你不想每次都创建一个新的数组,你想追加到现有的数组。 – jhocking 2011-04-01 13:37:40

+0

谢谢,我帮你找到正确的数组。现在我的蛇对象正在一个数组中。叫蛇。我如何测试与食物阵列并使其追踪的东西? – DIM3NSION 2011-04-01 13:42:25

1

它看起来像你把物品放在一个固定的网格上。食物是否移动?你的食物不会移动,并且你的蛇(或任何与食物碰撞的东西)都可以,你可以通过找出移动物体占据的网格平方并仅检查该区域的食物来大大优化碰撞检测。

一般来说,当您需要在多个对象之间进行碰撞检测时,您可以多次执行此操作。第一遍将包括计算花费最少的检查来剔除那些不可能发生碰撞的事物,例如距离很远的对象,彼此远离的对象等。您的下一次传球可能类似于简单的边界框或圆圈测试。最后,当你通过所有廉价测试的少数项目时,你可以使用更加昂贵和准确的命中测试,如击中蒙版之间的逐像素测试。

+0

嗨亚当我设法得到某种打击测试工作。但是如果你找到我的话,它的网格看起来就像一个方格。你可以看看我已经上传了swf - http://ignitethatdesign.com/FlashLeaderBoard/hitTest.swf。如果您尝试并错过一个网格的食物对象,它会将其检测为点击:/ – DIM3NSION 2011-04-01 14:11:09

+1

刚刚看过您发布的游戏,问题比我想象的要简单得多。在通常意义上,您不需要任何类型的碰撞检测,只需要一个布尔值网格来跟踪食物的位置,然后在蛇的每次移动中检查表示蛇的头部的网格正方形。 – 2011-04-01 14:23:17

+0

是的,我首先假定物体可以任意定位,而不是像这样将运动限制在一个网格上。基于Adam的最新评论,我正在投票回答这个问题。 – jhocking 2011-04-01 15:14:38

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 
}