代码之家  ›  专栏  ›  技术社区  ›  Moynul

动作脚本3,角色选择

  •  2
  • Moynul  · 技术社区  · 10 年前

    我正在为我的任务做一个快闪游戏。 现在,在我开始之前,我不是在要求代码,我所要求的是看看如何使我的代码高效。(在这一点上,如果你愿意,你可以给我一些提示)

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

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

        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 回复  |  直到 10 年前
        1
  •  1
  •   Marty    10 年前

    不要使用布尔值,而是使用一个属性来存储您选择的字符:

    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();
    }
    
        2
  •  1
  •   Bennett Keller    10 年前

    您正在寻找的是所谓的状态机或状态设计模式。因此,无论选择什么角色,他们都使用类似的方法: 向左移动() , 向右移动() 上移() .

    “四人帮”论国家设计模式:

    允许对象在其内部状态更改时更改其行为。对象将显示为更改其类。


    因此,您所提供的代码的一个基本思想是对两个字符使用相同的状态机,并从该状态机中操作正确的对象。以下是如何做到这一点的示例:

    创建状态机!:

    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_DOWN KEY_UP 此函数的事件,状态机处理这两个事件:

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

    最后,在更新函数中(无论是事件帧还是类似的内容),调用 stateMachine.update(); 即:

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

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

    希望这有帮助!