Lidando com física em Sprite Kit
Introdução
Quando começamos a pensar sobre interação de objetos e física numa cena de SpriteKit temos alguns tópicos que são fundamentais para que o nossa cena funcione. O objetivo desta matéria é entendermos esses tópicos mais a fundo.
Todo objeto em cena SpriteKit necessariamente herda do tipo SKNode. Portanto, quando falamos em objetos em cena, falamos em Nodes.
Corpo Físico
O importante para nós sobre esses Nodes é justamente que todos eles tem uma propriedade chamada physicsBody. Essa propriedade é a responsável pelo comportamento físico do nosso Node em cena e é nela que iremos focar.
Para entender como manipular objetos com um corpo físico vamos precisar entender um pouco mais sobre seu funcionamento. Para isso, vamos ver mais sobre seus principais pilares:
- categoryBitMask
- collisionBitMask
- contactBitMask
Máscaras Binárias
Essas bit masks(máscaras binárias) definem toda a interação física entre objetos em cena.
Quando dois objetos se entrelaçam em cena, podem ocorrer dois fenômenos:
Colisão: Dois corpos não ocupam o mesmo espaço ao mesmo tempo. A colisão se certifica apenas de que os dois corpos se repilam.
Contato: Notificação de toque. O contato dispara uma chamada avisando que dois objetos se tocaram.
O responsável por determinar esses fenômenos é a categoryBitMask. Quando dois objetos começam a se entrelaçar numa cena SpriteKit, um dos objetos é o que faz a ação, e o outro que sofre a ação. Então a categoryBitMask do que sofre a ação é selecionada e será comparada com a collisionBitMask e contactBitMask do objeto que a fez.
Essa comparação é pelos valores binários das bit masks e aplicado uma operação binária AND(multiplicação) entre elas. Somente se o valor final conter 1(verdadeiro), ocorrerá o fenômeno, seja ele o contato ou a colisão.
A colisão é feita automaticamente pelo physicsWorld e não temos acesso a manipulação da mesma, tornando impossível personalizar o código de colisão.
Pro caso do contato, ainda precisaremos de um responsável que lide com a informação de que o contato ocorreu, o que se dá por qualquer classe que herde de SKPhysicsContactDelegate.
Agora temos acesso a duas funções, que serão chamadas quando começar o contato entre dois objetos e quando acabar o mesmo.
A maior dica para garantir a boa interatividade entre Nodes em cena é uma boa organização de código, criando um caminho de dois lados entre os objetos, certificando que mesmo que o objeto sofra ao invés de fazer a ação, o fenômeno ainda ocorra e lembrar que os valores das bit masks são usados em binários.