我如何在as3中激活多个密钥

时间:2016-05-14 18:27:30

标签: actionscript-3 flash

我正在制作一个正在运行的游戏,其中英雄会跑,面对障碍并通过跳跃和滑动来阻挡障碍物。

现在英雄将在用户按下D时运行并且它会一直运行直到一个固定点,但问题是一旦英雄开始运行另一个按钮W = jump并且S = slide无效。

我希望这个2按钮在英雄运行时起作用。

这是我的代码

import flash.display.Stage;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.display.MovieClip;
import flash.events.Event;

kim.gotoAndStop("hero Stand");

var dPressed:Boolean = false;
var aPressed:Boolean = false;
var jumping:Boolean = false;
var sPressed:Boolean = false;

stage.addEventListener(KeyboardEvent.KEY_DOWN , keyDownHandaler);
stage.addEventListener(KeyboardEvent.KEY_UP , KeyUpHandaler);
stage.addEventListener(Event.ENTER_FRAME , gameLoop);

function keyDownHandaler(Devent:KeyboardEvent):void
{
        if (Devent.keyCode == Keyboard.D )
            {
                dPressed = true;
            }

        else if (Devent.keyCode == Keyboard.S && !jumping && !sPressed)
            {
                sPressed = true;
            }
        else if (Devent.keyCode == Keyboard.W && !jumping && !sPressed)
            {
                jumping = true;
            }

function KeyUpHandaler (Uevent:KeyboardEvent):void 
{
    if (Uevent.keyCode == Keyboard.D)
        {
            //dPressed = false; (i commented this so that hero don't stop running)
            //hero.gotoAndStop("hero Stand");
        }

    else if(Uevent.keyCode == Keyboard.W)
    {
            jumping = false; 
            hero.gotoAndStop("heroStand");
    }

    else if(Uevent.keyCode == Keyboard.S)
    {
            sPressed = false;
            hero.gotoAndStop("hero Stand");
    }
}

function gameLoop(Levent:Event):void
{
    if (dPressed)
         {
        hero.x += 10;   
        hero.gotoAndStop("hero Run");
        }

    else if(jumping)
        {
             hero.y -= 15;
            hero.x += 10;
            hero.gotoAndStop("hero Jump");
        }

    else if(sPressed) {

            hero.x += 10;
            hero.gotoAndStop("hero Slide");
            }   
    }

1 个答案:

答案 0 :(得分:0)

因为您使用的是else if语句。相反,只需使用单独的if语句。 AS3将仅根据需要读取else if逻辑块以便找到真实条件,此时它会执行该位代码然后退出到else if的末尾声明,跳过它之后的所有内容。如果你想要测试所有条件(他是否正在运行?他是否正在跳?他是否正在滑动?)无论其他按键的状态如何,那么只需使用{ {1}}语句。仅当您希望仅在先前条件为假时保留要运行的代码时才使用if

在你的情况下我想你只希望玩家能够在他跑步时滑动但跳跃,对吗?所以这可能是这样的:

else if

您必须同样更改其他逻辑语句。

我不会在键盘事件处理程序部分使用任何If (dPressed) { hero.x += 10; hero.goToAndPlay("hero run"); } If (jumping) { // this code will run regardless of if dPressed is true hero.y -= 15; } else if (sPressed) { // this code will only be read if jumping is not true (you can't jump and slide at the same time) hero.goToAndStop("hero slide"); } 语句。我认为AS3总是更好地检查被按键的状态...处理else函数中的逻辑。