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)