2013-05-05 124 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

相关问题