2015-02-17 2 views
0

Когда я положил println() в свои didBeginContact, ничего не распечатывается. Поэтому я предполагаю, что мой didBeginContact не работает. Зачем? У меня также есть перечисление (тип коллайдера), в котором rawValues ​​Cup и Star и перечислены.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

+0

Добро пожаловать :) – Christian

+2

Если мой ответ разрешил вашу проблему, примите мой ответ. Поэтому другие люди могут найти ответ легче. – Christian