1

我遇到了这个问题,根本无法解决

我正在为 uni 制作平台游戏

我有 2 个文件

flashgame.fla 和 Coin.as(这是 Coin 类的代码)

我有代码说明一旦玩家收集了所有硬币,帧将从第 1 帧变为第 2 帧。当我这样做时,我会收到此消息

TypeError:错误 #1009:无法访问空对象引用的属性或方法。在 Coin/update() 类型错误:错误 #1009:无法访问空对象引用的属性或方法。在 flashgame_fla::MainTimeline/loop()

我试过 Try and Catch 和其他各种东西

我认为这样做是因为 Coin.as 扩展了 MovieClip,所以当它进入下一帧时,它仍然试图在没有任何东西的情况下找到硬币。

这是 Coin.as 的代码


package  {

import flash.display.MovieClip;
import flash.events.*;


public class Coin extends MovieClip {
    var player:MovieClip;
    var mainTimeLine = MovieClip(root);

    public function Coin() {
        this.addEventListener(Event.ENTER_FRAME, update);
    }

    function update(event:Event):void
    {
        player=MovieClip(root).player;
        if(this.hitTestObject(player))
        {
            this.removeEventListener(Event.ENTER_FRAME, update);
            parent.removeChild(this);
            mainTimeLine.coinCount++;
        }

    }
}

}

我在 flashgame.fla 中有一个数组,可以记录游戏中的所有硬币。当玩家击中它们时,它们会从阵列中拼接起来。转到第 2 帧时也可能导致问题

flashgame.fla 中的重要内容


var coin:Array = new Array();
for (i=0; i<numChildren; i++)
{
    if (getChildAt(i) is Coin)
    {
        coin.push(getChildAt(i).getRect(this));
    }
}

拼接硬币


for (i=0; i<coin.length; i++)
    {
        if (player.getRect(this).intersects(coin[i]))
        {
            coinSnd.play();
            coin.splice(i,1);
        }
    }

感谢您提供的任何帮助,如果您需要我提供更多信息,请询问:) 所有 g 都带有屏幕截图

4

2 回答 2

0

这很可能是因为在 Coin 类的更新函数中找不到播放器。这是因为即使显示对象不在舞台上,也会运行 ENTER_FRAME 事件,而您通常不希望这样做。在这种情况下,您尝试对玩家进行命中测试。

为了解决这个问题,您可以在硬币连接到舞台后立即开始运行更新,并在硬币从舞台上移除后立即停止运行。

public function Coin() {
   this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
   this.addEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStage);
}

function onAddedToStage(event:Event):void {
   this.addEventListener(Event.ENTER_FRAME, update);
}

function onRemovedFromStage(event:Event):void {
   this.removeEventListener(Event.ENTER_FRAME, update);
}
于 2012-10-13T13:11:04.310 回答
0

错误发生在哪一行?那应该告诉您哪个变量为空。

我的猜测是,基于这部分错误:“TypeError:错误 #1009:无法访问空对象引用的属性或方法。在 Coin/update()”,是parent因为你已经移动到一个新的关键帧,并且该实例已从舞台上移除。

也就是说,我怀疑错误发生在parent.removeChild(this);- 这是正确的吗?

如果是这种情况,那么parent在调用removeChild它之前检查是否不为空。

于 2012-10-14T02:47:52.443 回答