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

Posted 张学徒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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) 就是那一层的值

以上是关于Godot节点的碰撞与碰撞掩码的计算的主要内容,如果未能解决你的问题,请参考以下文章

Godot 物理引擎 2D

游戏开发中的物理介绍

碰撞时,我的玩家以外的物理实体不会调用 didBeginContact

当玩家节点与另一个节点碰撞时游戏结束,当玩家与边界碰撞时游戏才应该结束

碰撞位掩码是如何工作的?斯威夫特/雪碧套件

SpriteKit 碰撞检测不起作用