正确地从闪存中删除子项的问题

时间:2013-01-17 18:23:07

标签: actionscript-3 flash adobe

嘿,我有问题删除我的敌人块。此刻,如果我击中他们每个人一切都很好,但当我避免一个,我得到一个错误信息

  

ArgumentError:错误#2025:提供的DisplayObject必须是调用者的子级。       在flash.display :: DisplayObjectContainer / removeChild()       在EnergyJump / onTick()       在flash.utils :: Timer / flash.utils:Timer :: _ timerDispatch()       在flash.utils :: Timer / flash.utils:Timer :: tick()

这是我的代码:

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 );

                    }
            }
        }

任何人都可以帮助我,我真的不知道切片是诚实的还是如何使用它......

3 个答案:

答案 0 :(得分:1)

您应该查看Array.splice() here的文档。

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

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

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

答案 1 :(得分:0)

您是否确定在调用removeChild()之前已经为每个对象调用了相应的addChild()调用?目前还没有足够的代码显示,能够真正告诉发生了什么,同时也确保在同一个对象上不会多次调用removeChild(),而不会在每次调用之间调用addChild()

答案 2 :(得分:0)

好的,我快速查看了你的文件。对于这个问题,它有点偏离主题,但我会列出我发现的问题。一般来说,虽然您需要查看Flash正在抱怨的部分,并确保您真正使用正确的变量(例如,如果您编写block,请尝试确保您知道哪个block Flash将会关注,并记住,当您更改内容时,顺序很重要。)

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

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

我会针对您的游戏屏幕问题发布一个单独的答案,以便它位于正确的位置。