Java Swing平台跳跃游戏实现玩家离台下落功能问题求助
问题解决方法
异常1:下落速度过快 原因&修复
核心原因
- 重力被重复调用:
run()方法循环内已经主动调用了一次gravity(),checkCollision()方法中玩家离开平台时又会再调用一次,单帧内重力叠加两次导致速度累加过快 - 终端速度参数设置不合理:
TERMINAL_VELOCITY = 200数值过大,120帧刷新率下每秒下落200像素不符合常规平台跳跃游戏手感 - 冗余变量干扰逻辑:
PlatformerPlayer类中的vertical_position变量完全没有和玩家坐标y关联,属于无效代码 - 速度变量误用static修饰:
velocityY、velocityX等实例属性被设为static类变量,数值会被全局共享出现累加异常
修复步骤
- 删除
run()方法中多余的gravity()调用,仅保留checkCollision()内的重力调用逻辑 - 将
TERMINAL_VELOCITY数值调整为8~15区间,匹配常规游戏手感 - 删除
PlatformerPlayer类中所有无效的vertical_position相关代码 - 移除
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
相关产品推荐
相关产品推荐

