【问题标题】:Issues correctly removing childs from flash从 Flash 中正确删除子项的问题
【发布时间】:2013-01-01 09:05:00
【问题描述】:

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

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

                    }
            }
        }

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

【问题讨论】:

    标签: actionscript-3 flash adobe


    【解决方案1】:

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

    很容易意外删除错误的项目或尝试使用为空的项目,因此请检查每一行并考虑此时每个变量的实际情况(也许也可以尝试跟踪变量)。

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

    我将针对您的游戏画面问题发布单独的答案,以便将其放在正确的位置。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 如果没有击中,我目前不会删除它。它离开了屏幕,消失了。离开舞台区域后我应该将其移除吗?
      • 我也可以让你帮我看看这个吗?我还有 1 个问题要解决
      • 整理这样的事情是个好主意,但我认为这不是导致您在这种情况下出现错误的原因。调整接头有帮助吗?
      • 试一试似乎是半工作但仍然有问题。似乎删除了它们,但是当我点击下一个时,它会产生相同的错误。
      • 嗯,这很奇怪。块是否曾经添加回“军队”,或添加到不同的父级?可能值得为块命名并追踪正在发生的事情以确保它符合您的预期,也许只有几个块以便更容易看到。
      【解决方案3】:

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

      【讨论】:

      • 这是唯一一次为该对象调用 removechild
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      相关资源
      最近更新 更多