AS3游戏开发:按住上键时如何阻止jumping变量重复更新?
解决AS3 Flash游戏空中冲刺重复触发问题
问题根源
当前代码在gameLoop中每帧都会遍历按键数组处理上键逻辑,按住上键时每帧都会执行冲刺相关代码,导致重复触发。需要新增一个状态变量来控制空中冲刺仅能触发一次,直到角色落地重置状态。
修改方案
- 添加
hasAirDashed变量跟踪是否已使用空中冲刺 - 修改上键处理逻辑,仅在
jumping且未使用过空中冲刺时触发冲刺,并标记已使用 - 角色落地时重置
hasAirDashed,允许下次跳跃再次冲刺
修改后的完整代码
import flash.events.KeyboardEvent; import flash.events.Event; level.gotoAndStop(1); stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown); stage.addEventListener(KeyboardEvent.KEY_UP, keyUp); stage.addEventListener(Event.ENTER_FRAME, gameLoop); var speedX = 0; var speedY = 10; var keys = []; var jumping = true; var hasAirDashed:Boolean = false; // 新增:跟踪空中冲刺状态 player.gotoAndStop(1); function gameLoop(event:Event):void { speedX = 0; if (player.x > 550) { level.nextFrame(); player.x = 0 } if (player.x < 0) { level.prevFrame(); player.x = 500 } for(var i:Number = 0; i < keys.length; i++) { switch(keys[i]) { case 38: // Up arrow key if(jumping && !hasAirDashed){ // 修改:增加hasAirDashed判断 player.gotoAndStop(3); speedX = 10 * player.scaleX; hasAirDashed = true; // 标记已使用空中冲刺 break; } // 仅在未跳跃时执行起跳逻辑 if(!jumping) { speedY = -16; jumping = true; } break; case 37: // Left arrow key speedX -= 5; player.scaleX = -1; player.gotoAndStop(2); break; case 39: // Right arrow key speedX += 5; player.scaleX = 1; player.gotoAndStop(2); break; } } if(speedX == 0) player.gotoAndStop(1); player.x += speedX; player.y += speedY; speedY++; while(level.hitTestPoint(player.x, player.y + player.height / 2, true)) { player.y--; // 把角色放在地面上方 speedY = 0; // 重置垂直速度 jumping = false; hasAirDashed = false; // 修改:落地时重置空中冲刺状态 } while(level.hitTestPoint(player.x + player.width / 2, player.y, true)) { player.x--; // 调整角色位置避免穿墙 speedX = 0; // 重置水平速度 } while(level.hitTestPoint(player.x - player.width / 2, player.y, true)) { player.x++; // 调整角色位置避免穿墙 speedX = 0; // 重置水平速度 } } function keyDown(event:KeyboardEvent):void { if(keys.indexOf(event.keyCode) == -1) keys.push(event.keyCode); } function keyUp(event:KeyboardEvent):void { var index:Number = keys.indexOf(event.keyCode); if(index != -1) keys.splice(index, 1); }
关键修改说明
- 新增
hasAirDashed变量,记录当前跳跃周期内是否已经触发过空中冲刺 - 上键逻辑中,只有当
jumping为true且hasAirDashed为false时才执行冲刺,并将hasAirDashed设为true,避免重复触发 - 角色落地时(
jumping被设为false的地方),同步重置hasAirDashed为false,确保下次跳跃可以再次使用空中冲刺 - 同时调整了起跳逻辑的判断,仅在角色未跳跃时才执行起跳,避免按住上键时重复触发起跳(原代码中按住上键会每帧设置
speedY=-16,导致角色持续上升)
内容的提问来源于stack exchange,提问作者Gabe Is Here
相关产品推荐
相关产品推荐

