当我在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
}
}
答案 0 :(得分:2)
您需要将contactTestBitMask
设置为SKSpriteNodes。 collisionBitMask只说明哪些类别的主体可以与节点发生冲突,但不会调用didBeginContact
方法。
self.cup.physicsBody?.contactTestBitMask = ColliderType.Star.rawValue
//Star
sprite.physicsBody?.contactTestBitMask = ColliderType.Cup.rawValue
contactTestBitMask
文档说明了这一点:
一个遮罩,用于定义哪些类别的物体会导致与此物理体的交叉通知。