我设法通过遵循MJW的调试错误#1009指南来修复整个null阶段错误。但是现在初始化子弹的功能不会被调用。
代码段:
if (stage) {
init();
} else {
addEventListener(Event.ADDED_TO_STAGE, init);
}
...
private function init(event:Event = null) {
removeEventListener(Event.ADDED_TO_STAGE, init);
stage.addEventListener(Event.ENTER_FRAME, shoot);
}
...
private function shoot(event:Event) {
var bullet:EnemyBullet = new EnemyBullet();
stage.addChild(bullet);
bullet.x = enemy.x;
bullet.y = enemy.y;
bullet.theta = Math.random() * 360;
bManager.bulletVector.push(bullet);
}
请注意,当我将trace()放在后两个函数中时,没有任何反应,但第一个代码段中的addEventListener()会被调用(或者我认为)。
答案 0 :(得分:1)
作为一般做法,stage
should not be referenced - 特别是在您的情况下,您的参考仅用于添加子弹类的实例。如果它是z-index的问题,你可以改为有一个图层,其中子弹放在显示列表上的其他显示对象之上。
除了在单个阶段上加载多个SWF的复杂性之外,通过将显示对象添加到它们自己的显示列表层次结构中,您的代码将成为很好的隔离功能单元。或者,您可以利用MVC模式,由此控制器操纵视图。
为了使您的代码有效,该类必须是SWF的主要功能或添加到舞台。
如果它是SWF的主要功能,则会调用init()
。
否则,请确保通过addChild()
将其添加到显示列表中。
说这是一个战场,你的战场类被添加到舞台上,它可以实现如下:
package
{
import flash.display.Sprite;
import flash.events.Event;
[SWF(percentWidth = 100, percentHeight = 100, backgroundColor = 0x0, frameRate = 30)]
public class Battlefield extends Sprite
{
public function Battlefield()
{
if (stage)
init();
else
addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
}
protected function addedToStageHandler(event:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
init();
}
protected function init():void
{
addEventListener(Event.ENTER_FRAME, frameHandler);
}
protected function frameHandler(event:Event):void
{
var odds:Number = Math.random();
trace((odds < 0.1 ? "Fire! " : "Skip...") + "Odds were: " + odds);
}
}
}
哪个会输出:
Skip... Odds were: 0.3539872486144304
Skip... Odds were: 0.742108017206192
Fire! Odds were: 0.025597115512937307
Skip... Odds were: 0.7608889108523726
Fire! Odds were: 0.08514392375946045
Skip... Odds were: 0.27881692815572023
除了Stage3D之外,我从未喜欢过这种初始化模式,因为你可以轻松地依赖舞台事件,如:
package
{
import flash.display.Sprite;
import flash.events.Event;
[SWF(percentWidth = 100, percentHeight = 100, backgroundColor = 0x0, frameRate = 30)]
public class Battlefield extends Sprite
{
public function Battlefield()
{
addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
}
protected function addedToStageHandler(event:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
addEventListener(Event.REMOVED_FROM_STAGE, removedFromStageHandler);
addEventListener(Event.ENTER_FRAME, frameHandler);
}
protected function removedFromStageHandler(event:Event):void
{
removeEventListener(Event.ENTER_FRAME, frameHandler);
removeEventListener(Event.REMOVED_FROM_STAGE, removedFromStageHandler);
addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
}
protected function frameHandler(event:Event):void
{
var odds:Number = Math.random();
trace((odds < 0.1 ? "Fire! " : "Skip...") + "Odds were: " + odds);
}
}
}
因此,在添加到阶段后,类会启动其操作,并且在从阶段中删除后,该类将终止其操作。
答案 1 :(得分:0)
我认为问题出在第一块。
您正在检查阶段,如果stage不为null,则使用添加到舞台监听器。
您应该只使用addEventListener(Event.ADDED_TO_STAGE, init);
但是,假设该类是DisplayObject子类,未添加到舞台的对象无法调用ADDED_TO_STAGE侦听器