传递Physics2DShapeQueryParameters 层进行检查

2024-04-04

我目前正在为我的 2D 自上而下游戏开发一个构建系统,最后一步是检查是否有任何物体(例如树或玩家)阻碍了物品的放置。经过一些研究后,我发现使用Physics2DShapeQueryParameters 是正确的方法。我唯一的问题是我不知道如何传递碰撞层,以便在查询期间使用第 3 行的 .collision_layer 方法进行检查。如有任何见解,我们将不胜感激,提前谢谢您!

var spaceState = get_world_2d().direct_space_state
var query = Physics2DShapeQueryParameters.new()
query.collision_layer = Layer1?????????? | Layer2????????????
var staticBody = get_node(itemName +"/StaticBody2D")
for shapeOwner in staticBody.get_shape_owners():
    var shape = staticBody.shape_owner_get_shape(shapeOwner, 0)
    shape.extents -= Vector2.ONE
    query.set_shape(shape)
    query.transform = staticBody.shapeOwner_get_owner(0).global_transform
    query.collide_with_areas = true
    var result = spaceState.intersect_shape(query,1)
    shape.extents += Vector2.ONE
    if result.size() != 0:
        canBePlaced = false
        return
canBePlaced = true

首先,如果你有一个带有所需碰撞层的对象,你可以复制它:

query.collision_layer = object.collision_layer

为了构建价值,要知道它们是两个的幂:

  • 第 1 层是 2 的一次方(2 的 0 次方,等于 1)。
  • 第 2 层是 2 的二次方(2 的 1 次方,等于 2)。
  • 第 3 层是 2 的三次方(2 的 2 次方,等于 4)。

等等。


下面的所有示例都将设置第 6 层和第 8 层。

下面的内容虽然效率低下,但足够清晰:

query.collision_layer = (int)pow(2, 5) + (int)pow(2, 7)

请记住,我们是从 2 的 0 次方开始计数。因此第 6 层是pow(2, 5).

理论上,这应该更高效(实际上,在 Godot 3 GDScript 中,由于解释器的原因,这几乎没有什么区别):

query.collision_layer = 1 << 5 | 1 << 7

这是向左移位。它将值的二进制表示形式(以二进制形式)向左移动指定的量。结果是 2 的幂,使用整数。Unlike pow与浮动一起使用。

随着时间的推移,您可能会记住一些二的幂:

query.collision_layer = 32 | 128

更好的是,我们可以使用二进制文字:

query.collision_layer = 0b100000 | 0b10000000

在那里您可以可视化图层。例如,第 6 层是二进制中右侧第六位的 1。

啊,这使得将层写成单个文字变得很容易:

query.collision_layer = 0b10100000

正如你所看到的,每一层实际上都是一个个别位.

  • 第 1 层是第一位(值为 1)。
  • 第 2 层是第二位(值为 2)。
  • 第 3 层是第三位(值为 4)。

我们从右到左,因为最右边的位值较小。

等等。只要继续加倍就可以了。

或者得到一个在线 2 的幂列表 https://oeis.org/A000079/list.

直到 2^31(第 32 层)为负数,因为 32 位有符号整数的最后一位用于标记数字的符号。其值为-2147483648.

您还可以将鼠标悬停在检查器面板中物理对象的碰撞层上,它会告诉您位数和值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

传递Physics2DShapeQueryParameters 层进行检查 的相关文章

随机推荐