Lidando com física em Sprite Kit

Pedro Farina
Apple Developer Academy | Mackenzie
2 min readAug 12, 2019

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.

Declaração de tipos diferentes de 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.

Exemplos de construtores de um PhysicsBody

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.

Exemplo de configuração de bit masks

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.

Exemplo de ContactDelegate

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.

--

--

Pedro Farina
Apple Developer Academy | Mackenzie

Estudante de Ciência da Computação. Desenvolvedor iOS — Apple Developer Academy | Mackenzie.