检测到精灵碰撞,但捕捉到碰撞形状的另一侧

问题描述 投票:0回答:1

检测到精灵碰撞,但捕捉到碰撞形状的另一侧

我的精灵/它的碰撞形状正在与我的左墙和右墙碰撞,但如果光标穿过该形状的一半左右,它会将精灵捕捉到它的另一侧。请参阅此处

我在让我的精灵碰撞时遇到了很多麻烦,但后来在 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 轴位置值? 无论如何,我们将不胜感激任何帮助。谢谢!

2d game-development godot gdscript
1个回答
0
投票

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
以避免将来出现任何问题。

© www.soinside.com 2019 - 2024. All rights reserved.