You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AS3游戏开发:按住上键时如何阻止jumping变量重复更新?

解决AS3 Flash游戏空中冲刺重复触发问题

问题根源

当前代码在gameLoop中每帧都会遍历按键数组处理上键逻辑,按住上键时每帧都会执行冲刺相关代码,导致重复触发。需要新增一个状态变量来控制空中冲刺仅能触发一次,直到角色落地重置状态。

修改方案

  1. 添加hasAirDashed变量跟踪是否已使用空中冲刺
  2. 修改上键处理逻辑,仅在jumping且未使用过空中冲刺时触发冲刺,并标记已使用
  3. 角色落地时重置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 22:40:03