我目前正在使用闪光灯构建一个小版本的格斗游戏,但我不希望角色通过按住一个键来连续击中等等,而是每次按下按键。这就是我目前所拥有的:
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;
}
}
但正如我所解释的那样,按钮可以按住。
答案 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
注册。正如您所看到的,您有一些选择,并且有多种方法可以做到这一点。希望这能提供一些指导。