2016-01-20 121 views
2

碰撞检测不在didBeginContact函数中调用NSLog。物理工作正常......有人可以告诉我我做错了什么吗?我尝试过的所有东西都给了我相同的结果。检测碰撞SpriteKit Swift

import SpriteKit 

class GameScene: SKScene, SKPhysicsContactDelegate { 

let category0: UInt32 = 0x1 << 0 
let category1: UInt32 = 0x1 << 1 
let category2: UInt32 = 0x1 << 2 
let category3: UInt32 = 0x1 << 4 
let position1:CGFloat = 100 

override func didMoveToView(view: SKView) { 

    self.physicsBody = SKPhysicsBody (edgeLoopFromRect:self.frame) 
    self.physicsWorld.gravity = CGVectorMake(0, -9) 
    physicsWorld.contactDelegate = self 

    let ground = SKSpriteNode(color: UIColor .redColor(), size: CGSizeMake(self.size.width, self.size.height/16)) 
    ground.position = CGPointMake(self.size.width/2, self.size.height - self.size.height + ground.size.height) 
    ground.zPosition = position1 
    self.addChild(ground) 
    ground.physicsBody = SKPhysicsBody(rectangleOfSize: ground.size) 
    ground.physicsBody?.categoryBitMask = category2 
    ground.physicsBody?.contactTestBitMask = category1 
    ground.physicsBody?.collisionBitMask = category1 
    ground.physicsBody?.dynamic = false 
    ground.physicsBody?.affectedByGravity = false 
    ground.name = "Ground" 

    let launchingPad = SKSpriteNode(color: UIColor .redColor(), size: CGSizeMake(self.size.width/6, self.size.height/16)) 
    launchingPad.position = CGPointMake(self.size.width - launchingPad.size.width/2 - 5, self.size.height - self.size.height + launchingPad.size.height * 4) 
    launchingPad.zPosition = position1 
    self.addChild(launchingPad) 
    launchingPad.physicsBody = SKPhysicsBody(rectangleOfSize: launchingPad.size) 
    launchingPad.physicsBody?.categoryBitMask = category1 
    launchingPad.physicsBody?.contactTestBitMask = category2 
    launchingPad.physicsBody?.collisionBitMask = category2 
    launchingPad.physicsBody?.dynamic = true 
    launchingPad.physicsBody?.affectedByGravity = true 
    launchingPad.name = "LaunchingPad" 

    func didBeginContact(contact: SKPhysicsContact) { 

     let firstBody = contact.bodyA.node as! SKSpriteNode 

     let secondBody = contact.bodyB.node as! SKSpriteNode 

     if ((firstBody.name == "LaunchingPad") && (secondBody.name == "Ground")){ 

NSLog("Contact") 

}}}} 
+1

你怎么知道firstBody是LaunchingPad?如果firstBody是Ground并且secondBody是LaunchingPad,需要为这种情况处理 – Knight0fDragon

+1

另外你的乐趣didBeginContact是INSIDE viewDidLoad,这对你不会有任何好处 – Knight0fDragon

+1

我想通过设置地面动态为false,这将保证firstBody总是LaunchingPad,但如果您尝试比较2个动态对象碰撞,订单将不会被保留 – Knight0fDragon

回答

2

根据KnightOfDragon评论回答我自己的问题。这是工作方法。

func didBeginContact(contact: SKPhysicsContact) { 

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 == category1) && (secondBody.categoryBitMask == category2)){ 
    NSLog("contact") 
} 
}