2013-02-12 98 views
0

嗯问题是我在我的游戏中遇到了麻烦。如果我使用KEY_DOWN事件和/或ENTER_FRAME,当我按住踢球或拳击按钮时,战斗机会不断对敌人造成伤害,但我希望他可以踢,然后返回到静止位置或踢,并能够保持姿势但只会造成一次伤害。这里有一些代码:战斗机游戏as3,KeyboardEvent.KEY_DOWN问题

stage.addEventListener(KeyboardEvent.KEY_DOWN, enterAttack); 
stage.addEventListener(KeyboardEvent.KEY_UP, exitAttack); 
stage.addEventListener(Event.ENTER_FRAME, attackYes); 
stage.addEventListener(Event.EXIT_FRAME, attackNo); 

function enterAttack(evt:KeyboardEvent):void 
{ 
    if (evt.keyCode == 84) 
    { 
     attack = true; 
    } 
} 
function exitAttack(evt:KeyboardEvent):void 
{ 
    attack = false; 
} 
function attackYes(evt:Event):void 
{ 
    if (attack) 
    { 
     hero.gotoAndStop("punch1"); 

     checkHitRed(); 
     checkIfDead(); 
    } 
} 
function attackNo(evt:Event):void 
{ 
    if (!attack) 
    { 
     hero.gotoAndStop("still"); 
    } 
} 

我试图删除某处的听众,但总是让它看起来像战斗机没有做任何攻击。

有什么办法可以防止按下踢/打按钮吗?

任何帮助表示赞赏

+0

你为什么不在'KeyboardEvent.KEY_UP'上执行命中?这自然会造成命中之间的延迟。 – Gio 2013-02-12 06:18:29

回答

0

你必须为你的能力设计冷却时间,例如, “踢”每20帧只能发生一次。所以,当玩家按下踢按钮时,char会踢,造成伤害并设置冷却时间变量。输入框架监听器开始减少计数器,并且随后的kick命令在冷却时间被忽略时被忽略。

stage.addEventListener(KeyboardEvent.KEY_DOWN, enterAttack); 
stage.addEventListener(Event.ENTER_FRAME, enterFrame); 
var kickCooldown:int=0; 
function enterAttack(evt:KeyboardEvent):void 
{ 
    if (evt.keyCode == 84) 
    { 
     if (!kickCooldown) { 
      attack = true; 
      kickCooldown=15; 
     } 
    } 
} 
function enterFrame(evt:Event):void 
{ 
    if (attack) 
    { 
     hero.gotoAndStop("punch1"); 
     attack=false; // we have attacked once, now dealing damage 
     checkHitRed(); 
     checkIfDead(); 
    } 
    if (kickCooldown>0) kickCooldown--; // waiting for cooldown end 
    else hero.gotoAndStop("still"); // if ends, return hero to "still" posture 
} 
+0

谢谢你的快速回复,Vesper这正是我所需要的,非常感谢你! – 2013-02-12 12:33:31

0

字符状态,分为三种类型。如下。

stage.addEventListener(KeyboardEvent.KEY_DOWN, enterAttack); 
stage.addEventListener(KeyboardEvent.KEY_UP, exitAttack); 
stage.addEventListener(Event.ENTER_FRAME, onAction); 

var characterState:String = "wait" 
function enterAttack(evt:KeyboardEvent):void 
{ 
    if (evt.keyCode == 84) 
    { 
     characterState = "attack"; 
    } 
} 
function exitAttack(evt:KeyboardEvent):void 
{ 
    characterState = "attack_ended"; 
} 
function onAction(evt:Event):void 
{ 
    if(characterState == "wait") return; 

    if(characterState == "attack") 
    { 
     hero.gotoAndStop("punch1"); 

     checkHitRed(); 
     checkIfDead(); 
    } 
    else if(characterState == "attack_ended") 
    { 
     hero.gotoAndStop("still"); 
     //Revert to wait state after the attack termination . 
     characterState = "wait"; 
    } 
}