【问题标题】:Single collisions being detected multiple times多次检测到单个碰撞
【发布时间】:2015-05-01 12:05:48
【问题描述】:

我已阅读此处发布的类似问题,但没有一个能完全解决我的问题。 我只使用 iOS 几个月。

我的碰撞在 90% 的时间里都在工作,但偶尔我会与同一个对象发生碰撞。这绝不应该发生,因为 2 个对象之一应该爆炸。

有时这会导致致命的崩溃,似乎是因为它试图在其已经执行后运行后续代码。

基本上,当船有盾牌时,我希望小行星而不是船爆炸。我已经输入了“if bonus == 0”语句来完成此操作。

我已经发布了相关代码,如果您需要更多,请告诉我。

我的代码是否过于复杂?还是我应该采取其他方法?

enum PhysicsCategory : UInt32 {
    case None = 0
    case objectGroup = 1
    case birdGroup = 2
    case shieldGroup = 4
    case gapGroup = 8
    case boundaryGroup = 16
    case bonusGroup = 32
}

....

    func didBeginContact(contact: SKPhysicsContact) {
  if bonus == 0 {
    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
        switch contactMask {
        ....
        case PhysicsCategory.birdGroup.rawValue | PhysicsCategory.objectGroup.rawValue:
            if contact.bodyA.categoryBitMask == PhysicsCategory.birdGroup.rawValue {
                gameOverActions()
            } else if contact.bodyB.categoryBitMask == PhysicsCategory.birdGroup.rawValue {
                gameOverActions()
            }
        default:
            fatalError("other collision: \(contactMask)")
        }
   } else if bonus > 0 {
        println("Bonus > 0")
        let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
        switch contactMask {
        ....
        case PhysicsCategory.birdGroup.rawValue | PhysicsCategory.objectGroup.rawValue:
            if contact.bodyA.categoryBitMask == PhysicsCategory.birdGroup.rawValue {
                let secondBody = contact.bodyB.node
                let asteroidExplosionNode = secondBody?.position
                //asteroidExplosion()
                let asteroidExplosionEmitter3 = SKEmitterNode(fileNamed: "explosionSmoke.sks")
                asteroidExplosionEmitter3.position = asteroidExplosionNode!
                asteroidExplosionEmitter3.name = "asteroidExplosionEmitter3"
                asteroidExplosionEmitter3.zPosition = 25
                asteroidExplosionEmitter3.targetNode = self
                movingObjects.addChild(asteroidExplosionEmitter3)
                secondBody?.removeFromParent()
                bonus--
                bonusUsed++
                bonusIndicator.text = "x\(bonus)"
                bonusIndicatorShadow.text = "x\(bonus)"
                if bonus >= 1 {
                    shieldAnimate()
                } else if bonus == 0 {
                    shield.removeFromParent()
                }
            } else if contact.bodyB.categoryBitMask == PhysicsCategory.birdGroup.rawValue {
                let secondBody = contact.bodyA.node
                let asteroidExplosionNode = secondBody?.position
                //asteroidExplosion()
                let asteroidExplosionEmitter3 = SKEmitterNode(fileNamed: "explosionSmoke.sks")
                asteroidExplosionEmitter3.position = asteroidExplosionNode!
                asteroidExplosionEmitter3.name = "asteroidExplosionEmitter3"
                asteroidExplosionEmitter3.zPosition = 25
                asteroidExplosionEmitter3.targetNode = self
                movingObjects.addChild(asteroidExplosionEmitter3)
                secondBody?.removeFromParent()
                bonus--
                bonusUsed++
                bonusIndicator.text = "x\(bonus)"
                bonusIndicatorShadow.text = "x\(bonus)"
                if bonus >= 1 {
                    shieldAnimate()
                } else if bonus == 0 {
                    shield.removeFromParent()
                }
            }
        default:
            fatalError("other collision: \(contactMask)")
        }
    }
}

【问题讨论】:

    标签: ios swift sprite-kit collision-detection


    【解决方案1】:

    由于您要在碰撞时删除node,因此您可以在执行其余代码之前检查parent 是否为nil

    let secondBody = contact.bodyB.node
    if secondBody?.parent != nil {
        // Asteroid explosion and bonus code.
    }
    

    【讨论】:

    • 非常感谢!这似乎成功了。我知道它会是这样的,我只是编程新手,不知道如何实现它。
    猜你喜欢
    • 2017-04-30
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多