在硬币中,我已经说了:
package {
import flash.display.MovieClip;
import flash.events.*;
import flash.events.Event;
public class coin extends MovieClip {
var player:MovieClip;
var mainTimeLine = MovieClip(root);
var coinValue:int = 5;
public function coin() {
// constructor code
this.addEventListener(Event.ENTER_FRAME, upDate);
}
function upDate (e:Event) :void {
player = MovieClip(root).player;
if (this.hitTestObject(player)) {
this.removeEventListener(Event.ENTER_FRAME, upDate);
this.visible = false;
mainTimeLine.coinCount += coinValue;
}
}
}
}
当我在屏幕上为玩家收集硬币(播放器编码和其他编码在Main.as中)放置硬币时,这样可以正常工作但是当我将硬币放入碰撞MovieClip时,它会跟踪此错误:
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at coin/upDate()
我遗失的任何东西或对此的不同方式的任何建议我都会很高兴知道。
答案 0 :(得分:1)
您的 mainTimeLine 变量为null,因此以下行会产生错误。
mainTimeLine.coinCount += coinValue;
<强>为什么强>
因为你在硬币实例化的那一刻初始化它,并且在那个时刻硬币没有附加到显示列表。当对象本身附加到显示列表时,任何有效 DisplayObject 的属性阶段和 root 可用仅
如何修复。
选项1.在适当的时候初始化它。
// player = MovieClip(root).player;
mainTimeLine = MovieClip(root);
player = mainTimeLine.player;
选项2.创建一个类,它将保留全局所需的所有对象引用,因此您可以从任何代码段访问它们,而不考虑您的游戏显示列表结构。
package
{
public class GameData
{
static public var player:PlayerClass;
static public var game:GameClass;
}
}
因此,当您开始游戏时,您会在创建游戏时初始化玩家和游戏引用,然后从您想要的任何地方引用它们
if (this.hitTestObject(GameData.player)) // ...