xcode - 检测碰撞 SpriteKit Swift

标签 xcode swift sprite-kit collision-detection

碰撞检测没有在didBeginContact函数中调用NSLog。物理原理运行良好...有人可以告诉我我做错了什么吗?我尝试过的一切都给了我同样的结果。

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")

}}}}

最佳答案

根据 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")
}
}

关于xcode - 检测碰撞 SpriteKit Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34903904/

相关文章:

ios - Apple Developer Swift 教程问题 - 按下按钮会导致 iOS 应用程序因未捕获的异常 'NSInvalidArgumentException' 而崩溃

swift - NSUserDefaults 从其他线程移除和设置对象

ios - 如何在 Swift 中实现 Facebook Audience Network 通知?

ios - 将背景图像添加到 SpriteKit 项目

macos - NSNotificationCenter 与 SpriteKit

ios - SpriteKit View 抛出 NSInvalidArgumentException

cocoa - "Unknown class <MyClass> in Interface Builder file"运行时错误

iphone - iOS - 无法设置按钮 'Disable' ,而不删除其内容

ios - 类型 'AppDelegate' 不符合协议(protocol) 'CLLocationManagerDelegate' - Xcode 6 中的 Swift

不指定泛型类型的 Swift 转换