Saltando pelas plataformas
Autor: Emilio | Publicado: 2011-05-02T19:49:00-07:00

Pois é. Fazia um tempinho que não postava nada. Pessoal começou a reclamar, então cá estou.
(É... Até que tem bastante gente lendo esse blog no momento. XD) Feriadão de páscoa, "piguiç", e afins. Mas voltei.

Desafio dest... Da outra semana era fazer o Zero pular de uma plataforma para outra. O desafio nem explicitamente especificava se esta plataforma deveria estar em outra posição X da inicial, pelo menos a Y. (Que por as duas no mesmo lugar não tem a menor graça. ¬¬)

Como eu irei usar um sistema de colisão deveras complexo no meu projeto, pensar em gambiarra seria pecado. (Aliás, não postei nada sobre meu projeto, em breve eu vou.)

Primeiro comecei analizando o jogo no estado atual. MEUS OLHOS! Eu até deixo passar o fundo em parallax scrolling fugindo da tela e gerando uma coluna preta à esquerda (e sorte que gera algo, em algumas engines acontecem coisas muito bizarras no caso), mas o pulo realmente estava estranho: 


Tudo bem que é até uma mecânica legal de se usar... Mas é um bug.
Não deixei barato: decidí não somente fazer ele pular para virtualmente qualquer plataforma (e pro caso de estourar a cabeça numa plataforma acima, fazê-lo cair com gravidade e tudo mais) como evitar o uso de uma varredura pelas posições das plataformas, e sim reconhecer quando achou o chão e parar de cair. Ou seja, uma verdadeira colisão física, independente das posições das plataformas (Elas até poderiam estar se movendo! Bem, ia faltar a lógica de fazer ele mover conforme a plataforma se move, mas ficaria meia lógica pronta e genérica.).

Para minha infelicidade, essa lógica desmonstrou-se além das minhas capacidades de programador (e não de PoGramador).
Foi meio que o mesmo drama com o Haggar, ele desaprendia a pular. Só que nesse teve uma novidade, ele parou de reconhecer o que é chão e as vezes aparecia voando pela tela.

Um dos principais problemas, que o professor havia mencionado na sala, é que graças ao fator gravidade não há mais como prever, em posição da tela, onde que o personagem vai parar. Então o que ocorria era o personagem entrar terra adentro e não conseguir mais sair, ou simplesmente andar lá como se fosse o chão. Então se eu usasse um personagem auxiliar para verificar o chão antes de se enterrar, e por o personagem no lugar certo, até funcionava. O problema é que daí ele ficava andando flutuando acima da plataforma. Eu sabia fazer o personagem achar o chão, só não precisamente...

Para isso bolei outra lógica de colisão, que seria uma varredura do chão. Ele tentaria achar o chão analizando os píxeis do chão. Me chame de suicida, mas usei um "while" para isso! Aparentemente não causou problemas já que era um while fazendo cálculos inocentes. (Só quando programei errado. Aí o bicho pegou. Deu pra sentir o gosto de tela azul.)


Olhando assim parece fácil programar. E é! Mas não funcionou. XD
Eu ainda usava o boundboxing, só que eu fazia uma varredura para ajustar a posição atual com a que deveria ser.

Mas sei lá, não sei onde eu errei, mas não funcionou. O personagem geralmente não saia da terra apesar de tudo, e ele não caia de fato no chão. Nem pulava mais. E andava no ar.

Foram quatro horas pra pensar e programar tudo, e não deu. Daria pra fazer em vinte minutos na gambiarra, mas não. Me recuso.

É isso.