2011-04-01 47 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 
}