使用move_and_collide时CharacterBody2D移动过快,如何修复?
解决Pong游戏Paddle移动问题的方案
你的代码存在两个核心问题,直接修改即可解决,具体方案如下:
修改后的代码
extends CharacterBody2D var speed: float = 300.0 # 调高数值,因为乘以delta后实际速度会更合理 func _physics_process(delta): # 每次物理帧开始时重置y轴速度,松开按键后就会停止移动 velocity.y = 0 if Input.is_action_pressed("p2_up"): velocity.y = -speed * delta elif Input.is_action_pressed("p2_down"): velocity.y = speed * delta move_and_collide(velocity) # 限制paddle在屏幕内,防止移出可视区域 var screen_size = get_viewport_rect().size var half_height = sprite.texture.get_height() / 2 # 假设你用Sprite节点作为paddle的视觉载体 position.y = clamp(position.y, half_height, screen_size.y - half_height)
关键修改点说明
- 重置速度:每次
_physics_process开头把velocity.y设为0,这样松开方向键后,paddle不会保留之前的速度持续移动,解决了"按一次就一直动"的问题。 - 乘以delta:
speed * delta让移动速度和帧率解绑,不管游戏运行帧率高低,paddle的实际移动速度都是稳定一致的。你可以根据手感调整speed数值,300左右是比较通用的初始值。 - 限制屏幕范围:通过
clamp函数把paddle的y轴位置限制在屏幕内,避免完全移出画面。计算边界时要考虑paddle自身高度,防止出现一半paddle被切掉的情况。
另外补充:其实你之前尝试的Input.get_axis()更适合这个场景,代码会更简洁,同样能解决问题:
extends CharacterBody2D var speed: float = 300.0 func _physics_process(delta): velocity.y = Input.get_axis("p2_up", "p2_down") * speed * delta move_and_collide(velocity) # 同样加上屏幕范围限制 var screen_size = get_viewport_rect().size var half_height = sprite.texture.get_height() / 2 position.y = clamp(position.y, half_height, screen_size.y - half_height)
Input.get_axis()会直接返回-1(上)、0(无输入)、1(下)的数值,刚好对应y轴速度方向,无需手动重置速度,代码更简洁高效。
内容的提问来源于stack exchange,提问作者Dagger
相关产品推荐
相关产品推荐

