7

Я боролся в течение последних двух дней, чтобы получить два SKSpriteNodes, чтобы зарегистрировать столкновение и вызвать didBegin#contact.iOS 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

+0

обратите внимание, что **, а также collisionBitMask, вы должны установить contactTestBitMask **. это обычная добыча. обратите внимание, что ** в редакторе раскадровки он по умолчанию отключает contactTestBitMask ** - это обычная проблема. просто установите его на «1» – Fattie

ответ

2

Оказалось, что это простая проблема. В моем исходном коде я настройка параметров для кадра обнаружения SKPhysicsBody так:

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

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

Просто удаляя «центр:» параметры, как так:

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

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

3

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

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

+0

Спасибо, к сожалению doBeginContact() не вызвано в первую очередь. Я просто удалил весь код обратно, чтобы он просто помещал спрайты на экран, настраивал физический движок и затем запускал действие, чтобы сделать один удар другим, но, к сожалению, он все еще не работает. – Headstock67

+0

Вы устанавливаете categoryBitMask 'car' и' slowCar'? В вашем коде вы установили 'carBody' и' slowCarBody' – Haox

0

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

(node.physicsBody?.isDynamic = false) 
8

«didBeginContact» было изменено на «didBegin» в быстром 3

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

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

Смежные вопросы