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 );
}
}
}
任何人都可以帮助我,我真的不知道切片是诚实的还是如何使用它......
答案 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,直到完成其他所有操作。我会针对您的游戏屏幕问题发布一个单独的答案,以便它位于正确的位置。