iOS Swift didBeginContact没有被调用 [英] iOS Swift didBeginContact not being called

查看:134
本文介绍了iOS Swift didBeginContact没有被调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

过去两天我一直在努力让两个SKSpriteNodes注册碰撞并引发 didBegin#contact



我已将其位掩码设置为 categoryBitMask contactTestBitMask collisionTestBitMask



我还设置了 动态'属性都设为' true '



initPhysics()

我只希望 didBegin#Contact

  //设置Physicsbody位掩码
让playerCarBitMask:UInt32 = 0x1<< ; 1
让slowCarBitMask:UInt32 = 0x1<< 2



// initPhysics
func initPhysics(){
println((((((((((发起Physicalbody))))))))))))))))))
self.physicsWorld.contactDelegate =自我
self.physicsWorld.gravity = CGVector.zeroVector

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

}

// setupPlayer
func setupPlayer(){

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

gameNode.addChild(car)

let carBody = SKPhysicsBody(
angleOfSize:汽车。 frame.size,center:car.position)

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

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)
让slowCarScenePos = CGPoint(
x:680,
y:2048)


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



让slowCarBody = SKPhysicsBody(
angleOfSize: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 ******************** )
}


解决方案

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



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



类似地,我对测试物理碰撞的第二个节点执行相同的操作。



只需删除 centre:参数,如下所示:



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



两个Sprite节点解决了该问题,这些节点现在相互碰撞并推入像预期的那样把自己放在一边。


I have been struggling for the past two days to get two SKSpriteNodes to register a collision and evoke didBegin#contact.

I've set their bit masks 'categoryBitMask', 'contactTestBitMask' and 'collisionTestBitMask' for both objects.

I've also set the 'dynamic' property for both to 'true'

initPhysics() seems to set up the physicsWorld okay.

All I'm expecting is that didBegin#Contact is called, but it is not

//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********************")
}

解决方案

It turned out to be a simple problem. In my original code I was setting parameters for the SKPhysicsBody detection frame like so:

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

Similarly I was doing the same for the second node that I was testing physics collisions for.

Simply removing the 'centre:' parameters like so:

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

for the two sprite nodes solved the problem and the nodes now crash into each other and push themselves aside as expected.

这篇关于iOS Swift didBeginContact没有被调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆