使用addChild和hitTest与AS3时出现奇怪的问题

时间:2013-05-05 00:11:11

标签: actionscript-3 flash object hittest addchild

在动作脚本3中添加一个孩子时遇到了一些问题。我正在构建一个Space Invaders游戏,我正在编写将小行星添加到舞台上的功能。

我的第一个问题是,每当我尝试添加新的小行星时,都会添加以前的所有小行星。

我的第二个问题是我添加了hitTestOject函数。它引发了一个错误,当太空船撞击小行星物体时它不会做任何事情。

以下是我使用hitTestObject收到的错误:

  

TypeError:错误#1034:类型强制失败:无法转换" ast_0"   到flash.display.DisplayObject。在   spaceranger_fla :: MainTimeline / addAstroid()at   flash.utils :: Timer / _timerDispatch()在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();

非常感谢一些建议,建议和答案:)

更新

我对循环错误进行了排序。旧的小行星不再出现! :d

非常感谢,

彼得斯图尔特

2 个答案:

答案 0 :(得分:1)

根据您的第一个问题,它不会显示i增量 - 它总是0

分配名称时,请增加i

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

基本上,说i = i + 1;

接下来,针对实例本身进行测试,而不是标识:

ship.hitTestObject(ast)

不确定你的游戏是如何运作的,但看起来你真正想要的是两个处理程序:

  • 偶尔添加一个新的小行星
  • 测试碰撞的那个

目前,您的addAsteroid()功能会添加一个新的小行星,并立即测试它是否在创建时与船发生碰撞。那个小行星永远不会再次进行碰撞测试。如果这类似于经典的小行星游戏,您可能希望将每个小行星推送到一个数组,并为ENTER_FRAME添加一个事件监听器来测试每个小行星与船的碰撞。

答案 1 :(得分:1)

ship.hitTestObject(ast.name)无法正常工作,因为ast.name是String,而不是DisplayObject。

试试这个:

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