TUTORIAL 17
Autor: Loading... | Publicado: 2011-07-05T14:27:00-07:00

Descrição:&nbsp;Como fazer movimentos, gravidade e pulos em jogos isométricos.Nível:&nbsp;IntermediárioRequerimentos:&nbsp;&nbsp;Lite/ProOlá!Estarei fazendo alguns tutoriais sobre jogos isométricos. Como serão muito compridos, irei dividi-los em partes. Na primeira parte, será ensinado como fazer movimentos em jogos isométricos, pulos e gravidade, e colisão com blocos.Vamos Começar!
1- Uma breve explicação


Muitos têm dificuldade ao fazer pulos em jogos isométricos. Se&nbsp;x&nbsp;representa o comprimento e&nbsp;y&nbsp;a largura, o que representa a altura? Assim como no 3D, o ponto&nbsp;z&nbsp;representa a altura.Os pulos e a gravidade serão coordenados pelo ponto&nbsp;z, enquanto&nbsp;x&nbsp;e&nbsp;y&nbsp;coordenam os movimentos do player.
2- Movimentação do Player


Os tutoriais explicarão somente como movimentar um objeto, então não há necessidade de usar muitas sprites.Crie uma sprite e chame-a de&nbsp;spr_player. E nela carregue esta imagem:&nbsp;Crie outra sprite e chame-a de&nbsp;mask_player. Carregue esta imagem:&nbsp;. Depois, altere sua&nbsp;Origin&nbsp;para&nbsp;X=0 e&nbsp;Y=-16.Crie um objeto chamado&nbsp;obj_player. Coloque nele a sprite&nbsp;spr_player&nbsp;e a mask&nbsp;mask_player.No evento&nbsp;Create&nbsp;coloque:
CÓDIGO:

z=0;zland=0;zspeed=0;zgravity=0;
-Explicando-z=0;Esta variável definirá a altura do player.zland=0;Esta variável definirá a altura mínima, evitando que o player atravesse o "chão".zspeed=0;Esta variável definirá a altura do pulo.zgravity=0;Define a gravidade do player.Agora no evento&nbsp;Step&nbsp;coloque:
CÓDIGO:

if(keyboard_check(vk_up) &amp;&amp; keyboard_check(vk_left)){&nbsp; &nbsp; vspeed=-2;&nbsp; &nbsp; hspeed=-4;}else if(keyboard_check(vk_up) &amp;&amp; keyboard_check(vk_right)){&nbsp; &nbsp; vspeed=-2;&nbsp; &nbsp; hspeed=4;}else if(keyboard_check(vk_down) &amp;&amp; keyboard_check(vk_left)){&nbsp; &nbsp; vspeed=2;&nbsp; &nbsp; hspeed=-4;}else if(keyboard_check(vk_down) &amp;&amp; keyboard_check(vk_right)){&nbsp; &nbsp; vspeed=2;&nbsp; &nbsp; hspeed=4;}else if(keyboard_check(vk_up)){&nbsp; &nbsp; vspeed=-2;&nbsp; &nbsp; hspeed=0;}else if(keyboard_check(vk_down)){&nbsp; &nbsp; vspeed=2;&nbsp; &nbsp; hspeed=0;}else if(keyboard_check(vk_left)){&nbsp; &nbsp; hspeed=-4;&nbsp; &nbsp; vspeed=0;}else if(keyboard_check(vk_right)){&nbsp; &nbsp; hspeed=4;&nbsp; &nbsp; vspeed=0;}else{&nbsp; &nbsp; vspeed=0;&nbsp; &nbsp; hspeed=0;}
-Explicando-Este código é muito grande para explicar um por um os itens. Eles só farão o player andar. Repare que&nbsp;vspeed&nbsp;é menor do quehspeed, pois se não fosse, daria impressão de que o player está correndo para cima e para baixo, e não andando&nbsp;Ainda no evento&nbsp;Step&nbsp;coloque:
CÓDIGO:

if(keyboard_check_pressed(vk_space) &amp;&amp; z=zland) zspeed=7;z+=zspeed;zspeed-=zgravity;if(z&gt;zland) zgravity=0.5;
if(z
{&nbsp; &nbsp; z=zland;&nbsp; &nbsp; zgravity=0;}depth=-y-z/2;
-Explicando-if(keyboard_check_pressed(vk_space) &amp;&amp; z=zland) zspeed=7;Se for pressionada a tecla&nbsp;Space&nbsp;e o player estiver no chão, ele pulará.z+=zspeed;A altura irá aumentando conforme a velocidade do pulo.zspeed-=zgravity;A velocidade irá diminuir aos poucos, conforme a gravidade.if(z&gt;zland) zgravity=0.5;Se o objeto não estiver no chão, a gravidade será de 0.5if(z{</zland)
z=zland;</zland)
zgravity=0;</zland)
}</zland)
Se a altura for menor que a altura mínima, ele ficará na altura mínima e a gravidade será 0.depth=-y-z/2;Calcula a profundidade do objeto, conforme a posição&nbsp;y&nbsp;e a altura.Agora vem o truque de tudo. No evento&nbsp;Draw&nbsp;coloque:
CÓDIGO:
draw_sprite(sprite_index,image_index,x,y-z);
-Explicando-Ele desenha o player nos pontos&nbsp;x&nbsp;e&nbsp;y, diminuindo a altura do ponto&nbsp;y.Agora estão prontos os movimentos do player!&nbsp;
2- Colisão com Blocos


Agora faremos obstáculos, que são blocos onde o player só pode atravessar se passar por cima deles. Como fazer isso? Lembram-se do que eu disse no começo?
zland=0;Esta variável definirá a altura mínima, evitando que o player atravesse o "chão".
Nesse caso, é só fazer a altura mínima ser a altura do bloco.Crie uma nova sprite e chame-a de&nbsp;spr_block. Carregue a imgem:&nbsp;Crie outra sprite e chame-a de&nbsp;mask_block&nbsp;e carregue a imagem:&nbsp;Crie um objeto chamado&nbsp;obj_block. Coloque nele a sprite&nbsp;spr_block&nbsp;e a mask&nbsp;mask_block.No evento&nbsp;create&nbsp;coloque:
CÓDIGO:

z=16;depth=-y-z/3;
-Explicandoz=16;Esta variável define altura do bloco.depth=-y-z/3;Define a profundidade do objeto, relacionando a posição&nbsp;y&nbsp;com a altura. Como o objeto é imóvel, não há necessidade de recalcular a profundidade a cada&nbsp;stepNo evento&nbsp;Step&nbsp;coloque:
CÓDIGO:

if(obj_player.z&gt;=z) solid=false;else solid=true;
-Explicandoif(obj_player.z&gt;=z) solid=false;Se o player estiver sobre o bloco, ele não será solido, permitindo que o player caminhe sobre ele.else solid=true;Se o player estiver abaixo da altura do bloco, ele será sólido, fazendo com que o player não possa atravessá-lo.Agora que o objeto já foi configurado, vamos voltar para o player. Adicione um evento de colisão com o&nbsp;obj_block&nbsp;e coloque:
CÓDIGO:
if(z&gt;=other.z) zland=other.z;
-Explicandoif(z&gt;=other.z) zland=other.z;Se o player estiver acima bloco, a altura mínima será a altura do bloco, fazendo com que o player pare sobre ele.Durante a colisão com o objeto, o player terá dificuldade para se locomover. Se quiser, poderá adicionar o seguinte código para que o player passe escorregando pelo bloco.
CÓDIGO:

if(keyboard_check(vk_left) &amp;&amp; z=zland){&nbsp; &nbsp; if(place_free(x-4,y+2))&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; hspeed=-4;&nbsp; &nbsp; &nbsp; &nbsp; vspeed=2;&nbsp; &nbsp; }&nbsp; &nbsp; if(place_free(x-4,y-2))&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; hspeed=-4;&nbsp; &nbsp; &nbsp; &nbsp; vspeed=-2;&nbsp; &nbsp; }}if(keyboard_check(vk_up) &amp;&amp; z=zland){&nbsp; &nbsp; if(place_free(x-4,y-2))&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; hspeed=-4;&nbsp; &nbsp; &nbsp; &nbsp; vspeed=-2;&nbsp; &nbsp; }&nbsp; &nbsp; if(place_free(x+4,y-2))&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; hspeed=4;&nbsp; &nbsp; &nbsp; &nbsp; vspeed=-2;&nbsp; &nbsp; }}if(keyboard_check(vk_right) &amp;&amp; z=zland){&nbsp; &nbsp; if(place_free(x+4,y+2))&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; hspeed=4;&nbsp; &nbsp; &nbsp; &nbsp; vspeed=2;&nbsp; &nbsp; }&nbsp; &nbsp; if(place_free(x+4,y-2))&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; hspeed=4;&nbsp; &nbsp; &nbsp; &nbsp; vspeed=-2;&nbsp; &nbsp; }}if(keyboard_check(vk_down) &amp;&amp; z=zland){&nbsp; &nbsp; if place_free(x-4,y+2)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; hspeed=-4;&nbsp; &nbsp; &nbsp; &nbsp; vspeed=2;&nbsp; &nbsp; }&nbsp; &nbsp; if(place_free(x+4,y+2))&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; hspeed=4;&nbsp; &nbsp; &nbsp; &nbsp; vspeed=2;&nbsp; &nbsp; }}

No evento&nbsp;Step, adicione o código:
CÓDIGO:
if !place_meeting(x,y,obj_block) zland=0;
-Explicando-Se o bloco não estiver embaixo do player, a altura mínima será 0, que é a altura do "chão".Você pode fazer blocos de diferentes tamanhos. Para isso, adicione um novo objeto, e coloque como&nbsp;parent&nbsp;o&nbsp;obj_block&nbsp;e mudar a altura (a altura deve ser divisível a 16).Para posicionar os objeto na room, ela deve ter a grade em 32x16.