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

Java Swing平台跳跃游戏实现玩家离台下落功能问题求助

问题解决方法

异常1:下落速度过快 原因&修复

核心原因

  • 重力被重复调用:run()方法循环内已经主动调用了一次gravity(),checkCollision()方法中玩家离开平台时又会再调用一次,单帧内重力叠加两次导致速度累加过快
  • 终端速度参数设置不合理:TERMINAL_VELOCITY = 200数值过大,120帧刷新率下每秒下落200像素不符合常规平台跳跃游戏手感
  • 冗余变量干扰逻辑:PlatformerPlayer类中的vertical_position变量完全没有和玩家坐标y关联,属于无效代码
  • 速度变量误用static修饰:velocityY、velocityX等实例属性被设为static类变量,数值会被全局共享出现累加异常

修复步骤

  1. 删除run()方法中多余的gravity()调用,仅保留checkCollision()内的重力调用逻辑
  2. 将TERMINAL_VELOCITY数值调整为8~15区间,匹配常规游戏手感
  3. 删除PlatformerPlayer类中所有无效的vertical_position相关代码
  4. 移除velocityY、velocityX、speed变量前的static修饰符,改为实例属性

异常2:下落时按方向键回到平台 原因&修复

核心原因

原有碰撞检测逻辑错误:只要玩家x坐标在平台范围内,就直接强制把y坐标设为平台高度,完全没有判断玩家的垂直位置,导致下落过程中只要x回到平台范围,就会被直接拉回平台上。同时原有平台x范围判断错误:平台实际从x=100的位置开始,原有逻辑错误将x>600判定为离开平台,实际平台右边界是100+600=700。

修复步骤

重写checkCollision()方法的平台碰撞逻辑,只有满足水平在平台范围内+垂直接触平台顶部+正在下落三个条件时,才固定玩家y坐标:

public void checkCollision() {
    // 左右边界碰撞处理
    if(player1.x > SCREEN_WIDTH-PLAYER_WIDTH) {
        player1.x = SCREEN_WIDTH-PLAYER_WIDTH;
    } else if(player1.x < 0) {
        player1.x = 0;
    }

    int platformLeftX = 100;
    int platformRightX = 100 + map.PLATFORM_WIDTH;
    int platformTopY = 400;
    boolean inPlatformXRange = (player1.x + PLAYER_WIDTH > platformLeftX) && (player1.x < platformRightX);
    boolean touchPlatformTop = (player1.y + PLAYER_HEIGHT >= platformTopY) && (player1.y + PLAYER_HEIGHT <= platformTopY + 10) && (player1.velocityY > 0);

    if(inPlatformXRange && touchPlatformTop) {
        // 接触平台,固定位置,清空下落速度
        player1.y = platformTopY - PLAYER_HEIGHT;
        player1.velocityY = 0;
        falling = false;
    } else {
        // 不在平台上,触发重力
        gravity();
        falling = true;
    }

    // 掉出屏幕逻辑,后续补充游戏结束即可
    if(player1.y > SCREEN_HEIGHT) {
        System.out.println("玩家掉出屏幕,触发游戏结束");
        // 后续加游戏结束逻辑:newPlayer() 或者弹出结束页面
    }
}

同时修改run()方法,移除多余的重力调用:

public void run() {
    long lastTime = System.nanoTime();
    double amountOfTicks = 120.0;
    double ns = 1000000000 / amountOfTicks;
    double delta = 0;
    while(true) {
        long now = System.nanoTime();
        delta += (now - lastTime)/ns;
        lastTime = now;
        if(delta >= 1) {
            move();
            checkCollision();
            repaint();
            delta--;
        }
    }
}

修改PlatformerPlayer的gravity()方法,删除无效代码:

public void gravity() {
    velocityY += gravity;
    if (velocityY > TERMINAL_VELOCITY) {
        velocityY = TERMINAL_VELOCITY;
    }
}

内容的提问来源于stack exchange,提问作者banana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 07:57:03