SpriteKit: как предотвратить столкновение двух SKSpriteNodes (в Swift)

Я делаю относительно простую игру, состоящую из игрока, препятствий и монет. Моя цель - иметь столкновения только между препятствиями и игроком, а также чтобы контакт между игроком и монетой вызывал didBeginContact.

Вот код:

//declare categoryBitMasks
struct physicsCategories {
    static let playerCategory : UInt32 = 1
    static let coinCategory: UInt32 = 2
    static let obstacleCategory : UInt32 = 3 
}

//assign physics categories 
playerNode!.physicsBody?.categoryBitMask = physicsCategories.playerCategory
playerNode!.physicsBody?.collisionBitMask = physicsCategories.obstacleCategory
playerNode!.physicsBody?.contactTestBitMask = physicsCategories.coinCategory


obstacleNode.physicsBody?.categoryBitMask = physicsCategories.obstacleCategory
obstacleNode.physicsBody?.collisionBitMask = physicsCategories.playerCategory
obstacleNode.physicsBody?.contactTestBitMask = 0


coinNode.physicsBody?.categoryBitMask = physicsCategories.coinCategory
coinNode.physicsBody?.collisionBitMask = 0
coinNode.physicsBody?.contactTestBitMask = physicsCategories.playerCategory

Функция didBeginContact удаляет монету из представления и добавляет ее в банк валют пользователя. Эта функция вызывается, когда игрок ударяет по монете, но столкновение происходит до того, как монета удаляется. Столкновение очень мешает игровому процессу, и я не смог найти работающее решение. Какие-либо предложения?


person Jamman00    schedule 25.01.2016    source источник
comment
ваша проблема в ваших категориях, поищите, как работают битовые маски. Вы не можете сделать 1,2,3, они должны быть степенью 2   -  person Knight0fDragon    schedule 25.01.2016
comment
@Knight0fDragon, так что я мог сделать вместо этого, 2, 4, 8?   -  person Jamman00    schedule 25.01.2016
comment
да 1,2,4,8,16 или простой способ понять 0x1 ‹‹ 0, 0x1 ‹‹ 1, 0x1 ‹‹ 2 и т. д.   -  person Knight0fDragon    schedule 25.01.2016
comment
@Knight0fDragon сделал это, спасибо! Если вы хотите опубликовать это как ответ, я отмечу это правильно.   -  person Jamman00    schedule 25.01.2016
comment
На самом деле я ищу аналогичный вопрос и отмечаю этот дубликат, так как он уже задавался.   -  person Knight0fDragon    schedule 25.01.2016
comment
Я не знаю, мне трудно его найти, я уже отвечал на этот вопрос, но я думаю, что другой парень удалил его. Если кто-то увидит, пожалуйста, отметьте это как дубликат.   -  person Knight0fDragon    schedule 25.01.2016


Ответы (1)


Ваша проблема в ваших категориях, поищите, как работают битовые маски. Вы не можете сделать 1,2,3, они должны быть степенью 2; 0x1 ‹‹ 0, 0x1 ‹‹ 1, 0x1 ‹‹ 2 и т. д.

person Knight0fDragon    schedule 25.01.2016