【发布时间】:2016-04-01 04:12:09
【问题描述】:
我的 Hero / Player 实例可以通过触摸敌人实例或enemyBullet 实例来破坏。这是我的敌人:
physicsBody = SKPhysicsBody(rectangleOfSize: size)
physicsBody?.categoryBitMask = PhysicsCategory.enemy
physicsBody?.collisionBitMask = 0
physicsBody?.contactTestBitMask = PhysicsCategory.bullet
physicsBody?.affectedByGravity = false
physicsBody?.allowsRotation = false
physicsBody?.dynamic = true
这是我的敌人子弹:
bullet.physicsBody = SKPhysicsBody(rectangleOfSize: bullet.size)
bullet.physicsBody?.categoryBitMask = PhysicsCategory.enemyBullet
bullet.physicsBody?.contactTestBitMask = PhysicsCategory.hero
bullet.physicsBody?.affectedByGravity = false
bullet.physicsBody?.dynamic = false
这是我的英雄:
physicsBody = SKPhysicsBody(rectangleOfSize: size)
physicsBody?.affectedByGravity = false
physicsBody?.categoryBitMask = PhysicsCategory.hero
physicsBody?.contactTestBitMask = PhysicsCategory.enemy | PhysicsCategory.enemyBullet
physicsBody?.dynamic = false
我的玩家确实与敌人实例正确接触,但没有与敌人子弹接触。相反,当敌人射击时,会随机实例化一个 SKPhysicsContact。这是我的处理函数的样子:
func didBeginContact(contact: SKPhysicsContact) {
// Enemy + bullet
if((contact.bodyA.categoryBitMask == PhysicsCategory.enemy && contact.bodyB.categoryBitMask == PhysicsCategory.bullet) || (contact.bodyA.categoryBitMask == PhysicsCategory.bullet && contact.bodyB.categoryBitMask == PhysicsCategory.enemy)) {
// TODO
}
// Hero + enemy
else if((contact.bodyA.categoryBitMask == PhysicsCategory.hero && contact.bodyB.categoryBitMask == PhysicsCategory.enemy) || (contact.bodyA.categoryBitMask == PhysicsCategory.enemy && contact.bodyB.categoryBitMask == PhysicsCategory.hero)) {
print("HERO AND ENEMY")
}
// Hero + enemyBullet
else if((contact.bodyA.categoryBitMask == PhysicsCategory.hero && contact.bodyB.categoryBitMask == PhysicsCategory.enemyBullet) || (contact.bodyA.categoryBitMask == PhysicsCategory.enemyBullet && contact.bodyB.categoryBitMask == PhysicsCategory.hero)) {
print("HERO AND BULLET")
}
else {
print("DEBUG: \(contact.bodyA.categoryBitMask) AND ˜\(contact.bodyB.categoryBitMask)")
}
}
所以:发生的情况是,每当敌人射击(射击enemyBullet)时,它都会在我的处理函数中运行到 else 。这将打印“调试:1 和 6”。 1 = 敌人,6 = 敌人子弹。
为什么我的敌人在发射子弹时要进行接触?如何让我的游戏检测到英雄何时被敌人子弹击中?
编辑:感谢@KnightOfDragon:
-
使用 ContactBitMask 和 CategoryBitMask 时,请确保不要简单地将它们设置为 1、2、3、4 等。将它们设置为:
静态让环境:UInt32 = 0b000000000000000000000000000000001 静态让上电:UInt32 = 0b00000000000000000000000000000010 静态让英雄:UInt32 = 0b00000000000000000000000000100000 静态让子弹:UInt32 = 0b00000000000000000000000001000000 静态让敌人:UInt32 = 0b00000000000000000100000000000000 静态让敌人子弹:UInt32 = 0b00000000000000001000000000000000
静态让enemyAndEnemyBullet: UInt32 = 0b00000000000000001100000000000000
看在上帝的份上:在使用精灵时,您希望与 SKPhysicsContact 联系,请始终将它们设置为
dynamic = true。否则将无法正常工作。
【问题讨论】:
标签: ios swift sprite-kit