collisionBitMask不起作用

时间:2017-10-01 01:34:07

标签: swift sprite-kit collision-detection skphysicsbody

我编写了以下代码来检测播放器,墙和npc之间的冲突:

struct PhysicsCategories{

    static let player: UInt32 = 0x1 << 1
    static let npc: UInt32 = 0x1 << 2
    static let wall: UInt32 = 0x1 << 3
    static let all: UInt32 = 0xFFFFFFFF

}

这些是玩家的设置:

self.physicsBody!.categoryBitMask = Constants.PhysicsCategories.player
self.physicsBody!.collisionBitMask = Constants.PhysicsCategories.npc | Constants.PhysicsCategories.wall
self.physicsBody!.contactTestBitMask = Constants.PhysicsCategories.npc

这些是墙的设置:

tileNode.physicsBody!.categoryBitMask = Constants.PhysicsCategories.wall
tileNode.physicsBody!.collisionBitMask = Constants.PhysicsCategories.player | Constants.PhysicsCategories.npc

这些是npc的设置:

npc.physicsBody!.categoryBitMask = Constants.PhysicsCategories.npc
npc.physicsBody!.collisionBitMask = Constants.PhysicsCategories.wall | Constants.PhysicsCategories.player | Constants.PhysicsCategories.npc
npc.physicsBody!.contactTestBitMask = Constants.PhysicsCategories.player

我想让npc与墙壁和玩家发生碰撞。玩家应该与npc和墙碰撞。 结果是玩家可以与墙壁和npc碰撞,但是npc只能与玩家碰撞并穿过墙壁。

有谁知道我在这里做错了什么? npc在场景中随机走动,是否受此影响的碰撞比特行为?

编辑:如果我将npc的动态属性设置为true,它就可以工作。但是我不希望npc变得动态,因为我不希望玩家能够将npc推开。 为什么它只在npc是动态的时候才能工作?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你希望玩家和NPC“从墙上反弹”,但不会互相反弹。解决方案是不将collisionBitMasks设置为彼此的categoryBitMasks,而只设置其contactTestBitMasks。

至于为什么NPC需要动态地从墙上反弹:一个参与者必须是动态的,以便碰撞显示效果:反弹的那个。

答案 1 :(得分:1)

如果您不希望玩家能够推动npc,请不要使用dynamic属性,只需关闭npc和播放器之间的冲突:

npc.physicsBody!.collisionBitMask &= ~Constants.PhysicsCategories.player

这将在npc的collisionBitMask中将代表玩家类别的位设置为0,而不会影响npc的任何其他碰撞设置。

或者不要将它们置于首位。变化:

npc.physicsBody!.collisionBitMask = Constants.PhysicsCategories.wall | Constants.PhysicsCategories.player | Constants.PhysicsCategories.npc

npc.physicsBody!.collisionBitMask = Constants.PhysicsCategories.wall | Constants.PhysicsCategories.npc

所以npc不再与玩家发生碰撞 - 这意味着如果2接触,npc将不受玩家影响并继续完全不受碰撞的影响。但是,contactTestbitMask仍然设置,因此您的代码会收到冲突通知。

然而,除非你也为玩家做同样的事情,否则玩家会从npc反弹:

player.physicsBody!.collisionBitMask &= ~Constants.PhysicsCategories.npc

当你说:

  

npc在场景中随机走动,是碰撞比特   受此影响的行为?

你的意思是它只是在屏幕上反弹并弹跳,或者你的移动代码有问题吗?如果是前者,则按照Kod的说法进行,并将恢复原状设置为0.来自https://developer.apple.com/documentation/spritekit/skphysicsbody

  

恢复属性决定了身体维持多少能量   在碰撞期间 - 它的弹性。