AS3 阶段 = 空?
Posted
技术标签:
【中文标题】AS3 阶段 = 空?【英文标题】:AS3 stage = null? 【发布时间】:2012-11-06 19:41:29 【问题描述】:我刚刚尝试实现一个菜单系统,我看到了一个关于我正在开发的游戏的教程,一切都很顺利,直到我现在遇到了舞台设置为 null 的问题,我没有不知道如何阻止它。不断破坏它的行在 AvoiderGame.as 文件中,并且是 stage.addEventListener(Event.ADDED_TO_STAGE, init);
它不断返回以下错误
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at AvoiderGame()[M:\Users\Andy\Documents\Programming For Fun\Flash\Tutorial - Avoider Game\Classes\AvoiderGame.as:29]
at States/changeState()[M:\Users\Andy\Documents\Programming For Fun\Flash\Tutorial - Avoider Game\States.as:26]
at mainMenu/brnP_Button()[M:\Users\Andy\Documents\Programming For Fun\Flash\Tutorial - Avoider Game\Classes\mainMenu.as:34]
目前我编写游戏的方式是从包含以下代码的 States.as 开始。
package
import flash.display.*;
import flash.system.fscommand;
public class States extends MovieClip
public function States()
changeState(null, "menu");
public function changeState (currentState, nextState)
if (currentState != null)
removeChild(currentState);
switch(nextState)
case "menu": var mm:mainMenu = new mainMenu(changeState);
addChild(mm);
break;
case "game": var g:AvoiderGame = new AvoiderGame(changeState);
addChild(g);
break;
case "exit": fscommand("quit");
break;
它会从那里进入 mainMenu.as 直到用户点击播放 - 在 mainMenu.as 里面是下面的代码
package
import flash.display.*;
import flash.events.*;
public class mainMenu extends MovieClip
var theCallBackFunction:Function;
public function mainMenu(callBack)
var Background:gameBackground;
Background = new gameBackground();
addChild(Background);
var btnPlay:mmPlay = new mmPlay();
btnPlay.addEventListener(MouseEvent.MOUSE_DOWN, brnP_Button);
btnPlay.x = width/2;
btnPlay.y = height/2 - btnPlay.height/2;
addChild(btnPlay);
var btnExit:mmExit = new mmExit();
btnExit.addEventListener(MouseEvent.MOUSE_DOWN, brnE_Button);
btnExit.x = width/2;
btnExit.y = height/2 - btnExit.height/2;
btnExit.y += btnExit.height + 4;
addChild(btnExit);
theCallBackFunction = callBack;
public function brnP_Button(e:MouseEvent)
theCallBackFunction(this, "game");
return;
public function brnE_Button(e:MouseEvent)
theCallBackFunction(this, "exit");
return;
现在这就是它出错的地方 - 它进入了 AvoiderGame.as,然后它以一个我不知道如何修复的错误将我踢回来 - 谁能告诉我如何修复它?
package
import flash.display.MovieClip;
import flash.utils.Timer;
import flash.events.Event;
import flash.events.TimerEvent;
import com.freeactionscript.CollisionTest;
import flash.display.Stage;
public class AvoiderGame extends MovieClip
var theCallBackFunction:Function;
public static var enemyArray:Array;
public var enemy:Enemy
public var Background:gameBackground;
public var avatar:Avatar;
public var gameTimer:Timer;
private var _collisionTest:CollisionTest;
private var numStars:int = 80;
private var fireTimer:Timer; //causes delay between fires
private var canFire:Boolean = true; //can you fire a laser
public function AvoiderGame(callBack)
stage.addEventListener(Event.ADDED_TO_STAGE, init);
theCallBackFunction = callBack;
private function init(e:Event):void
Background = new gameBackground();
addChild(Background);
enemyArray = new Array();
var enemy = new Enemy(Math.round(1 + (500 - 1) * Math.random()), - 2, stage);
enemyArray.push(enemy);
addChild(enemy);
avatar = new Avatar(stage);
addChild(avatar);
avatar.x = stage.stageWidth / 2;
avatar.y = stage.stageHeight / 2;
for (var i:int = 0; i < numStars; i++)
stage.addChildAt(new Star(stage), 1);
_collisionTest = new CollisionTest();
gameTimer = new Timer(25);
gameTimer.addEventListener(TimerEvent.TIMER, onTick);
gameTimer.start();
fireTimer = new Timer(300, 1);
fireTimer.addEventListener(TimerEvent.TIMER, fireTimerHandler, false, 0, true);
fireTimer.start();
public function onTick(timerEvent:TimerEvent):void
if (Math.random() < 0.1)
trace('array length: ', AvoiderGame.enemyArray.length);
enemy = new Enemy(Math.round(1 + (500 - 1) * Math.random()), - 28, stage);
enemyArray.push(enemy);
addChild(enemy);
avatar.UpdateAvatar(canFire);
if (canFire == true)
canFire = false;
fireTimer.start();
avatar.StayOnScreen();
for each (var enemy:Enemy in enemyArray)
enemy.moveDown();
enemy.StayOnScreen();
if (_collisionTest.complex(enemy, avatar))
gameTimer.stop();
private function fireTimerHandler(e:TimerEvent) : void
//timer ran, we can fire again.
canFire = true;
【问题讨论】:
【参考方案1】:public function AvoiderGame(callBack)
stage.addEventListener(Event.ADDED_TO_STAGE, init);
theCallBackFunction = callBack;
应该是这样的
public function AvoiderGame(callBack)
this.addEventListener(Event.ADDED_TO_STAGE, init);
theCallBackFunction = callBack;
在调用 init 函数时不要忘记移除事件监听器。
【讨论】:
这解决了它 - 谢谢:)!【参考方案2】:当显示对象未添加到舞台或显示列表中已存在其他显示对象时,舞台为空。 Event.ADDED_TO_STAGE 将在 stage 设置并可用时被调度。
【讨论】:
感谢您对错误的实际解释,而不仅仅是如何解决问题。 不客气。实际上,我认为这应该是给出答案的强制性部分。【参考方案3】:当您创建 AvoiderGame 对象时,它会触发构造函数。此时对象并没有添加到舞台或显示列表中的任何对象,所以它不会对舞台有任何引用。
您可以在 ADDED_TO_STAGE 事件中添加侦听器,或在手动将其添加到舞台之前调用自定义 init
方法。
【讨论】:
以上是关于AS3 阶段 = 空?的主要内容,如果未能解决你的问题,请参考以下文章
两阶段处理:不要从阶段 1 XSLT 2.0 处理中输出空标签