2

我一直在尝试使用 KinematicBody2D 的 test_move() 来查看我的角色是否靠近墙壁,但没有触摸它,但我遇到了一些麻烦,因为实际文档只是

bool test_move( Transform2D from, Vector2 rel_vec, bool infinite_inertia=true )

Checks for collisions without moving the body. Virtually sets the node's position, scale and rotation to that of the given Transform2D,

然后尝试沿着向量 rel_vec 移动身体。如果发生碰撞,则返回 true。

我能找到的所有教程都只显示了该函数的旧版本,其中唯一的参数是 Vector2,它更简单一些。

据我了解,Transform2D 是要测试的对象初始位置,Vector2 给出它应该移动的方向,无限惯性处理对象是否在撞击时旋转。

我现在的问题是 Transform2D,到目前为止,我在文档中找到的唯一一个似乎应该以该格式返回对象变换的函数是 CollisionObject2D

shape_owner_get_transform( int owner_id ) const

Returns the shape owner's Transform2D.

但无论我尝试什么,我似乎总是从中得到一个单位矩阵,我最终试图弄清楚这一点的代码看起来像

var transform2d = Transform2D(owner.shape_owner_get_transform(owner.get_shape_owners()[0]))

if owner.test_move(transform2d, Vector2(-20, 0), true):
  print("on your left").

我不确定我误解了哪个函数,无论是我用来获取 owner_id 的 test_move()、shape_owner_get_transform() 还是 get_shape_owners(),但我们将不胜感激。

4

1 回答 1

2

将在这里回答我自己的问题,因为我在发布问题后不久就解决了它。我的问题是这owner.shape_owner_get_transform(owner.get_shape_owners()[0])不是一个人将如何进行身体的转变。相反,我需要用我的角色的位置和旋转构造一个 Transform2D。

最后我的 next_to_wall() 函数看起来像:

func next_to_wall(distance):
    var transform2d = Transform2D(0.0, owner.position)

    if owner.test_move(transform2d, Vector2(distance, 0), true):
        return true
    else:
        return false

请注意,我为第一个参数输入了 0.0,因为这仅适用于我的情况,否则它将是 owner.rotation。

于 2019-07-31T01:29:50.923 回答