Swift didBeginContact()没有被调用

时间:2015-02-17 22:16:43

标签: swift ios8

当我在println()中放置didBeginContact时,没有任何内容打印出来。因此,我假设我的didBeginContact不起作用。为什么?我还有一个枚举(Collider Type),其中包含Cup和Star的rawValues并列出。

这是我的GameScene文件。

import Foundation
import SpriteKit

class PlayScene: SKScene, SKPhysicsContactDelegate {


    let cup = SKSpriteNode(imageNamed: "cup")

    override func didMoveToView(view: SKView) {
    /* Setup your scene here */

    self.physicsWorld.contactDelegate = self


    self.backgroundColor = UIColor(red: 192, green: 192, blue: 192, alpha: 1)

    cup.setScale(0.5)
    cup.position = CGPointMake(self.size.width + cup.size.width / 2, self.size.height/2)

    self.addChild(cup)

    let actualDuration = 2.0

    let actualY = size.height / 2

    let actionMove = SKAction.moveByX(-550, y: 0, duration: actualDuration)

    let reverseActionMove = actionMove.reversedAction()

    let sequence = SKAction.sequence([actionMove, reverseActionMove])

    let endlessAction = SKAction.repeatActionForever(sequence)

    self.cup.physicsBody = SKPhysicsBody(rectangleOfSize: self.cup.size)
    self.cup.physicsBody?.dynamic = false
    self.cup.physicsBody?.categoryBitMask = ColliderType.Cup.rawValue
    self.cup.physicsBody?.collisionBitMask = ColliderType.Star.rawValue



    //Code to keep stars in screen
    //let borderBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
    //borderBody.friction = 0
    //self.physicsBody = borderBody

    cup.runAction(endlessAction)

}




override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    /* Called when a touch begins */

    for touch: AnyObject in touches {
        let star = StarNode.star(touch.locationInNode(self))
        star.setScale(0.3)
        self.addChild(star)
    }
}

func didBeginContact(contact: SKPhysicsContact) {
    println("test")
    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask
    switch contactMask {
    case ColliderType.Star.rawValue | ColliderType.Cup.rawValue:
        println("star with da cup")
    default:
        return

    }
}

override func update(currentTime: CFTimeInterval) {
    /* Called before each frame is rendered */
}

}

这是我的StarNode文件。

import Foundation
import UIKit
import SpriteKit

class StarNode: SKSpriteNode, SKPhysicsContactDelegate {
    class func star(location: CGPoint) -> StarNode {
        let sprite = StarNode(imageNamed:"star")

        sprite.xScale = 0.075
        sprite.yScale = 0.075
        sprite.position = location

        sprite.physicsBody = SKPhysicsBody(texture:     SKTexture(imageNamed: "star"), size: sprite.size)
        sprite.physicsBody?.dynamic = true
        sprite.physicsBody?.categoryBitMask = ColliderType.Star.rawValue
        sprite.physicsBody?.collisionBitMask = ColliderType.Cup.rawValue

        if let physics = sprite.physicsBody {
        physics.affectedByGravity = true
        physics.friction = 0.12
        physics.allowsRotation = true
        physics.dynamic = true
        physics.linearDamping = 0.75
        physics.angularDamping = 0.75
        sprite.name = "star"
    }
    return sprite
  }
}

1 个答案:

答案 0 :(得分:2)

您需要将contactTestBitMask设置为SKSpriteNodes。 collisionBitMask只说明哪些类别的主体可以与节点发生冲突,但不会调用didBeginContact方法。

self.cup.physicsBody?.contactTestBitMask = ColliderType.Star.rawValue

//Star
sprite.physicsBody?.contactTestBitMask = ColliderType.Cup.rawValue

contactTestBitMask文档说明了这一点:

  

一个遮罩,用于定义哪些类别的物体会导致与此物理体的交叉通知。