2015-02-17 33 views
0

當我把println()放在我的didBeginContact裏時,什麼都不打印。因此,我認爲我的didBeginContact不起作用。爲什麼?我也有一個enum(對撞機類型),其中包括Cup和Star的rawValues並列出。Swift didBeginContact()不叫

這是我的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 
    } 
} 

回答

2

您需要將contactTestBitMask設置爲您的SKSpriteNodes。 collisionBitMask表示只有哪些類別的主體可以與該節點發生衝突,但不會調用didBeginContact方法。

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

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

contactTestBitMask文檔說它:

定義哪些機構的類別引起與此物理身體相交通知的掩模。

+0

非常感謝你! – dannybess 2015-02-17 22:25:12

+0

不客氣:) – Christian 2015-02-17 22:25:24

+2

如果我的答案解決了您的問題,請接受我的答案。所以其他人可以更容易地找到答案。 – Christian 2015-02-17 22:33:05