【Godot】节点的碰撞与碰撞掩码的计算

Godot 3.4.2

判断碰撞类型的节点是否在某个层,或者掩码是否能检测到哪个层的方法,这里就需要用到二进制位运算了,代码如下

##  是否在这个碰撞层中
static func is_in_layer(node: CollisionObject2D, layer: int) -> bool:
    return node.collision_layer & layer == layer

##  是否在这个碰撞掩码中
static func is_in_mask(node: CollisionObject2D, mask: int) -> bool:
    return node.collision_mask & mask == mask

##  减去这一层碰撞
static func sub_layer(node: CollisionObject2D, layer: int):
    node.collision_layer -= (node.collision_layer & layer)

##  减去这一层掩码
static func sub_mask(node: CollisionObject2D, mask: int):
    node.collision_mask -= (node.collision_mask & mask)

##  加上这一层碰撞
static func add_layer(node: CollisionObject2D, layer: int):
    node.collision_layer |= layer

##  加上这一层掩码
static func add_mask(node: CollisionObject2D, mask: int):
    node.collision_mask |= mask

通过位运算直接得到是否包含有对应碰撞层或掩码层的值,有兴趣的朋友可以百度“位运算”

里面的第一个参数 node 是要检测的节点, KinematicBody2DRigidBody2DArea2D 这种碰撞对象,第二个参数即为这些节点的 collision_layercollision_mask 属性

在这里插入图片描述
那么要得到他们的值很简单,使用位运算进行左移运算

比如上面在第一层,那么就是在 1 << 0
如果节点是在上面的第 5 层,那么直接用 1 << (5 - 1) ,也就是 1 << 4 即可得到
如果节点是在上面的第 6 层,那么直接用 1 << (6 - 1),也就是 1 << 5 即可得到

就是 1 << (上面点亮的数字 - 1) 就是那一层的值

发表评论