7

我一直在努力争取在过去两天得到两个SKSpriteNodes来注册冲突并唤起didBegin#contactiOS Swift didBeginContact未被调用

我已经为这两个对象设置了位掩码'categoryBitMask','contactTestBitMask'和'collisionTestBitMask'。

我还设置了“dynamic”属性都为“true

initPhysics()似乎建立physicsWorld还好。

所有我期待的是,didBegin#Contact被调用,但它不是

//Set up Physicsbody bit masks 
let playerCarBitMask: UInt32 = 0x1 << 1 
let slowCarBitMask: UInt32 = 0x1 << 2 



//initPhysics 
func initPhysics() { 
    println("((((((((((((((Initiating Physicsbody))))))))))))))") 
    self.physicsWorld.contactDelegate = self 
    self.physicsWorld.gravity = CGVector.zeroVector 

    println("self.physicsWorld.contactDelegate = \(self.physicsWorld.contactDelegate)") 

} 

//setupPlayer 
func setupPlayer() { 

    car = SKSpriteNode(imageNamed: "redCarUp") 
    car.setScale(2.0) 
    car.position = CGPoint(x: 800, y: 400) 
    car.zPosition = 100 
    car.name = "car" 

    gameNode.addChild(car) 

    let carBody = SKPhysicsBody(
     rectangleOfSize: car.frame.size, center: car.position) 

    carBody.dynamic = true 
    carBody.categoryBitMask = playerCarBitMask 
    carBody.contactTestBitMask = slowCarBitMask 
    carBody.mass = 5 
    carBody.collisionBitMask = slowCarBitMask 
    car.physicsBody = carBody 

    println("carBody = \(carBody)") 
    println("carBody.dynamic = \(carBody.dynamic)") 
    println("carBody.mass = \(carBody.mass)") 
    println("carBody.categoryBitMask = \(carBody.categoryBitMask)") 
    println("carBody.contactTestBitMask = \(carBody.contactTestBitMask)") 
    println("carBody.collisionBitMask = \(carBody.contactTestBitMask)") 



    slowCar = SKSpriteNode(imageNamed: "blueCarUp") 
    slowCar.setScale(2.0) 
    let slowCarScenePos = CGPoint(
     x: 680, 
     y: 2048) 


    slowCar.position = gameNode.convertPoint(slowCarScenePos, fromNode: self) 
    println("slowCar.position = \(slowCar.position) ****") 
    slowCar.zPosition = 80 
    slowCar.name = "slowCar" 



    let slowCarBody = SKPhysicsBody(
     rectangleOfSize: slowCar.frame.size, center: slowCar.position) 


    println("slowCar = \(slowCar) ****") 

    slowCarBody.dynamic = true 
    slowCarBody.categoryBitMask = slowCarBitMask 
    slowCarBody.contactTestBitMask = playerCarBitMask 
    slowCarBody.mass = 5 
    slowCarBody.collisionBitMask = playerCarBitMask 
    slowCar.physicsBody = slowCarBody 
    gameNode.addChild(slowCar) 



} 

func didBeginContact(contact: SKPhysicsContact!) { 
    println("*******************PhysicsContact********************") 
} 
+1

代码转储不在此平台上赞赏。 – Mundi 2014-10-18 10:37:50

+0

注意**以及collisionBitMask,你必须设置contactTestBitMask **。这是通常的gotchya。请注意,在故事板编辑器中,它将contactTestBitMask保留为默认值0--这是通常的问题。只需将其设置为“1” – Fattie 2017-10-23 21:35:28

回答

2

原来是一个简单的问题。在我的原代码我是为SKPhysicsBody检测帧像这样设置参数:

let carBody = SKPhysicsBody( rectangleOfSize: car.frame.size, center: car.position)

同样地,我在做同样对于我测试物理碰撞对第二个节点。

只要去掉“中心:”参数,像这样:

let carBody = SKPhysicsBody(rectangleOfSize: car.frame.size)

两个精灵节点解决了这个问题,并在节点现在撞上对方和自己推一旁预期。

3

如果你想使汽车和slowCar之间的接触,你必须初始化两个physicsBodies的categoryBitMask(我认为你做)。请参阅下面的代码以获得两个physicsBody之间的联系。当有联系时,它返回你的显示功能:

//init your categoryBitMask : 
let carCategory:UInt32 = 0x1 << 0 
let SlowCarCategory:UInt32 = 0x1 << 1 


//init car 
car.physicsBody?.categoryBitMask = carCategory 
car.physicsBody?.contactTestBitMask = slowCarCategory 

//init slowCar 
slowCar.physicsBody?.categoryBitMask = slowCarCategory 
slowCar.physicsBody?.contactTestBitMask = CarCategory 

// set your contact function 
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 & carCategory) != 0 && (secondBody.categoryBitMask & slowCarCategory) != 0) 
    { 
     displayfunction(firstBody.node as SKSpriteNode, car: secondBody.node as SKSpriteNode) 
    } 
} 

func displayFunction (slowCar : SKSpriteNode, car : SKSpriteNode) 
+0

是否适合您? – Haox 2014-10-19 08:17:33

+0

谢谢,不幸didBeginContact()并没有被首先引起。我刚刚剥离了整个代码,以便它将精灵放在屏幕上,设置物理引擎,然后运行一个动作让其中一个碰到另一个,但不幸的是它仍然无法工作。 – Headstock67 2014-10-19 08:31:03

+0

您是否设置了'car'和'slowCar'的categoryBitMask?在你的代码中,你设置了“carBody”和“slowCarBody”。 – Haox 2014-10-19 08:58:08

0

请注意,联系人将不是两个静态物体

(node.physicsBody?.isDynamic = false) 
8

“didBeginContact”已经在迅速3

func didBegin(_ contact: SKPhysicsContact) { //stuff }

被改为“didBegin”之间可以检测我有从代码swift 2和'didBeginContact'坐在那里,但没有被调用。经过相当一段白色,我发现功能已经改变。所以,我认为我的回答可以帮助某人。