传递要检查的Physics2DShapeQuery参数的层 [英] Passing layers for Physics2DShapeQueryParameters to check

查看:0
本文介绍了传递要检查的Physics2DShapeQuery参数的层的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在为我的2D自上而下游戏开发一个构建系统,最后一步是检查是否有任何物体,如树或玩家,阻碍物品的放置。在做了一些研究之后,我发现使用Physics2DShapeQuery参数是可行的。我唯一的问题是,我不知道如何传递碰撞层,以便在查询过程中使用第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

要建立价值,要知道它们是2的幂

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

等等。


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

以下内容效率低下,但已经足够清楚:

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

记住,我们是从2数到0的幂。因此第6层是pow(2, 5)

这在理论上应该更高效(实际上,它是GDScript,这几乎没有什么区别):

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

这是向左移位。它将该值的二进制表示形式左移指定的数量。结果是2的幂,与整数一起工作。与使用浮点数的pow不同。

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

query.collision_layer = 32 | 128

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

query.collision_layer = 0b100000 | 0b10000000

在那里您可以可视化这些层。例如,第6层是右数第六个位置的1,以二进制表示。

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

query.collision_layer = 0b10100000

如您所见,每一层实际上都是一个单独的位

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

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

等等。继续翻倍。

或获取list of powers of 2 online

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

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

这篇关于传递要检查的Physics2DShapeQuery参数的层的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆