我正在按照swift 3游戏开发一书中的说明创建一个简单的点击拍打游戏。我有两个SKSpriteNodes,一个是player,另一个是一个静态对象,如果它接触,可能会伤害player。
对播放器的损坏将通过categoryBitMask的自定义接触逻辑实现。问题是,当我设置静态对象的categoryBitMask时,当播放器与静态对象接触时,自定义逻辑被触发,但是播放器现在通过静态对象移动。
下面是播放器和静态对象的init()函数
静态对象
init() {
super.init(texture: nil, color: .clear, size: initialSize)
createAnimations()
self.run(spinAnimation)
let startTexture = textureAtlas.textureNamed("blade")
self.physicsBody = SKPhysicsBody(texture: startTexture, size: initialSize)
self.physicsBody?.affectedByGravity = false
self.physicsBody?.isDynamic = false
self.physicsBody?.categoryBitMask = PhysicsCategory.enemy.rawValue
self.physicsBody?.collisionBitMask = ~PhysicsCategory.heroDamage.rawValue
self.zPosition = -9
}播放器
init() {
super.init(texture: nil, color: .clear, size: initialSize)
let textureBody = textureAtlas.textureNamed("pierre-flying-3")
self.physicsBody = SKPhysicsBody(texture: textureBody, size: self.size)
self.physicsBody?.linearDamping = 0.9
self.physicsBody?.mass = 30
self.physicsBody?.allowsRotation = false
self.zPosition = 1
createAnimations()
self.run(soarAnimation, withKey: "soarAnimation")
self.physicsBody?.categoryBitMask = PhysicsCategory.hero.rawValue
self.physicsBody?.contactTestBitMask = PhysicsCategory.ground.rawValue |
PhysicsCategory.enemy.rawValue |
PhysicsCategory.coin.rawValue |
PhysicsCategory.powerUp.rawValue
self.physicsBody?.collisionBitMask = PhysicsCategory.ground.rawValue
}如果我删除了isDynamic = false条件,那么是的,它可以工作,但对象不再是静态的。我已经尝试增加对象的质量,并删除isDynamic = false。但是出于某种奇怪的原因,这与只包含IsDynamic = false语句具有相同的效果
有什么帮助吗?谢谢
编辑categoryBitMask值的枚举
enum PhysicsCategory:UInt32 {
case hero = 1
case heroDamage = 2
case ground = 4
case enemy = 8
case coin = 16
case powerUp = 32
}发布于 2017-10-04 22:08:17
应该发生冲突的两个节点中的一个节点需要将设置为才能发生冲突。你不能让它们都是静态的。
https://stackoverflow.com/questions/46553452
复制相似问题