为 Physics2DShapeQueryParameters 传递图层以进行检查
Passing layers for Physics2DShapeQueryParameters to check
我目前正在为我的 2D top down 游戏开发一个构建系统,最后一步是检查是否有任何物体(例如树或玩家)阻碍放置项目。在做了一些研究之后,我发现使用 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
为了构建价值,知道它们是 2 的幂:
- 第1层是2的1次方(2的0次方,等于1)
- 第2层是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)
。
这应该 - 理论上 - 更有效(实际上,它是 GDScript,这几乎没有区别):
query.collision_layer = 1 << 5 | 1 << 7
这是向左移位。它将值的二进制表示以二进制形式向左移动指定的量。结果是二的幂,使用整数。 与 pow
不同,它使用浮点数。
随着时间的推移,您可能会记住一些二的幂:
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
.
您也可以将鼠标悬停在检查器面板中物理对象的碰撞层上,它会告诉您位数和值。
我目前正在为我的 2D top down 游戏开发一个构建系统,最后一步是检查是否有任何物体(例如树或玩家)阻碍放置项目。在做了一些研究之后,我发现使用 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
为了构建价值,知道它们是 2 的幂:
- 第1层是2的1次方(2的0次方,等于1)
- 第2层是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)
。
这应该 - 理论上 - 更有效(实际上,它是 GDScript,这几乎没有区别):
query.collision_layer = 1 << 5 | 1 << 7
这是向左移位。它将值的二进制表示以二进制形式向左移动指定的量。结果是二的幂,使用整数。 与 pow
不同,它使用浮点数。
随着时间的推移,您可能会记住一些二的幂:
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
.
您也可以将鼠标悬停在检查器面板中物理对象的碰撞层上,它会告诉您位数和值。