检测到精灵碰撞,但捕捉到碰撞形状的另一侧
我的精灵/它的碰撞形状正在与我的左墙和右墙碰撞,但如果光标穿过该形状的一半左右,它会将精灵捕捉到它的另一侧。请参阅此处。
我在让我的精灵碰撞时遇到了很多麻烦,但后来在 Reddit 上看到了这篇文章。所以我将“
velocity * (1 / delta)
”方程应用于move_and_collide()
,它发生了碰撞,但有一些奇怪的捕捉问题。
extends CharacterBody2D
func _ready():
pass
func _physics_process(delta):
var mouse_pos = get_global_mouse_position()
self.position.x = mouse_pos.x
move_and_collide(velocity * (1 / delta))
我尝试使碰撞形状变大,但精灵会捕捉到其顶部而不是另一侧。不确定我是否完全理解
move_and_collide(velocity * (1 / delta))
,所以也许知道它到底在做什么可能会有所帮助。查看了 move_and_collide()
的文档,velocity * (1 / delta)
的结果是“运动”,即 X 轴位置值?
无论如何,我们将不胜感激任何帮助。谢谢!
self.position.x = mouse_pos.x
允许CharacterBody2D 沿x 轴“传送”。然而,当它传送到碰撞对象上时,它会到达其自身碰撞形状不与另一个碰撞形状重叠的最近位置(这就是为什么使碰撞形状更宽可能会导致精灵“捕捉”到其顶部,因为退出碰撞的最短路径是向上)。
如果您想防止精灵完全移动到墙壁所包含的区域之外,您可能需要为每面墙使用 WorldBoundaryShape2D。这将迫使精灵捕捉到形状手臂所在的一侧。
但是,当直接将
position.x
设置为鼠标位置时,这可能表现不佳,因此您可能只想在脚本中简单地定义边界,并防止当鼠标位于边界之外时位置发生变化:
# x-positions of the left and right boundaries
const BOUNDARY_LEFT = -100
const BOUNDARY_RIGHT = 100
func _physics_process(delta):
var mouse_pos = get_global_mouse_position()
# Move to the mouse position if it is in-bounds
if mouse_pos.x > BOUNDARY_LEFT and mouse_pos.x < BOUNDARY_RIGHT:
self.position.x = mouse_pos.x
move_and_collide(velocity * (1 / delta))
至于
move_and_collide()
,参数是 Vector2,它本质上代表了物体在此物理更新中想要移动的位移,如果沿该位移检测到碰撞,则物体不会移动。
将
velocity * (1 / delta)
传递到 move_and_collide()
与传递零向量 Vector2(0, 0)
相同,因为默认速度为零,并且脚本中没有任何内容会改变它。这很好,因为您直接控制身体的位置而不是速度,但您可能只想传递零向量或典型的 velocity * delta
以避免将来出现任何问题。