2015-02-15 2 views
1

Когда мяч сталкивается с чашей, оценка должна увеличиваться на 1. Однако в настоящее время она увеличивается на 1, 3 или иногда 4, что означает, что столкновение обнаруживается несколько раз.Физическое обнаружение столкновения несколько раз

Я думаю, что я должен быть проверка столкновений неправильно:

let ballCategory : UInt32 = 0x1 << 0 
let cupCategory : UInt32 = 0x1 << 1 

И в моем didMoveToView:

//Set physicsBody of scene to a physics body that borders the screen 

self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame) 
physicsWorld.contactDelegate = self 

//Ball 
ballSprite.physicsBody = SKPhysicsBody(rectangleOfSize: ballSprite.size) 
ballSprite.physicsBody!.categoryBitMask = ballCategory 
ballSprite.physicsBody!.contactTestBitMask = cupCategory 

//Cup 
cupSprite.physicsBody = SKPhysicsBody(edgeLoopFromRect: cupSprite.size) 
cupSprite.physicsBody!.categoryBitMask = cupCategory 
cupSprite.physicsBody!.contactTestBitMask = ballCategory 

В моих didBeginContact:

var firstBody: SKPhysicsBody 
var secondBody: SKPhysicsBody 

//Assign the two physics bodies so that the one with the lower category is always stored in firstBody 
if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 

    firstBody = contact.bodyA 
    secondBody = contact.bodyB 
} 
else { 

    firstBody = contact.bodyB 
    secondBody = contact.bodyA 
} 

//contact between ball and cup 
if firstBody.categoryBitMask == ballCategory && secondBody.categoryBitMask == cupCategory { 

    score++ 
    println("point scored") 
    moveBall() //Move ball back to start position 
} 

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

+0

Убедитесь, что у вас есть полностью отдельные категории объектов. – SwiftLanding

ответ

2

Вы можете установить одно значение BOOL, чтобы проверить, разрешено ли управление контактами (установите YES в начале). После обновления оценки вы можете установить эту переменную в НЕТ, а затем запустить moveBall(), чтобы начать снова, а в конце метода moveBall() значение BOOL установлено в YES. Я думаю, что что-то подобное должно работать.

Другой способ - удалить шариковые или чашечные узлы из родителя и установить его на ноль (а затем повторно воссоздать). Также я не знаю, насколько SpriteKit «нравится» таким образом (удаление узлов перед физическим моделированием).

Третий способ - иметь класс Ball с некоторым свойством BOOL, указывающим, должен ли шар перемещаться в исходное положение. Основываясь на этом значении, вы должны обновить контакты переменной/ручку и столкновения. Поэтому после обновления оценки вы устанавливаете значение BOOL в YES, а затем запускаете moveBall(), а затем устанавливаете значение BOOL на NO и т. Д. Подобно тому, как я описал первый метод.

+0

В качестве дополнения ознакомьтесь с этим http://stackoverflow.com/a/26110174/3402095 или http://stackoverflow.com/a/26723392/3402095 – Whirlwind

0

это случилось со мной, что делать просто, просто определите все, что угодно, каждый из них нуждается в одном: сначала сделайте это для узлов, либо если его граница экрана или то, что когда-либо попадет в узел, скажите это:

let nodesCatergory : UInt32 = 0x1 << 1 

после, поставить этот nodesCatergory к everynode у вас есть в игре, или узлы, которые он сталкивается с, а затем добавить его так:

if firstBody.categoryBitMask == ballCategory &&  secondBody.categoryBitMask == nodesCatergory { 
//score++ 
println("point scored, NOT!") 
//moveBall() //Move ball back to start position 
    } 

и это так! вы можете сделать это до получения желаемого эффекта!

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