2016-02-07 5 views
1

Что такое эффективный метод для мгновенного обнаружения попадания в SpriteKit? Используя встроенный физический движок SpriteKit, я хочу собирать затронутые объекты в течение одного кадра для таких ситуаций, как радиус взрыва взрыва.Мгновенное обнаружение удара с помощью SpriteKit

Я подумал о добавлении SKNode с SKPhysicsBody к взрывоопасному объекту и доступа к свойству allContactedBodies при его взрыве, но это добавит ненужное обнаружение столкновений в другие фреймы.

Я также рассмотрел возможность добавления SKNode с SKPhysicsBody на сцену или изменение существующего во время взрыва и использование действия для удаления или восстановления узла после короткой продолжительности, но это кажется излишне сложным и может задержать удар до следующего кадра.

Я задался вопросом, есть ли способ расширить SKPhysicsWorld, чтобы позволить перечислять тела с кругом в дополнение к прямоугольнику - или расширить SKPhysicsBody, чтобы разрешить ручное обнаружение столкновения с другим тестом. Однако я не вижу, как получить доступ к данным формы формы SKPhysicsBody, чтобы выполнить любой из этих действий.

ответ

0

Если бы я решил эту проблему, я бы сделал это, создав узел с физическим телом, а затем возился со своими динамическими свойствами, свойствами категорииBitMask и collisionBitMask. Я бы установил динамическое значение в false, поскольку теоретически столкновение/взрыв не перемещается, потому что он попадает в другие объекты. Я бы установил ее categoryBitMask, чтобы каждый объект сгенерировал отчет «didBeginContact» при столкновении с ним. И я бы установил его collisionBitMask, чтобы он никогда не вызывал импульсы из-за столкновения. Таким образом, физическое тело является скорее зондом, чем фактическим физическим объектом, только тем, что является его.

В конце этого физическое тело должно вызывать сообщения о столкновении, но не отталкивать никаких объектов. Очевидно, вы можете создать это тело и просто не добавлять его в сцену, пока не наступит время для обнаружения вещей. Затем, после того, как рамка закончена, и вы знаете все физические тела, к которым она прикасалась, вы можете снова удалить ее.

Тогда я бы установил сцену как физическийконтактDelegate и попытался начать метод контакта.

class GameScene: Scene, SKPhysicsContactDelegate { 
func didBeginContact(contact: SKPhysicsContact) 
    { 
     var AName:NSString = NSString(string: contact.bodyA.node!.name!) 
     var BName:NSString = NSString(string: contact.bodyB.node!.name!) 

     } 
} 

Тогда я бы, если заявления проверки, если либо AName или BNAME были название вашего «зондирующего» узловой/physicBody. Затем после этого вы можете добавить код, чтобы делать все, что вы хотите в результате этого столкновения.

Удачи вам! Если у вас возникли проблемы с свойствами битовой маски, я бы настоятельно рекомендовал проверить this.

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