AS3更新变量报告在模式中为空

时间:2015-12-09 23:19:44

标签: actionscript-3 flash

我正在AS3制作太空游戏 - 我有一个名为EnemyShip的敌人类。

我已经注册了Event.ENTER_FRAME并且它正常工作 - 问题是我的变量类型为Array的rowXY在模式中报告null和非null值..

如何防止这种情况发生(或者是否有更简单的方法可以让船只在Flash Professional中移动?)。

模式如下: Error pattern

EnemyShip:

package
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class EnemyShip extends Sprite
    {
        internal var id:int;
        internal var rowOrder:int;
        internal var rowXY:Array;
        private var dirUp:Boolean = false;

        public function EnemyShip()
        {
            // add event listeners
            addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);

            addEventListener(Event.ENTER_FRAME, update);    
        }

        private function update(e:Event):void
        {
            moveUpAndDown();

            trace(rowXY);

            function moveUpAndDown():void
            {
                if (dirUp)
                    y -= C.ENEMY_SPEED;
                else
                    y += C.ENEMY_SPEED;
            }
        }

        private function onAddedToStage(e:Event):void
        {
            // get row XY
            if (rowOrder == 1)
                rowXY = C.ENEMY_ROW_1;

            if (rowOrder == 2)
                rowXY = C.ENEMY_ROW_2;

            if (rowOrder == 3)
                rowXY = C.ENEMY_ROW_3;

            // set XY position
            x = rowXY[0];
            y = rowXY[1];

            removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);

        }

        internal function destroy():void
        {
            rowOrder = null;
            rowXY = null;

            // remove event listeners
            removeEventListener(Event.ENTER_FRAME, update);

            // remove from display list
            parent.removeChild(this);

        }

    }

}

C.as(常数):

package
{
    // C stands for constants

    public class C
    {
        // ship constants
        public static const FIRE_DELAY:int = 500; // milliseconds

        // laser constants
        public static const LASER_SPEED:int = 30;
        public static const POINTS_KILL:int = 10;

        // mcScore constants
        public static const SCORE_LOC_X:Number = 345;
        public static const SCORE_LOC_Y:Number = -120;

        // enemy ship constants
        public static const ENEMY_ROW_1:Array = [485, -45];
        public static const ENEMY_ROW_2:Array = [485, 25];
        public static const ENEMY_ROW_3:Array = [485, 95];
        public static const ENEMY_SPEED:int = 5; // 5 pixels
        public static const ENEMY_Y_MIN:int = -10;
        public static const ENEMY_Y_MAX:int = 10;
    }

}

4 个答案:

答案 0 :(得分:1)

如果您尝试使用Flash Professional制作动画,我会利用其内置的Motion Tween功能。您还可以利用Tween类为您的代码制作动画。

答案 1 :(得分:1)

我使用此SharedPreferences循环重现了您的行为(您可以通过实例化3个对象并将3个其他对象直接插入舞台来获得相同的结果):

for

在这里我们可以非常清楚地看到for(var i:int = 1; i < 7; i++){ var enemy:EnemyShip = new EnemyShip(); enemy.rowOrder = i; addChild(enemy); } 在4,5或6的位置,i将是rowOrder,这也会为所有具有此问题的实例触发一些#1009错误null比这一行更大3:

rowOrder

为了避免这种情况,您可以将x = rowXY[0]; 的值限制在1到3之间,例如:

rowOrder

您也可以在enemy.rowOrder = 1 + int(Math.random()*3); 类本身内设置该值。

...

希望可以提供帮助。

答案 2 :(得分:0)

解决方案

据我所知,事件Event.ENTER_FRAME只传递给舞台上的对象,但事实并非如此。

问题出在我的EnemyShip类的构造函数方法中 - 舞台上和舞台外实例正在监听ENTER_FRAME事件 - 没有为场外实例分配rowXY(这发生在事件ADDED_TO_STAGE中)

旧代码:

Old Code

新守则:

New Code

那么这里要学到的教训是什么?
无论对象是否显示,都会发生Event.ENTER_FRAME。

答案 3 :(得分:0)

在您发布的屏幕截图中,您有以下代码:

if(rowOrder > 3)
    rowOrder = 0;

但是当您在rowOrder中检查onAddedToStage()时,您没有0的情况 - 只有1,2或3.因此rowXY永远不会被rowOrder设置是0。

更改该代码以将rowOrder设置为1而不是0,或将其他代码更改为零索引。