addChild在舞台上不显示任何内容

时间:2014-05-07 02:32:12

标签: actionscript-3 flash actionscript

所以当空格键被按下时,我正试图制造太空飞船的激光器。我之前在一个纯粹的flex项目中完成了这项工作,但最近获得了创意云,我正在尝试使用Flash专业/ flash构建器重新创建相同的效果。

不幸的是,当我创建一个新的" Laser"类和尝试把它放在舞台上使用addChild()似乎没有任何事情发生。

这是主文件/文档类

    public class PlayerShip extends Sprite
    {

        private var laserTimer:Timer;
        private var shipTime:Timer;
        private var upKey:Boolean;
        private var downKey:Boolean;
        private var leftKey:Boolean;
        private var rightKey:Boolean;
        private var spacebar:Boolean;
        private var utils:Utils = new Utils();

        //tuning variables
        private var MOVE_SPEED:int = 5;
        private var REVERSE_SPEED:int = 3;
        private var TURN_SPEED:int = 5;

        private var laserEmitter:shipLasers = new shipLasers(stage);

        public function PlayerShip():void
        {
            super();

            addEventListener(Event.ENTER_FRAME, fly);
            stage.addEventListener(KeyboardEvent.KEY_DOWN, movementKeysDown);
            stage.addEventListener(KeyboardEvent.KEY_UP, movementKeysUp);

            laserTimer = new Timer(1000/1000);
            laserTimer.addEventListener(TimerEvent.TIMER, fireLasers);
            laserTimer.start();
            addChild(laserEmitter);
        }

        public function fly(e:Event):void {
            if(downKey) {
                SpaceShip.x -= Math.sin(utils.degreesToRadians(SpaceShip.rotation)) * REVERSE_SPEED;
                SpaceShip.y += Math.cos(utils.degreesToRadians(SpaceShip.rotation)) * REVERSE_SPEED;
            }
            if(upKey) {
                SpaceShip.x += Math.sin(utils.degreesToRadians(SpaceShip.rotation)) * MOVE_SPEED;
                SpaceShip.y -= Math.cos(utils.degreesToRadians(SpaceShip.rotation)) * MOVE_SPEED;
            }
            if(leftKey) {
                SpaceShip.rotation -= TURN_SPEED;
            }
            if(rightKey) {
                SpaceShip.rotation += TURN_SPEED;
            }
        }

        public function movementKeysUp(e:KeyboardEvent):void { //rotators is key_up :P
            switch(e.keyCode) {
                case 83:
                    downKey = false;
                    break;
                case 65:
                    leftKey = false; // on "a" key_up sets left turn to false. Simple enough.
                    break;
                case 68:
                    rightKey = false; // K. "d" released makes me not turn right.
                    break;
                case 87:
                    upKey = false; // I guess case 87 is "w"
                    break;
                case 32:
                    spacebar = false;
                    break;
            }
        }

        public function movementKeysDown(e:KeyboardEvent):void { // key_down for movers
            switch(e.keyCode) {
                case 83:
                    downKey = true;
                    break;
                case 65:
                    leftKey = true; //so now on key_down for the "a" key it makes me go left! :D
                    break;
                case 68:
                    rightKey = true; //same as lft...
                    break;
                case 87:
                    upKey = true;
                    break;
                case 32:
                    spacebar = true;
                    break;
            }
        }

        public function fireLasers(e:TimerEvent) {
            if(spacebar) {
                laserEmitter.Emit(SpaceShip.x, SpaceShip.y, SpaceShip.rotation);
                addChild(laserEmitter);
            }
        }

        public function getShip():MovieClip {
            return SpaceShip;
        }
    }
}

这是一个独立的类,它应该创建Laser类的新实例并将它们放在舞台上。

    public class shipLasers extends Sprite implements Emittable
    {
        var tempLaserRight:MovieClip;
        var tempLaserLeft:MovieClip;
        var laserArray:Array = [];

        public function shipLasers(stage:Stage):void
        {
        }


        public function Emit(x:int, y:int, rotation:Number):void {
                tempLaserRight = new Laser();
                tempLaserLeft = new Laser();

                tempLaserRight.rotation = tempLaserLeft.rotation = rotation;
                tempLaserRight.x = 200;
                tempLaserLeft.x = 210;
                tempLaserRight.y = 200;
                tempLaserLeft.y = 200;

                laserArray.push(tempLaserRight);
                laserArray.push(tempLaserLeft);
                stage.addChild(tempLaserRight);
                stage.addChild(tempLaserLeft);

                trace("Oh come on!");
        }
    }
}

谢谢!

1 个答案:

答案 0 :(得分:5)

你永远不会在shipLasers类中存储传递的阶段引用,因此你试图引用它自己的内置阶段引用,这可能是null,因为你的shipLasers实例没有添加到显示列表本身。您需要存储在构造函数中传递的stage ref,并使用它来添加子项。

 public class shipLasers ... {
     var theStage:Stage;
     public function shipLasers(aStage:Stage){
         theStage = aStage;
     }
     public function Emit(...) { 
         ...
         theStage.addChild(tempLaserRight);
         thestage.addChild(tempLaserLeft);
     }
 }

更新:首先检查舞台可用性,然后使用舞台参考也是一个好习惯。要执行此操作,您需要在发货类中收听Event.ADDED_TO_STAGE事件,因为它使用右侧和中间的舞台。实现这一目标的共同代码如下:

public function PlayerShip() {
    ....
    // leave here only code that does not require stage 
    if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE,init);
}
private function init(e:Event=null):void {
    removeEventListener(Event.ADDED_TO_STAGE,init);
    // here place all code that's left from your initialization process
    laserEmitter=new shipLasers(stage);
    stage.addEventListener(KeyboardEvent.KEY_DOWN, movementKeysDown);
    stage.addEventListener(KeyboardEvent.KEY_UP, movementKeysUp);
    // etc.
}