我试图在Swift中使用碰撞位掩码和接触测试位掩码,我希望两个物体不要碰撞在一起,所以我正在做:
firstNode.physicsBody?.collisionBitMask = 0b01
secondNode?.collisionBitMask = 0b10既然SpriteKit对这两个数字做了AND运算,那么结果不应该是自10 & 01 = 00以来的00吗?
那么,为什么会发生碰撞呢?
谢谢。
发布于 2016-08-21 13:26:39
这不是碰撞处理的工作方式。当两个物体相交时,物理引擎在当前体collisionBitMask和他人身体categoryBitMask之间执行逻辑categoryBitMask运算符
当两个物理物体相互接触时,可能会发生碰撞。通过执行逻辑和操作,将该主体的碰撞掩码与另一个主体的类别掩码进行比较。如果结果是一个非零值,这个主体会受到碰撞的影响。每个身体独立地选择它是否想被另一个身体所影响。例如,您可以使用它来避免碰撞计算,因为碰撞计算会对物体的速度造成微不足道的变化。
来源。
结果取决于如何在这两个身体上设置categoryBitMask。categoryBitMask的默认值是0xFFFFFFFF,意味着设置了所有位。因此,当您在0xFFFFFFFF和0b10或0b01之间执行&时,结果将是非零值,因此会发生冲突。
举个例子,你的身体是这样的:
spriteA.physicsBody?.categoryBitMask = 0b01
spriteA.physicsBody?.collisionBitMask = 0b01和
spriteB.physicsBody?.categoryBitMask = 0b10
spriteB.physicsBody?.collisionBitMask = 0b10会给你你想要的结果。而且,这可能不是您所需要的确切设置,它只是一个简单的例子,您将不得不根据您的需要更改值。在这种情况下,spriteA只会与categoryBitMask设置为0b01的物体发生碰撞。spriteB也是如此,它将与categoryBitMask设置为0b10的物体发生碰撞。
另外,如果您不希望这些精灵能够与任何东西发生冲突,只需将它们的collisionBitMask属性设置为0。
发布于 2016-08-22 08:23:06
这不是用碰撞位来测试节点间交互的方法。
假设我有以下内容:
struct PC {
static var player: UInt32 = 0b10 //2
static var enemy: UInt32 = 0b100 //4
static var rock: UInt32 = 0b1000 //8
}
player.physicsBody!.categoryBitMask = PC.player
player.physicsBody!.collisionBitMask = PC.enemy | PC.rock
enemy.physicsBody!.categoryBitMask = PC.enemy
enemy.physicsBody!.collisionBitMask = PC.player因此,当您检查交互何时发生在didBeginContact函数中时,您可以使用位逻辑检查它们的交互是否发生。
func didBeginContact(contact: SKPhysicsCountact) {
//1
let collision: UInt32 = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
//2
if collision == PC.player | PC.enemy {
//An interaction occured between the player and enemy.
}您可以使用变量冲突来测试任何交互。例如,在我的测试游戏中,我有下面的函数来测试所接触的对象。
func didBeginContact(contact: SKPhysicsContact) {
let collision: UInt32 = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
//Collision between the penguin and land
if collision == PhysicsCategory.Land | PhysicsCategory.Animal {
lostLevel()
} else if collision == PhysicsCategory.Animal | PhysicsCategory.Pillow {
animalCounter -= 1
if animalCounter == 0 {
wonLevel()
}
}
}https://stackoverflow.com/questions/39063949
复制相似问题