动作脚本3,字符选择

时间:2014-03-10 22:20:36

标签: actionscript-3 flash game-engine

我正在为我的作业制作一个Flash游戏。 在我开始之前,我不是要求代码,我要求的是看我如何使编码高效。 (如果你愿意,此时你可以给我提示)

在我的游戏中,玩家可以选择两个角色。当玩家选择第一个角色时,布尔值变为真,该玩家可以玩。

但我讨厌的是我必须把代码加倍。

    private function keyUp(e:KeyboardEvent):void 
    {

        if (e.keyCode == 38)
        {
            if (playPrincess)
            {
                upKey = false;
                caroline.standStill();
            }
            else
            if (playSirTimmy)
            {
                upKey = false;
                timmy.standStill();             
            }
        }
    }
例如,从这段代码中你可以看到,如果玩家正在玩timmy,那么“playSirTimmy”是真的,如果那是真的那么,我希望代码能够自己说话。

这是另一个例子。

    private function SirTimmyMovement():void 
    {
        if (playSirTimmy)
        {
            if (rightKey)
            {
                timmy.moveRight();
            }

            if (leftKey)
            {
                timmy.moveLeft();
            }       

            if (upKey)
            {
                timmy.moveUp();
            }
        }

    }
    private function playPrincessMovement():void 
    {
        if (playPrincess)
        {
            if (rightKey)
            {
                caroline.moveRight();
            }

            if (leftKey)
            {
                caroline.moveLeft();
            }       

            if (upKey)
            {
                caroline.moveUp();
            }
        }

    }

现在我不抱怨或呻吟,我喜欢编码,这很有趣/具有挑战性,我只想知道是否有其他方法来缩短代码,并使其高效。

感谢您的时间。

就是这样,当涉及到碰撞和敌人时,事情就会变成特迪奥和更难。

编辑:对于Martyn

    private var character:player;
    private var timmy:SirTimmy;
    private var caroline:princess;


    public function Main() 
    {
        //iniation players
        character = new player;
        timmy = new SirTimmy;
        caroline = new princess;
        stage.addEventListener(Event.ENTER_FRAME, mainGameLoop)
    }

    private function choosePrincess(e:MouseEvent):void 
    {
        if (e.target == princessBtn)
        {
            //playPrincess = true;
            level1Check();
            character = caroline;

        }
    }

    private function startLevel1():void 
    {
        if (easyMode)
        {
            //set variables

        }

        if (medMode)
        {
            //you askng for it
        }

        if (hardMode)
        {
            //set variables harder!
        }


        stage.addChild(character);







    }

谢谢你,像魅力一样!

2 个答案:

答案 0 :(得分:1)

而不是布尔值,只有一个属性可以存储您选择的字符:

private var player:Player;

选择角色时,只需更新该属性:

player = timmy; // or caroline

这样,您的所有代码只需要引用它,并且可以更加通用化:

private function movement():void 
{
    if(player === null)
    {
        // Don't run this function if neither character has been selected yet.
        return;
    }

    if(rightKey) player.moveRight();
    if(leftKey) player.moveLeft();      
    if(upKey) player.moveUp();
}

答案 1 :(得分:1)

您正在寻找的是所谓的状态机或状态设计模式。因此,无论选择何种角色,他们都使用类似的方法: moveLeft() moveRight() moveUp()

关于国家设计模式的四人帮:

允许对象在其内部状态更改时更改其行为。该对象似乎会更改其类。


因此,对于您提供的代码,一个非常基本的想法是对两个字符使用相同的状态机,并且只是从该状态机操纵正确的对象。以下是如何执行此操作的示例:

创建状态机! :

import flash.ui.Keyboard;

class StateMachine {
    private var character:Player;
    private var state:String; //store the current state we are in, right, left, up etc

    public function StateMachine( character:Player ) {
        this.character = character; //set the character to control states on
    }

    //handle the input from the keyboard event
    public function handleInput( event:Object ):void {
        switch( event.type ) {
            case "keyDown":
                if ( event.keyCode == Keyboard.RIGHT ) {
                    state = Keyboard.RIGHT;
                }
                if ( event.keyCode == Keyboard.UP ) {
                    state = Keyboard.UP;
                }
                if ( event.keyCode == Keyboard.LEFT ) {
                    state = Keyboard.LEFT;
                }
                if ( event.keyCode == Keyboard.DOWN ) {
                    state = Keyboard.DOWN;
                }
                break;
            case "keyUp":
                if ( event.keyCode == state ) {
                    state = 0;
                }
                break;
        }
    }

    //on our update, apply the right function
    public function update():void {
        if ( state == KEYBOARD.RIGHT ) {
            character.moveRight(); 
        }
        if ( state == KEYBOARD.DOWN ) {
            character.moveDown(); 
        }
        if ( state == KEYBOARD.LEFT) {
            character.moveLeft(); 
        }
        if ( state == KEYBOARD.UP ) {
            character.moveUp(); 
        }
    }

现在这里是最好的部分,在你处理角色动作时,你可以让状态机处理它,而不是使用所有布尔值为正确的玩家。因此,首先选择角色时,我们可以创建一个新的状态机:

private var stateMachine:StateMachine;

private function keyUp(e:KeyboardEvent):void 
{

    if (e.keyCode == 38)
    {
        if (playPrincess)
        {
            upKey = false;
            stateMachine = new StateMachine( caroline );
            caroline.standStill();
        }
        else
        if (playSirTimmy)
        {
            upKey = false;
            stateMachine = new StateMachine( timmy ); 
            timmy.standStill();
        }
    }
}

现在您可以拥有一个处理键盘输入的移动功能,您可以将KEY_DOWNKEY_UP事件设置为此功能,状态机可以处理这两个事件:

private function onKeyMovement( e:KeyboardEvent ):void {
   stateMachine.handleInput( e.keyCode );
}

最后,在您的更新功能中(无论是事件框架还是其他内容),请致电stateMachine.update();,即:

private function myUpdateFunction( e:Event ):void {
    stateMachine.update();
}

这应删除所有关键的布尔值,并让状态机处理所有输入。

希望有所帮助!