LibGDX中Screen的render方法修改Vector2值异常求助
LibGDX Screen中Vector2值异常的排查与修复
问题核心原因
你的代码问题出在按键触发逻辑的时机和变量重复重置上:
1. *=操作符导致数值来回切换
Gdx.input.isKeyPressed()会在按键按住的每帧都返回true,所以每帧都会执行一次acc.x*=-1f和vel.x*=-1f。第一帧数值变负,第二帧又被取反变回正,第三帧再次变负,以此循环,看起来像是数值被重置。
2. =操作符导致速度无法持续加速
你在按键按住的每帧都执行vel.x=-10f,相当于每帧都把速度强行拉回-10,后续的vel.x+=acc.x*delta只能在当前帧给速度加微小增量,下一帧又被重置,自然无法实现持续加速。
修复方案
方案1:单次按键触发方向切换
如果需求是按下LEFT键一次就改变运动方向,改用Gdx.input.isKeyJustPressed()(仅在按键按下的第一帧返回true):
override fun render(delta: Float) { // 渲染代码保持不变 ScreenUtils.clear(0.168627f, 0.356863f, 0.1334f, 1.0f) camera.update() pen.projectionMatrix = camera.combined pen.begin(ShapeRenderer.ShapeType.Filled) pen.color = Color(1.0f, 0.125f, 0.125f, 1.0f) pen.circle(pos.x,pos.y, 25f, 32) pen.end() // 仅在按键按下瞬间翻转方向 if(Gdx.input.isKeyJustPressed(Input.Keys.LEFT)){ acc.x *= -1f vel.x *= -1f } // 每帧都执行运动更新,让加速度持续作用 vel.x += acc.x * delta pos.x += vel.x * delta println("Acc X: ${acc.x}") println("Vel X: ${vel.x}") println("Pos X: ${pos.x}") }
方案2:按住按键时持续加速
如果需求是按住LEFT键时持续向左加速,只在按住时设置加速度,不重置速度,且把运动更新放在按键判断外:
override fun render(delta: Float) { // 渲染代码保持不变 ScreenUtils.clear(0.168627f, 0.356863f, 0.1334f, 1.0f) camera.update() pen.projectionMatrix = camera.combined pen.begin(ShapeRenderer.ShapeType.Filled) pen.color = Color(1.0f, 0.125f, 0.125f, 1.0f) pen.circle(pos.x,pos.y, 25f, 32) pen.end() // 按住LEFT时设置向左加速度,松开可恢复默认(可选) if(Gdx.input.isKeyPressed(Input.Keys.LEFT)){ acc.x = -5f acc.y = -5f } else { // 可选:松开按键时重置加速度 acc.x = 5f acc.y = 5f } // 每帧更新速度和位置,实现持续加速 vel.x += acc.x * delta pos.x += vel.x * delta println("Acc X: ${acc.x}") println("Vel X: ${vel.x}") println("Pos X: ${pos.x}") }
关键注意点
render()方法每帧执行一次,任何放在持续按键判断里的赋值操作都会被重复执行,这是问题的核心。- 运动学公式(速度、位置更新)必须放在每帧都执行的逻辑中,才能让加速度持续改变速度,实现平滑的加速效果。
内容的提问来源于stack exchange,提问作者Smelly Fish
相关产品推荐
相关产品推荐

