0

通过遵循 MJW 的调试错误 #1009 指南,我设法修复了整个空阶段错误。但是现在初始化子弹的函数没有被调用。

片段:

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() 确实被调用了(或者我认为如此)。

4

2 回答 2

1

作为一般做法,stage 不应引用- 特别是在您的情况下,您的引用仅用于添加子弹类的实例。如果是 z-index 的问题,则可以改为使用一个层,其中项目符号放置在显示列表中其他显示对象的顶部。

除了在单个阶段加载多个 SWF 的复杂性之外,通过将显示对象添加到它们自己的显示列表层次结构中,您的代码将成为很好的独立功能单元。或者,您可以利用控制器操纵视图的 MVC 模式。

为了使您的代码正常工作,该类必须是 SWF 的主要功能或添加到舞台。

如果它是 SWF 的主要函数,init()将被调用。

否则,请确保它通过addChild().

你真的打算每帧发射一颗子弹吗?那可能是每秒 24 到 60 发子弹。您可能希望以一定的概率限制它是否带火子弹。

假设这是一个战场,并且你的战场类被添加到阶段,它可以这样实现:

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);
        }

    }
}

因此,在添加到阶段时,该类启动其操作,并且在从阶段移除时,该类终止其操作。

于 2012-10-30T00:26:20.160 回答
0

我认为问题出在第一块。

您正在检查阶段,如果阶段不为空,则使用添加到阶段的侦听器。

你应该只使用addEventListener(Event.ADDED_TO_STAGE, init);

但是,这是假设该类是 DisplayObject 子类,未添加到舞台的对象无法调用 ADDED_TO_STAGE 侦听器

于 2012-10-29T23:04:07.967 回答