0

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

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

我的第二个问题是当我添加 hitTestOject 函数时。当宇宙飞船撞击小行星物体时,它会抛出一个错误并且它什么都不做。

这是我收到的 hitTestObject 错误:

TypeError:错误 #1034:类型强制失败:无法将“ast_0”转换为 flash.display.DisplayObject。在 spaceranger_fla::MainTimeline/addAstroid() 在 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

非常感谢,

彼得斯图尔特

4

2 回答 2

1

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

分配名称时,递增i

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

基本上,说i = i + 1;

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

ship.hitTestObject(ast)

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

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

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

于 2013-05-05T00:23:52.133 回答
1

ship.hitTestObject(ast.name)不会工作,因为ast.name它是一个字符串,而不是一个 DisplayObject。

尝试这个 :

if(ship.hitTestObject(ast)){
        gotoAndStop("2");
    }
于 2013-05-05T00:50:17.967 回答