2012/11/21

Interação entre o Mario e um bloco sólido (hitbox)

 

Para que você não se perca nessa postagem, é recomendado usar o Script de Utilidade, para poder visualizar a cada frame, a posição horizontal e vertical de Mario. Durante o jogo, nenhum outro "objeto" vai interagir mais com o personagem do que os blocos sólidos, que constituem o chão, o teto e a parede que, a princípio, não podem ser atravessadas.

É muito bem sabido que o piso, as paredes e o teto do jogo se comportam como se fossem todos feitos a partir de um monte de blocos sólidos de cimento, que aparece no topo da postagem. Ainda que o design seja diferente e aparente ser contínuo, a mecânica do jogo segue invariável, a menos que edições mais profundas sejam feitas.

A fim de analisar a interação, vamos montar um cenário em que haja apenas um bloco e que Mario esteja pequeno. Se ele estivesse grande ou montado no Yoshi, os resultados seriam diferentes. Se ele estiver encolhido (como quando se aperta para 'baixo'), os resultados serão idênticos. Assim, consideraremos as coordenadas (x,y) do Mario, como se ele fosse um ponto material e veremos quando ele estará em contato com o bloco.

Topo:
Vemos que y oscilará seus subpixel, mas manterá seu valor na casa dos 320. No intervalo de 421.0 até 442.F, o Mario não irá cair do bloco. Entretanto, qualquer movimento para fora o fará cair.

 
Lados:
A lateral esquerda é limitada por x = 419.0. Qualquer valor menor que esse não restringirá o movimento do Mario. Mas, na figura à esquerda, se ele se movesse sequer um subpixel para a direita, haveria uma interação com o bloco e sua posição seria de 418.0, ao invés de 419.0.
Na figura da esquerda a situação é similar. Ir um subpixel para a esquerda iria fazer Mario ir de x = 445.0 para x = 444.F, caso não houvesse bloco. Mas como há, tal posição iria ser imediatamente transferida um pixel para a direita, ou seja, para 445.F.


Base: 
Colocando Mario embaixo do bloco e pulando, veremos que ele jamais irá obter um y < 351.0 (lembre-se, o eixo do y está virado de cabeça para baixo, altos valores de y significam que Mario está mais para baixo). Além disso, somente para y na casa dos 351 pixels, não importando os subpixels, é que ele baterá a cabeça no teto e passará de uma velocidade vertical negativa (subindo) para uma positiva (caindo).


Vértices:
A mera observação da figura nos revela algo interessante. A interação não é semelhante a uma interação entre um ponto e um retângulo. No intervalo horizontal [419.0 , 420.F], Mario não poderia estar em cima do bloco e cairia, mas também seria empurrado para fora. O mesmo se pode dizer a respeito do intervalo [443.0 , 444.F]. Tais "buracos" nas partes superiores são a chave para se realizar a técnica corner clip.

A parte da base tem "buracos" ainda maiores, conforme nos mostram as ilustrações abaixo.




O teto não existe no intervalo horizontal [419.0 , 423.F]; também não existe em [440.0 , 444.F]. Entretanto, nesses intervalos há paredes que expulsam o Mario pra fora. Mas, como vemos no "buraco" de baixo na esquerda, a parede só age para y < 346.0.

Resumo:
Nessas condições, eu fiz um esquema aproximado de como é o formato real de um bloco, lembrando que o Mario é pequeno e tratado como um ponto no plano cartesiano:





  • A interação é calculada a cada frame e depende apenas da posições horizontais e verticais do Mario e do bloco (em pixels). Subpixels são irrelevantes no procedimento.
  • O bloco tem "buracos" em cima e em baixo. O comprimento horizontal dos de cima são de 2 pixels; dos de baixo são de 5 pixels.
  • As paredes empurram o Mario para fora numa taxa de 1 pixel por frame. Isso será útil na hora de entrar temporariamente dentro da parede.
  • O topo e a base funcionam de maneira diferente, pois "expulsam" Mario imediatamente, não a 1 pixel por frame.
  • Outros blocos do jogo têm o mesmo comportamento. Até mesmo este: