2013-05-05 79 views
0

在操作腳本3中添加一個孩子時,我遇到了一些問題。我目前正在構建一個Space Invaders遊戲,並且正在編寫將小行星添加到舞臺上的功能。在AS3中使用addChild和hitTest時出現的奇怪問題

我的第一個問題是,每次我嘗試添加一個新的小行星時,都會添加所有以前的小行星。

我的第二個問題是當我添加hitTestOject函數。它拋出一個錯誤,當太空船撞擊小行星物體時它不會做任何事情。

這是我收到與hitTestObject錯誤:

TypeError: Error #1034: Type Coercion failed: cannot convert "ast_0" to flash.display.DisplayObject. at spaceranger_fla::MainTimeline/addAstroid() at flash.utils::Timer/_timerDispatch() at flash.utils::Timer/tick()

這裏是我的代碼。我用一個定時器所以每個小行星被添加每5000毫秒:

// Add astoid 
var astTimer:Timer = new Timer(5000); 
astTimer.addEventListener(TimerEvent.TIMER, addAstroid); 
var i:Number = 0; 
function addAstroid (e:TimerEvent):void{ 
    var ast = new astroid(); 
    ast.name = "ast_"+i; 
    ast.y = Math.random()*stage.stageHeight; 
    ast.x = 565; 
    addChild(ast); 
    trace(i); 
    if(ship.hitTestObject(ast.name)){ 
     gotoAndStop("2"); 
    } 
i = i+1; 
} 

astTimer.start(); 

一些意見,建議和答案,將不勝感激:)

UPDATE

我排序的循環錯誤。舊小行星不再出現! :d

非常感謝,

彼得·斯圖爾特

回答

1

按照您的第一個問題,它不會出現i增量 - 它總是0

當您指定的名稱,增加i

ast.name = "ast_" + (i++).toString(); 

基本上,說i = i + 1;

接下來,擊中測試實例本身,而不是一個身份:

ship.hitTestObject(ast) 

不知道你的遊戲如何發揮作用,但看起來你真正想要的是兩個處理程序:

  • 一個偶爾添加一個新的小行星
  • 一個測試的碰撞

目前您addAsteroid()功能增加了一個新的小行星,並立即如果它在創建船舶碰撞測試。這顆小行星永遠不會再被碰撞。如果這與經典的小行星遊戲類似,您可能需要將每個小行星推送到一個數組,併爲ENTER_FRAME添加一個事件監聽器來測試每個小行星是否碰撞船隻。

+0

根據您的編輯,我看你接着說:I = I + 1;'你的例子。 – 2013-05-05 00:33:08

+0

嗨,傑森,是的,我調試時刪除了增量代碼,我忘了添加它,但這沒有什麼區別。每個小行星對象都是一個影片剪輯,影片剪輯正在循環。我通過在補間動畫結束處添加「stop()」來解決此問題。它現在讓我的hitTestObject工作? – 2013-05-05 11:25:16

+0

是的,你的回答對我有意義!我將創建一個計時器,每500毫秒檢查一次命中數。謝謝:) – 2013-05-05 15:07:36

1

ship.hitTestObject(ast.name)不會工作,因爲ast.name是一個字符串,而不是DisplayObject。

試試這個:剛纔

if(ship.hitTestObject(ast)){ 
     gotoAndStop("2"); 
    } 
+0

不幸的是,ship.hitTestObject(ast)返回錯誤:( – 2013-05-05 11:23:32

+0

)問題是關於強制錯誤,這解決了這個問題,如果它返回false並且你不知道爲什麼,那是一個不同的問題。一個新的問題 – prototypical 2013-05-05 14:55:02

+0

我有:http://stackoverflow.com/questions/16384424/hittestobject-with-dynamically-add-movies – 2013-05-05 14:56:07

相關問題