(AS3)功能

时间:2012-10-29 22:33:00

标签: actionscript-3

我设法通过遵循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()会被调用(或者我认为)。

2 个答案:

答案 0 :(得分:1)

作为一般做法,stage should not be referenced - 特别是在您的情况下,您的参考仅用于添加子弹类的实例。如果它是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);
        }

    }
}

因此,在添加到阶段后,类会启动其操作,并且在从阶段中删除后,该类将终止其操作。

答案 1 :(得分:0)

我认为问题出在第一块。

您正在检查阶段,如果stage不为null,则使用添加到舞台监听器。

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

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