Programando para comer poeira
Autor: Emilio | Publicado: 2011-05-11T13:08:00-07:00

Pois é. As coisas começaram a acumular e eu estou fazendo o exercício da semana passada.

O objetivo era fazer o personagem deixar uma nuvenzinha de poeira toda vez que aterriza no solo. Para tanto, envolve o uso de um timer, que era o objetivo do exercício.

Bem, o problema é que como isso era pra semana passada, o professor já mostrou a resolução... Então fica meio estranho eu resolver um exercício que já foi resolvido. Bom, pelo menos era um bem fácil e de solução óbvia, então não há grandes perdas mesmo. Pelo menos eu já tinha uma boa noção de como fazer antes do professor mostrar como era.

Então decidí ir um pouco além do pedido e fazer algo mais realista, porque a solução apresentada pelo professor foi eficaz porém não estava bem solucionada no quesito estética. A poeirinha acompanhava por onde o personagem andasse ao invés de ficar lá no chão. Então decidí deixar a poeira ter uma aparência mais realista nesse aspecto. (Se bem que o sprite tá bem feio, parece que o zero andou num campo embarrado.)

Confesso que deu vontade de usar "cheat" já que eu já aprendí como trabalhar com programação orientada a objetos em jogos, iria ficar muito mais fácil se eu fizesse a poeira como um objeto, mas optei pela programação sem objeto mesmo.

O primeiro problema é que a poeira se movia quando aterrizava, mas só a primeira vez. Depois nunca mais andava, e aparecia sempre na posição final. Bom, resolução foi fácil até:

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(po_x &gt; 40 &amp;&amp; chao == false)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; po_x = 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }

Na verdade não é a solução ideal, não funciona lá muito bem se o personagem pular constantemente, mas resolve em 90% dos casos.

Outro problema é que a poeira não ficava no chão quando o personagem pulava, ela subia junto. Foi surpreendente que a solução foi extremamente fácil. Quando o professor foi por a linha de código pra poeira, ele decidiu evitar problemas e usar a variável do personagem pra posição y. Bem, eu só troquei a variável por uma constante e agora a poeira fica lá no chão...:

&nbsp;&nbsp; &nbsp;draw_sprite(backbuffer,poeira,px + 20 + po_x,500);

Tá lá. 500. Ok, não resolve pro caso de múltiplas plataformas, só no chão, mas aí o programa já estaria muito diferente pra poder suportar as plataformas.

Por último foi a posição x. A poeira seguia o personagem se ele andasse também. Bleh, com o scrolling ficou complicado. Na verdade ficou o suficiente pra eu ter preguiça de achar uma solução ideal. Daí não fiz. :D

Ficou assim:

&nbsp;&nbsp; &nbsp;if(scrolling == true)
&nbsp;&nbsp; &nbsp;{
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;map_move -=10;
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;px -=10;
&nbsp;&nbsp; &nbsp;}

Não ficou lá muito bom, indo pra direita a poeira fica mesmo no chão, mas pra esquerda a poeira anda um pouquinho. E só funciona no scrolling, quando não tem a poeira continua andando com o personagem. Enão é uma daquelas soluções que tu conserta um lado do programa, quebra o outro. Aí tu vai consertar aquele lado quebrado, quebra o lado que tu tinha consertado antes. Geralmente após dois vais e vens o resultado são os dois lados quebrados. Mas são só detalhes, o essencial da lógica tá feito.

Na verdade eu fiz a parte da poeira ficar no chão sem o scrolling... Mas não sei mais onde eu corrigí isso.&nbsp; 
Bom, o importante é renderizar usando uma variável diferente da variável  do personagem, assim você garante que a poeira não vai andar com o  personagem, e quando for gerar a poeira você só vai igualar a posição x  do personagem com a posição x da poeira, e dalí você trabalha só a  variável da poeira. 



A ironia é que fui eu quem comeu poeira, fiz o exercício com 8 dias de atraso.
É isso. Essa semana ainda eu posto o exercício dessa semana. Se é que terá. Senão eu posto sobre meu jogo.