我正在创建一个塔防游戏,并在aoe塔上同时摧毁2个怪物我得到' TypeError:错误#1009:无法访问空对象引用的属性或方法...在Document / loop()...在EnemyRed / removeSelf()'
我在文档类中使用Event.ENTER_FRAME函数检查是否(monster hp< 0),然后调用monster类中的一个函数将其自身从其父类中删除。 (以下代码)。
跟踪显示它正在尝试删除相同的实例两次,即使它本应已从数组中删除。
文档类:
public function loop(event:Event):void
{
//If enemy hit points < 0 remove self
if(enemies.length > 0)
{
for(var e = 0; e < enemies.length; e++)
{
if(enemies[e].hitPoints <= 0)
{
enemies[e].removeSelf();
怪物类:
public function removeSelf():void
{
trace(this.name);
trace(this.parent);
removeEventListener(Event.ENTER_FRAME, loop);
parent.removeChild(this);
Document.enemies.splice(this,1);
}
追踪返回:
Monster: instance2019
Parent: [object Level1]
Monster: instance2019
Parent: null
答案 0 :(得分:0)
已经有一段时间了,但我认为应该是
public function removeSelf():void {
trace(this.name, this.parent);
if (hasEventListener(Event.ENTER_FRAME)) {
removeEventListener(Event.ENTER_FRAME, loop);
}
if (parent) {
parent.removeChild(this);
}
var index:int = Document.enemies.indexOf(this);
if (index > -1) {
Document.enemies.splice(index,1);
}
}
现在应该正确删除实例。
此外,向后迭代enemies
数组会更好,因为当您在向前迭代时将一个元素拼接出一个数组时,下一个项会转移到先前的位置,并且第一个位置没有经过迭代。如果在向后迭代时拼接元素,则更改位置的元素已在此循环中处理,因此不会发生错误。在这种情况下,该bug只会导致0-HP怪物在被移出阵列之前持续存在几帧,但其他情况甚至可能延伸到破坏你的游戏。
for(var e:int = enemies.length-1; e >=0; e--)
{
if(enemies[e].hitPoints <= 0)
{
enemies[e].removeSelf();