单击按钮单击操作

时间:2014-02-25 23:30:09

标签: actionscript-3 flash

我目前正在使用闪光灯构建一个小版本的格斗游戏,但我不希望角色通过按住一个键来连续击中等等,而是每次按下按键。这就是我目前所拥有的:

function moveChar(event:Event):void{
if(rightKeyDown && !hitting && !combo){
    hitting = true;
    gotoAndPlay("basic_punch");
    kickbag.gotoAndPlay("hit1");
    countHits++;
}
if(downKeyDown && !hitting && !combo){
    hitting = true;
    gotoAndPlay("basic_kick");
    kickbag.gotoAndPlay("hit1");
    countHits++;
}
if(downKeyDown && combo){
    gotoAndPlay("kick_combo1");
    kickbag.gotoAndPlay("hit2");
    kickbag.stop();
}
if(rightKeyDown && combo){
    gotoAndPlay("punch_combo");
    kickbag.gotoAndPlay("hit2");
    kickbag.stop();
}
}

function checkKeysDown(event:KeyboardEvent):void{
    if(countHits == 2) bar.gotoAndStop("bar2");
    if(countHits == 6) bar.gotoAndStop("bar3");
    if(countHits == 10) {
        bar.gotoAndStop("bar4");
        combo = true;
        gotoAndPlay("combo_stand");
    }
    if(event.keyCode == 39 || event.keyCode == 68){
        rightKeyDown = true;
    }
    else if(event.keyCode == 40 || event.keyCode == 83){
        downKeyDown = true;
    }
}

function checkKeysUp(event:KeyboardEvent):void{
    if(event.keyCode == 39 || event.keyCode == 68){
        rightKeyDown = false;
    }
    else if(event.keyCode == 40 || event.keyCode == 83){
        downKeyDown = false;
    }
}

但正如我所解释的那样,按钮可以按住。

3 个答案:

答案 0 :(得分:1)

创建onKeyDown和onKeyUp侦听器。在onKeyDown监听器中,杀死onKeyDown监听器,执行操作,并初始化onKeyUpListener。在onKeyUp侦听器中,终止onKeyUp侦听器并重新启动onKeyDown侦听器。

答案 1 :(得分:0)

我也一直在制作一个平台游戏Flash游戏,这就是我如何完成一个干净的攻击代码:声明一个“攻击”布尔值来帮助决定角色是否可以攻击。您可以通过创建一个输入帧事件侦听器来阻止角色持续攻击,该侦听器可以检查角色在攻击期间所处的帧。如果角色播放头位于动画的最后一帧,而不是简单地将攻击布尔值设置为false。

答案 2 :(得分:0)

我认为 @Ribs 是在正确的轨道上,但鉴于您当前的代码,答案似乎很简单。

Event.ENTER_FRAME移除 moveChar()并更改功能定义行,使其如下所示:

function moveChar():void //e:Event removed from parameters
在您的checkKeysDown函数中

然后,请为moveChar()调用按下的键(您的moveChar()无论如何评估布尔值):

if(event.keyCode == 39 || event.keyCode == 68){
    rightKeyDown = true;
    moveChar();
}
else if(event.keyCode == 40 || event.keyCode == 83){
    downKeyDown = true;
    moveChar();
}

现在你可以改变上面的if语句,使它更具体一些:

if ( !downKeyDown && !rightKeyDown ) {
    if(event.keyCode == 39 || event.keyCode == 68){
        rightKeyDown = true;
        moveChar();
    }
    else if(!downKeyDown && !rightKeyDown && (event.keyCode == 40 || event.keyCode == 83)){
        downKeyDown = true;
        moveChar();
    }
}

这基本上只是处理一次按下一个向下或向右键,并在运行时忽略其他所有内容。也可以假设您在按下向下或向右键时可能不想做任何事情,因此您可以这样做:

function checkKeysDown(event:KeyboardEvent):void{
    if ( downKeyDown || rightKeyDown ) return; //do nothing, we are pressing a key
    if(countHits == 2) bar.gotoAndStop("bar2");
    if(countHits == 6) bar.gotoAndStop("bar3");*/
    if(countHits == 10) {
        bar.gotoAndStop("bar4");
        combo = true;
        gotoAndPlay("combo_stand");
    }
    if(event.keyCode == 39 || event.keyCode == 68){
        rightKeyDown = true;
        moveChar();
    }
    else if(event.keyCode == 40 || event.keyCode == 83){
        downKeyDown = true;
        moveChar();
    }
}

如果我们当前正在按向下或向右键,则会在checkKeyDown函数中返回。我假设这可能是您想要的效果,因此您的计数器不会增加每个KEY_DOWN注册。正如您所看到的,您有一些选择,并且有多种方法可以做到这一点。希望这能提供一些指导。