2

嘿,我在移除我的敌人方块时遇到问题。目前,如果我击中每个人,一切都很好,但是当我避开一个时,我会收到一条错误消息

ArgumentError:错误 #2025:提供的 DisplayObject 必须是调用者的子对象。在 flash.display::DisplayObjectContainer/removeChild() 在 EnergyJump/onTick() 在 flash.utils::Timer/flash.utils:Timer::_timerDispatch() 在 flash.utils::Timer/flash.utils:Timer::打钩()

这是我的代码:

public function onTick( timerEvent:TimerEvent ):void 
        {
            //if ranrom number is than than i
            if ( Math.random() < i )
            {
                //place block on stage at location X=550, Y=330
                var randomX:Number = Math.random() * 550;
                var newBlock:Blocks = new Blocks( 550, 335 );
                army.push( newBlock );
                addChild( newBlock );
                //increase speed of spawn
                i = i + 0.0001;
            }

            //move blocks in correct direction
            for each ( var block:Blocks in army ) 
            {
                block.move();
                //if block is hit then remove health and remove child object
                    if ( avatar.hitTestObject( block ) ) 
                    {

                        hp.checkHP(20);
                        army.splice(army.indexOf(block), 1);
                        removeChild( block );

                    }
            }
        }

谁能帮助我,说实话,我真的不知道切片是什么或如何使用它...

4

3 回答 3

1

您应该在此处查看 Array.splice()的文档。

第一个参数必须是要删除的项目的索引(0、1、2 等),而不是项目本身。Flash 试图读取block为整数,但它默认为 0,因此不是删除已命中的块,而是删除列表中的第一个块。试试这个:

army.splice(army.indexOf(block), 1);

我假设你有一些代码在游戏结束时清除列表中的任何剩余块,但是由于错误的块正在从列表中删除,它试图删除一些实际已经被击中的块。

于 2013-01-17T19:38:55.337 回答
0

好的,我快速浏览了您的文件。这个问题有点离题,但我会列出我发现的问题。一般来说,尽管您需要查看 Flash 抱怨的部分并确保您确实使用了正确的变量(例如,如果您编写block,请尝试确保您知道block要查看哪个 Flash,并记住当你改变事情时,顺序很重要。)

很容易意外删除错误的项目或尝试使用空值,因此请检查每一行并考虑每个变量在该点实际上是什么(也许也尝试跟踪变量)。

  • avatarEnterFrame你正在检查已经离开屏幕一侧的块,但你没有添加for each像 in 这样的循环onTick,所以当你block在那里使用时,Flash 正在查看你的 mainpublic var block:Blocks;而不是 in 中的块army
  • onPowerTick您需要以splice与以前相同的方式调整您的,以便您删除powerups您正在检查的对象而不是 0 处的项目。
  • restartGamegameOverScreen尝试删除它之前将其设置为 null,因此 Flash 不知道要删除什么。确保在完成其他所有操作之前将其设置为 null。

我将为您的游戏屏幕问题发布单独的答案,以便它在正确的位置。

于 2013-01-18T00:19:44.740 回答
0

您确定在调用 removeChild() 之前对每个对象进行了相应的 addChild() 调用吗?目前显示的代码不足,无法真正了解发生了什么,但还要确保在同一对象上不会多次调用 removeChild() 而不会在每次之间调用 addChild() .

于 2013-01-17T19:14:14.340 回答