swift - didBeginContact 未调用

标签 swift sprite-kit collision

我正在制作一个需要我的 spriteNodes 发生碰撞的游戏。我遵循了一个教程,但它对我不起作用。

当我运行我的游戏并且两个对象发生碰撞时,输出监视器中没有 println("beginContact"),因此没有调用 didBeginContact 函数。

override init(size:CGSize) {
    super.init(size: size)
    player.planeSprite = SKSpriteNode(imageNamed: "plane5")

    player.planeSprite.physicsBody? = SKPhysicsBody(rectangleOfSize: player.planeSprite.size)
    player.planeSprite.physicsBody?.dynamic = true;
    player.planeSprite.physicsBody?.categoryBitMask = playerCategory;
    player.planeSprite.physicsBody?.contactTestBitMask = noteCategory;
    player.planeSprite.physicsBody?.collisionBitMask = 0;
    player.planeSprite.physicsBody?.usesPreciseCollisionDetection = true;

    player.planeSprite.position = CGPointMake(player.legalPositions[1], player.planeSprite.size.height/2)

    self.addChild(player.planeSprite)
}

func addNote() {
    var note:SKSpriteNode = SKSpriteNode(imageNamed: "note")
    note.physicsBody? = SKPhysicsBody(rectangleOfSize: note.size)
    note.physicsBody?.dynamic = true
    note.physicsBody?.categoryBitMask = noteCategory
    note.physicsBody?.contactTestBitMask = playerCategory
    note.physicsBody?.collisionBitMask = 0

    let minX = note.size.width/2
    let maxX = self.frame.size.width - note.size.width/2
    let rangeX = maxX - minX
    let position = Int(arc4random_uniform(3))

    note.position = CGPointMake(player.legalPositions[position], self.frame.size.height + note.size.height)

    self.addChild(note)
}

func didBeginContact(contact: SKPhysicsContact!) {
    println("beginContact")

    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 & noteCategory) != 0 && (secondBody.categoryBitMask & playerCategory) != 0 ) {
        println("if statement")
        playerDidCollideWithNote(firstBody.node as SKSpriteNode, note: secondBody.node as SKSpriteNode)
    }
}

func playerDidCollideWithNote(plane:SKSpriteNode, note:SKSpriteNode) {
    println("hit")
    note.removeFromParent()
}

最佳答案

如果你使用Xcode8.0 Swift3.0,则不能使用
func didBeginContact(联系人:SKPhysicsContact!){}

所以你应该使用它。 func didBegin(_ contact: SKPhysicsContact) {}

关于swift - didBeginContact 未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26654039/

相关文章:

Swift - SpriteKit - 在永远运行时更新 SKAction.waitForDuration

ios - 从地面坠落的角色

Python、Pygame、Livewires - 如何进行平滑的碰撞?

python - 重置后世界崩溃了

ios - 如何将 NSData 更改为 NSDictionary 或 JSON

ios - GZIP 在 Swift 中的使用

ios - Swift SpriteKit '($T15) -> $T16' 与 'SKEmitterNode' 不同

ios - 为什么我不能将 ContactBody 转换为 SpriteKit 中的自定义 SKNode

ios - iOS中如何检测音量变化?

swift - [String : [object]] for specific key in object arrays 类型的过滤器字典