iOS Swift didBeginContact не вызывается

Последние два дня я изо всех сил пытался получить два узла SKSprite, чтобы зарегистрировать коллизию и вызвать ее. didBegin#contact,

Я установил их битовые маски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********************")
}

4 ответа

Решение

Это оказалось простой проблемой. В моем исходном коде я устанавливал параметры для рамки обнаружения SKPhysicsBody следующим образом:

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

Точно так же я делал то же самое для второго узла, для которого я тестировал физические столкновения.

Просто удаляем параметры 'center:' примерно так:

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

поскольку два узла спрайта решили проблему, и теперь узлы врезаются друг в друга и отталкиваются друг от друга, как и ожидалось.

"didBeginContact" был изменен на "didBegin" в Swift 3

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

У меня был код из swift 2, и "didBeginContact" сидел там, но не вызывался. После довольно белого я понял, что функция была изменена. Поэтому я подумал, что мой ответ может кому-то помочь.

Если вы хотите установить контакт между автомобилем и медленным автомобилем, вы должны инициировать категорию BitMask обоих физических тел (я думаю, что вы это сделали). Посмотрите код ниже, чтобы получить контакт между двумя физическими телами. Когда есть контакт, он возвращает вашу функцию отображения:

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

Обратите внимание, что контакт не будет обнаружен между двумя статическими телами

(node.physicsBody?.isDynamic = false)
Другие вопросы по тегам