【问题标题】:ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller. AS3ArgumentError:错误 #2025:提供的 DisplayObject 必须是调用者的子对象。 AS3
【发布时间】:2012-09-22 02:20:18
【问题描述】:

我正在尝试使用 hitTestObject 函数制作一个带有子弹射击和船只相互碰撞的太空入侵者类型游戏,但我无法获得 removeChild();功能可以在没有上述错误的情况下工作。这是我应该怎么做的代码。

import flash.ui.Keyboard;
import flash.events.KeyboardEvent;
import flash.events.Event;
import flash.display.MovieClip;

var count:int = 1;

//adding the components
var NewBullet:MovieClip = new Bullet;

    var Ship_M:MovieClip = new Ship; 
    Ship_M.x = 270;
    Ship_M.y = 470;
    addChild(Ship_M);


    var Ship_E:MovieClip = new E_Ship;
    Ship_E.x = 270;
    Ship_E.y = 5;
    addChild(Ship_E);


stage.addEventListener(Event.ENTER_FRAME , Rec);
function Rec(e:Event):void{
  if (NewBullet.hitTestObject(Ship_E))
  {
    removeChild(Ship_E);
    removeChild(NewBullet);

  }

   if (Ship_E.hitTestObject(Ship_M))
   {
      removeChild(Ship_E);
      removeChild(Ship_M);
    }



    }

function Moves(e:Event):void{

            NewBullet.y -= 30;

    if (NewBullet.y < 0 )
        {

         removeChild(NewBullet);

          count++;
    removeEventListener(Event.ENTER_FRAME, Moves);

        }

          trace (count);
    }



//For Moving the Spaceship          
stage.addEventListener(KeyboardEvent.KEY_DOWN, Move);

function Move (event:KeyboardEvent):void{

 switch(event.keyCode)

    {
        case 37: 
            if (Ship_M.hitTestObject(Stop_L1))
            {
                Ship_M.x -=  0;
            }
            else
            {
                Ship_M.x -=  10;
            }
        break;

        case 38:
            if (Ship_M.hitTestObject(Stop_U1))
            {
                Ship_M.x -=  0;
            }
            else
            {
                Ship_M.y -=  10;
            }

        break;

        case 39:
            if (Ship_M.hitTestObject(Stop_R1))
            {
                Ship_M.x -=  0;
            }
            else
            {
                Ship_M.x +=  10;
            }

        break;

        case 40:
            if (Ship_M.hitTestObject(Stop_D1))
            {
                Ship_M.x -=  0;
            }
            else
            {
                Ship_M.y +=  10;
            }

        break;


        case 32:
        addChild(NewBullet);
        NewBullet.x = Ship_M.x;
        NewBullet.y = Ship_M.y;

        addEventListener(Event.ENTER_FRAME, Moves);
        break;

        default:

    }

}

【问题讨论】:

  • 理想情况下,您应该使用 lowerCamelCase 命名变量以避免混淆。类名通常以大写字母开头。
  • 请考虑使用 raster (bitmapData) 和 copyPixels 来“渲染”您的游戏,从而大大提高性能。

标签: actionscript-3 flash actionscript removechild addchild


【解决方案1】:

替换你的

removeChild(SomeSprite); 

与

if (SomeSprite.parent)
    SomeSprite.parent.removeChild(SomeSprite); 

对象的父级只能调用 removeChild。

【讨论】:

  • 谢谢,你能帮我制作多个子弹吗
  • 你能描述一下你对子弹的问题吗?
【解决方案2】:

在您的特定情况下您可能不需要这个,但我有一个帮助函数来删除一个孩子并使其符合 GC 的条件,如下所示:

private function remove(child:DisplayObject):void
{
    if(child && child.parent)
    {
        child.parent.removeChild(child);
        child = null;
    }
}

【讨论】:

    【解决方案3】:

    您很可能会执行两次 removeChild(NewBullet),第一次是到达 Ship_E 时,第二次是离开边界时。一个简单的解决方案是每当您的 NewBullet 从舞台上移除时,为其设置一个标志,说“启用”,这意味着项目符号可以触发事件,并在您必须检查项目符号时在整个代码中检查它。

    注意,你只有一颗子弹,正常吗?

    【讨论】:

    • 嗯,这并不容易。您需要一个可以容纳所有子弹的阵列,并且您必须检查那里的每一个子弹是否在界限内以及它们是否击中了您的敌人(当然,每个敌人与每个子弹),以及另一个用于敌人的子弹。所有这些都在一个永远不会被删除的 ENTER_FRAME 侦听器中进行检查,而是从该数组中删除一个项目符号,并将其从显示中删除,然后从字面上忘记它。重用技术比这更好,但你必须先学会走路才能飞。
    • 我实际上很擅长使用 Java 和 C++ 我只是不明白使用代码的逻辑,但无论如何你要说的是我应该用一个 for 语句来填充和带有子弹的阵列发射它们并重新沉浸对吗??
    • 不只是火,而是跟踪它们的整个生命周期。但是,是的,类似的东西。
    • 老兄感谢您的回复,但请再帮我一次。我一直在看很多教程,但我不明白为什么我的子弹只发射相同的子弹你是怎么看到的,我该怎么办,你想要更新的代码吗?
    • 这是一个相当复杂的问题,但首先,您需要删除NewBullet 并用一系列子弹替换它,然后让您的玩家以不同的角度射击多个子弹,然后使所有他们飞。提示:您使用一个项目符号执行的操作应该对每个活动项目符号执行,但不要在项目符号上使用侦听器 - 它们太慢并且您可能会出现内存泄漏。
    猜你喜欢
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-08
    • 2023-03-13
    • 2012-02-29
    • 1970-01-01
    相关资源
    最近更新 更多