如何在横向卷轴平台游戏 as3 中制作可收集的硬币
How to make collectable coins in sidescrolling paltformer as3
在 coin.as 我输入了:
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()
我很高兴知道我遗漏的任何内容或关于不同方式的任何建议。
您的 mainTimeLine 变量为空,因此以下行产生错误。
mainTimeLine.coinCount += coinValue;
为什么。
因为你在硬币实例化的那一刻初始化它,而在那一刻硬币没有附加到显示列表。任何有效 DisplayObject 的属性 stage 和 root 可用 ONLY 当对象本身附加到显示列表时。
如何解决。
方案1.适时初始化。
// player = MovieClip(root).player;
mainTimeLine = MovieClip(root);
player = mainTimeLine.player;
选项 2。创建一个 class,它将全局保留您需要的所有对象引用,这样您就可以从任何代码段访问它们,而无需考虑您的游戏显示列表结构。
package
{
public class GameData
{
static public var player:PlayerClass;
static public var game:GameClass;
}
}
因此,当您开始游戏时,您会在创建 player 和 game 引用时初始化它们,然后从任何地方您希望你称他们为
if (this.hitTestObject(GameData.player)) // ...
在 coin.as 我输入了:
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()
我很高兴知道我遗漏的任何内容或关于不同方式的任何建议。
您的 mainTimeLine 变量为空,因此以下行产生错误。
mainTimeLine.coinCount += coinValue;
为什么。
因为你在硬币实例化的那一刻初始化它,而在那一刻硬币没有附加到显示列表。任何有效 DisplayObject 的属性 stage 和 root 可用 ONLY 当对象本身附加到显示列表时。
如何解决。
方案1.适时初始化。
// player = MovieClip(root).player;
mainTimeLine = MovieClip(root);
player = mainTimeLine.player;
选项 2。创建一个 class,它将全局保留您需要的所有对象引用,这样您就可以从任何代码段访问它们,而无需考虑您的游戏显示列表结构。
package
{
public class GameData
{
static public var player:PlayerClass;
static public var game:GameClass;
}
}
因此,当您开始游戏时,您会在创建 player 和 game 引用时初始化它们,然后从任何地方您希望你称他们为
if (this.hitTestObject(GameData.player)) // ...