swift - SKPhysicsContact 没有用子弹接触敌人
问题描述
我希望我的 categorybitmasks 设置正确,但我下面的代码应该让我的子弹和敌人接触,然后相互删除。什么都没有发生,它们只是碰撞并仍然留在屏幕上
func didBeginContact(联系人:SKPhysicsContact!){
var firstBody: SKPhysicsBody! var secondBody: SKPhysicsBody! if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { firstBody = contact.bodyA secondBody = contact.bodyB } else { firstBody = contact.bodyB secondBody = contact.bodyA } if (firstBody.categoryBitMask & bulletCategory) != 0 && (secondBody.categoryBitMask & enemyCategory) != 0 { destroyEnemy(bullet: firstBody.node as! SKSpriteNode, enemy: secondBody.node as! SKSpriteNode) } } func destroyEnemy(bullet: SKSpriteNode, enemy: SKSpriteNode) { bullet.removeFromParent() enemy.removeFromParent() }
enemy.physicsBody?.categoryBitMask = CollisionTypes.enemy.rawValue
enemy.physicsBody?.contactTestBitMask = CollisionTypes.bullet.rawValue
enemy.physicsBody?.collisionBitMask = CollisionTypes.bullet.rawValue
bullet.physicsBody?.categoryBitMask = CollisionTypes.bullet.rawValue bullet.physicsBody?.contactTestBitMask = CollisionTypes.enemy.rawValue bullet.physicsBody?.collisionBitMask = CollisionTypes.enemy.rawValue
解决方案
这本身不是答案,但评论有点长:
在你的didBegin
你有:
if (firstBody.categoryBitMask & bulletCategory) != 0 &&
(secondBody.categoryBitMask & enemyCategory) != 0 {
destroyEnemy(bullet: firstBody.node as! SKSpriteNode, enemy: secondBody.node as! SKSpriteNode)
如果 firstBody 是敌人而 secondBody 是子弹会发生什么?似乎发生联系时要运行的代码不会触发。如果没有看到您的 categoryBitMask 定义,我们将不知道,因为您似乎是按 categoryBitMask 值的升序分配第一个和第二个正文。
您可以确认这是否与块print
内的另一个一起工作if
。
我从来没有真正喜欢过这种形式,didBegin
我个人觉得这种风格更具可读性:
func didBegin(_ contact: SKPhysicsContact) {
print("didBeginContact entered for \(String(describing: contact.bodyA.node!.name)) and \(String(describing: contact.bodyB.node!.name))")
let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
switch contactMask {
case bulletCategory | enemyCategory:
print("bullet and enemy have contacted.")
let bulletNode = contact.bodyA.categoryBitMask == bulletCategory ? contact.bodyA.node : contact.bodyB.node
let enemyNode = contact.bodyA.categoryBitMask == enemyCategory ? contact.bodyA.node : contact.bodyB.node
destroyEnemy(bullet: bulletNode, enemy: enemyNode)
case playerCategory | enemyCategory:
// Handle player/Enemy collisions
default:
print("Some other contact occurred")
}
推荐阅读
- python - 我的 while 函数无法正常工作 PYTHON,我不知道出了什么问题
- javascript - 根据元素更改img src和文本
- rust - 为什么使用我的类型作为外部类型的参数来实现外部特征是合法的?
- javascript - 有没有办法用实际输出的内容/标记替换“data.variation.variation_description”?
- aframe - A-frame 动态体不会更新它的旋转
- javascript - 在这种情况下,lastIndexOf() 如何比 indexOf() 好?
- html - 我怎样才能使表情符号对我网站上的每个人都有效?
- docker - presto - 将工人从 docker 转移到 kubernetes
- laravel-5 - 使用 AJAX 从其他表加载数据
- java - Ascii 艺术字符串到字符的转换