在舞台上添加敌人和棋子的最佳方式



我试图开发简单的棋子(玩家)和敌人职业,但有 2 个故事,每个故事都有自己的问题。

首先:当Pawn和敌人通过文档类中的代码添加到阶段时,我有优势按实例名称使用它们,我曾经将它们添加到命中测试之类的事情上(我猜)

第二:当我通过将它们从一个库拖到另一个舞台来将它们添加到舞台时。 这样,我可以将事件侦听器添加到其中的舞台(用于运动),但访问它们变得困难,有时空舞台是我最大的问题。

有什么建议可以让事情变得简单吗?

例如,在下面的pawn

类中,我将键盘侦听器添加到舞台上,但是当我通过添加子将此pawn添加到舞台时,我可以访问null ...错误

package  {
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class pwn extends MovieClip {
    public var upPressed:Boolean = false;
    public var downPressed:Boolean = false;
    public var leftPressed:Boolean = false;
    public var rightPressed:Boolean = false;
    public var lastMove:String;
    public static var spd:Number=6;

    public function pwn() {
        addEventListener(Event.ENTER_FRAME, fl_MoveInDirectionOfKey);
        stage.addEventListener(KeyboardEvent.KEY_DOWN, fl_SetKeyPressed);
        stage.addEventListener(KeyboardEvent.KEY_UP, fl_UnsetKeyPressed);

    }
    //Movement
    public function fl_MoveInDirectionOfKey(event:Event){
        if (leftPressed){
            x -= spd;
            if(currentFrame < 18 || currentFrame > 24){
                gotoAndPlay(17);
            }
        }else
        if (rightPressed){
            x += spd;
            if(currentFrame < 26 || currentFrame > 31){
                gotoAndPlay(25);
            }
        }else
        if (upPressed){
            y -= spd;
            if(currentFrame < 10 || currentFrame > 16){
                gotoAndPlay(9);
            }
        }else
        if (downPressed){
            y += spd;
            if(currentFrame < 2 || currentFrame > 8){
                gotoAndPlay(1);
            }
        }
    }
    public function fl_SetKeyPressed(event:KeyboardEvent):void{
        switch (event.keyCode){
            case 87:
            case 38:{
                upPressed = true;
                break;
            }
            case 83:
            case 40:{
                downPressed = true;
                break;
            }
            case 65:
            case 37:{
                leftPressed = true;
                break;
            }
            case 68:
            case 39:{
                rightPressed = true;
                break;
            }
        }
    }
    public function fl_UnsetKeyPressed(event:KeyboardEvent):void{
        switch (event.keyCode){
            case 87:
            case 38:{
                upPressed = false;
                break;
            }
            case 83:
            case 40:{
                downPressed = false;
                break;
            }
            case 65:
            case 37:{
                leftPressed = false;
                break;
            }
            case 68:
            case 39:{
                rightPressed = false;
                break;
            }
        }
    }
}
}

在这些情况下你会做什么?

此问题有两种解决方案。首先让我解释一下,当您创建一个新的显示对象并且尚未将其添加到舞台或显示列表中的任何对象时,它对该舞台的引用为 null。因此,一种方法是在 pawn 类构造函数中传递对阶段的引用:

public function pwn(stageRef:Stage) {
    addEventListener(Event.ENTER_FRAME, fl_MoveInDirectionOfKey);
    stageRef.addEventListener(KeyboardEvent.KEY_DOWN, fl_SetKeyPressed);
    stageRef.addEventListener(KeyboardEvent.KEY_UP, fl_UnsetKeyPressed);
}

第二种方法是使用 ADDED_TO_STAGE 事件:

public function pwn() {
    addEventListener(Event.ENTER_FRAME, fl_MoveInDirectionOfKey);
    this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
private function onAddedToStage(e:Event):void {
    stage.addEventListener(KeyboardEvent.KEY_DOWN, fl_SetKeyPressed);
    stage.addEventListener(KeyboardEvent.KEY_UP, fl_UnsetKeyPressed);
}

最新更新