我在Swift中使用SpriteKit并遇到以下情况:
Superclass.swift
struct physicsBitMasks {
static let one = UInt32(1) //for player
static let two = UInt32(2) //for ground
static let three = UInt32(3) //for you don't need to know
static let four = UInt32(4) //for enemy
...
ground.physicsBody?.categoryBitMask = physicsBitMasks.one
ground.physicsBody?.contactTestBitMask = physicsBitMasks.one
ground.physicsBody?.collisionBitMask = physicsBitMasks.two
}
Subclass.swift
Subclass: Superclass {
//create enemy
thing.physicsBody?.categoryBitMask = physicsBitMasks.four
thing.physicsBody?.contactTestBitMask = physicsBitMasks.four
thing.physicsBody?.collisionBitMask = physicsBitMasks.four
}
敌人坠落地面
REDEFINE Superclass.swift
struct physicsBitMasks {
static let one = UInt32(1) //for player
static let two = UInt32(2) //for ground
static let three = UInt32(3) //for you don't need to know
static let four = UInt32(5) // or 7, 9, ...31 for enemy
}
敌人不会堕落。
发生了什么事?
答案 0 :(得分:0)
playerMask
,groundMask
,mysteryMask
和enemyMask
不会比one
,two
,{{1}更好的名称}和three
?
另外,因为它们是位掩码组件,所以每个都需要一个唯一的位集。但是,3,例如,包含1和2的位。让我们这样定义它们:
four
现在您需要在身体上设置各种面具。您应该将每个人的身体struct BodyMask {
static let Player = UInt32(1)
static let Ground = UInt32(2)
static let EmbarrassingSecret = UInt32(4)
static let Enemy = UInt32(8)
}
设置为其类型的掩码:
categoryBitMask
你需要根据你希望它反弹的其他身体来设置每个身体的ground.physicsBody?.categoryBitMask = BodyMask.Ground
player.physicsBody?.categoryBitMask = BodyMask.Player
enemies.forEach { $0.physicsBody?.categoryBitMask = BodyMask.Enemy }
twilightNovel.physicsBody?.categoryBitMask = BodyMask.EmbarrassingSecret
。也就是说,你想让敌人从地面反弹吗?然后敌人的collisionBitMask
必须包含collisionBitMask
位。你想让地面从敌人身上反弹吗?还是反弹了什么?可能不是。请注意,这是不对称的!敌人可以在没有地面反弹的情况下反弹。也就是说,牛顿的第三定律(对于每一个动作都存在相同且相反的反应)并不一定适用。
如果你想让一个身体从多种其他身体类型中反弹,你可以按位或一起使用这些面具。让我们假设你想让敌人从地面和对方身上弹起来。
BodyMask.Ground
最后,如果您希望在两个实体发生碰撞时收到通知(无论它们是否反弹),您都可以使用ground.physicsBody?.collisionBitMask = 0
player.physicsBody?.collisionBitMask = BodyMask.Ground
enemies.forEach { $0.physicsBody?.collisionBitMask = BodyMask.Ground | BodyMask.Enemy }
twilightNovel.physicsBody?.collisionBitMask = BodyMask.Ground
。你可能想知道玩家何时接触敌人,或者当玩家做出令人尴尬的事情,即使你不一定希望玩家从敌人或无用的小说中反弹。
contactTestBitMask