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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:04:53