Xcode 碰撞检测swift 2.0 spritekit出现故障

Xcode 碰撞检测swift 2.0 spritekit出现故障,xcode,swift,sprite-kit,collision,detection,Xcode,Swift,Sprite Kit,Collision,Detection,我第一次为iOS制作游戏。我非常接近,但是我很早就开始了碰撞检测,然后我改变了一些东西,我失去了工作。我试着回到后面,但没有工作。到目前为止,这就是我所拥有的,但没有任何效果。我正在尝试不同版本的碰撞检测,我在网上找到,但我坚持让这一个工作。只是不明白我哪里出错了 提前谢谢你 import SpriteKit enum ColliderType: UInt32 { case Player = 1 case Traffic = 2 } class GameScene: SKSc

我第一次为iOS制作游戏。我非常接近,但是我很早就开始了碰撞检测,然后我改变了一些东西,我失去了工作。我试着回到后面,但没有工作。到目前为止,这就是我所拥有的,但没有任何效果。我正在尝试不同版本的碰撞检测,我在网上找到,但我坚持让这一个工作。只是不明白我哪里出错了

提前谢谢你

import SpriteKit
enum ColliderType: UInt32 {
    case Player = 1
    case Traffic = 2
}


class GameScene: SKScene, SKPhysicsContactDelegate {
    override func didMoveToView(view: SKView) {

createWalls()

    self.backgroundColor = SKColor.whiteColor()
    self.physicsWorld.gravity = CGVectorMake(0, 0)

    player.physicsBody = SKPhysicsBody(rectangleOfSize: player.size)
    player.physicsBody?.dynamic = true

    player.physicsBody!.categoryBitMask = ColliderType.Player.rawValue
    player.physicsBody!.contactTestBitMask = ColliderType.Traffic.rawValue

    player.zPosition = 3
    player.name = "player"
    player.position = CGPoint(x: self.frame.midX, y: (self.frame.midY)/3)
    player.setScale(1.0)

    self.addChild(player)

    _ = NSTimer.scheduledTimerWithTimeInterval(2.5, target: self, selector: #selector(GameScene.makeTraffic), userInfo: nil, repeats: true)
}

func makeTraffic(){

    var aNumber = Int(arc4random_uniform(2))

    let Pos1 = Int(self.frame.midX/2)+30
    let Pos2 = Int((self.frame.size.width)/2)
    let Pos3 = Int(self.frame.size.width-300)

    let array = [Pos1, Pos2, Pos3]
    let randomIndex = Int(arc4random_uniform(UInt32(array.count)))
    let randomPOS = CGPoint(x:Int(array[randomIndex]), y:Int(self.frame.height))

    if aNumber == 0 {
        aNumber = aNumber + 1
    }

    switch aNumber {
    case 1:
        let car1 = SKSpriteNode(imageNamed: "Car_Green_Front")
        car1.position = randomPOS
        car1.zPosition = 3
        car1.setScale(1.0)

        car1.physicsBody = SKPhysicsBody(rectangleOfSize: car1.size)
        car1.physicsBody?.dynamic = true
        car1.physicsBody!.categoryBitMask = ColliderType.Player.rawValue
        car1.physicsBody!.contactTestBitMask = ColliderType.Traffic.rawValue

        self.addChild(car1)
    case 2:
        let car2 = SKSpriteNode(imageNamed: "Car_Purple_Front")
        car2.position = randomPOS
        car2.zPosition = 3
        car2.setScale(1.0)

        car2.physicsBody = SKPhysicsBody(rectangleOfSize: car2.size)
        car2.physicsBody?.dynamic = true
        car2.physicsBody!.categoryBitMask = ColliderType.Traffic.rawValue
        car2.physicsBody!.contactTestBitMask = ColliderType.Player.rawValue

        self.addChild(car2)
    default:
        return
    }
}

func createWalls(){
    let wallSize = CGSize(width: 5, height: self.frame.size.height)

    let rightwall = SKShapeNode(rectOfSize: wallSize)
    rightwall.physicsBody = SKPhysicsBody(rectangleOfSize: wallSize)
    rightwall.physicsBody!.dynamic = false

    rightwall.position = CGPoint(x: self.frame.maxX-300, y: self.frame.size.height/2)
    rightwall.fillColor = UIColor.clearColor()
    self.addChild(rightwall)

    let leftwall = SKShapeNode(rectOfSize: wallSize)
    leftwall.physicsBody = SKPhysicsBody(rectangleOfSize: wallSize)
    leftwall.physicsBody!.dynamic = false

    leftwall.position = CGPoint(x: self.frame.minX+300, y: self.frame.size.height/2)
    leftwall.fillColor = UIColor.clearColor()
    self.addChild(leftwall)
}

func didBeginContact(contact: SKPhysicsContact) {
print("Contact")

if contact.bodyA.categoryBitMask == ColliderType.Traffic.rawValue && contact.bodyB.categoryBitMask == ColliderType.Player.rawValue {

print("Hi")

} else {

print("Hello")    }

}

}

虽然我会做一些小的更改,但您的代码似乎很简单

1) 我会这样写我的对撞机类型

 struct ColliderType {
     static let player: UInt32 = 0x1 << 0
     static let traffic: UInt32 = 0x1 << 1
 }
2) 建议在添加physicsBody之前为精灵指定位置。你的做法正好相反,这可能会导致意想不到的问题

3) 将碰撞方法更改为此

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 == ColliderType.player) && (secondBody.categoryBitMask == ColliderType.traffic) {
        // player hit traffic, do something 
    }
 }
否则,DidBeginContact方法将永远不会触发

如果你遵循苹果的命名惯例,这也是一个好主意。因此,只有类、协议、枚举和结构应该以大写字母开头


希望这有助于

编写代码的更简洁方法是:

func didBeginContact(contact: SKPhysicsContact) {
    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

    switch contactMask {

    case ColliderType.player | ColliderType.traffic:
        // player and traffic have contacted
        print("Collision between player and traffic")

    default :
        //Some other contact has occurred
        print("Some other contact")
    }
}

您可以添加任意数量的
case-ColliderType.object1 | ColliderType.object2:

正如@crashoverride777在他的回答中指出的,您没有设置physicsWorld联系人委托,因此根本没有启动didBeginContact。除此之外,您还应该遵循命名约定。它应该是variableName、methodName、ClassName、ProtocolName、StructName等。。。了解。不过这不是必须的,这是苹果公司的推荐(它可以帮助您的代码在StackOverflow上正确格式化)。非常感谢,它很有效。我知道,没有physicsWorld代码是我一直缺少的主要东西。其余的也很好用。
 physicsWorld.contactDelegate = self
func didBeginContact(contact: SKPhysicsContact) {
    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

    switch contactMask {

    case ColliderType.player | ColliderType.traffic:
        // player and traffic have contacted
        print("Collision between player and traffic")

    default :
        //Some other contact has occurred
        print("Some other contact")
    }
}