TUTORIAL 20
Autor: Loading... | Publicado: 2011-07-05T14:36:00-07:00


1- Movimentação Básica

Primeiramente, vamos fazer o NPC se mover para as diagonais, em direções randômicas.Crie um sprite e chame-a de&nbsp;spr_npc. Carregue esta imagem:&nbsp;Crie mais uma sprite e chame-a de&nbsp;mask_npc. Carregue esta imagem:&nbsp;Crie um objeto chamado&nbsp;obj_npc. Coloque nele a sprite&nbsp;spr_npc&nbsp;e a mask&nbsp;mask_npc.No evento&nbsp;Create&nbsp;coloque:
CÓDIGO:

z=0;hspeed=choose(2,-2);vspeed=choose(1,-1);
-Explicando-z=0;Define a altura do NPC. Pode ser alterada para fazer NPCs de diferentes alturas.hspeed=choose(2,-2);vspeed=choose(1,-1);Define as velocidades horizontal e vertical, usando valores aleatórios, alterando a direção dos do NPC.No evento&nbsp;Step&nbsp;coloque:
CÓDIGO:

if(place_snapped(32,16)){&nbsp; &nbsp; hspeed=choose(hspeed,hspeed,2,-2);&nbsp; &nbsp; vspeed=choose(vspeed,vspeed,1,-1);}depth=-y-z;
-Explicando-if(place_snapped(32,16) &amp;&amp; z=zland){hspeed=choose(hspeed,hspeed,2,-2);vspeed=choose(vspeed,vspeed,1,-1);}Se estiver alinhado a grade&nbsp;(32x16)&nbsp;e estiver no chão, ele poderá escolher outra direção, ou continuar na mesma. Repare que as variáveis&nbsp;hspeed&nbsp;e&nbsp;vspeed&nbsp;aparecem duas vezes nos respectivos códigos. Isso faz com que o objeto não mude de direção a toda hora, continuando no trajeto em que está.depth=-y-z;Define a profundidade do objeto, relacionando a posição&nbsp;y&nbsp;e sua altura.Adicione um evento de colisão com o&nbsp;obj_player&nbsp;e coloque:
CÓDIGO:

if(z=other.z){&nbsp; &nbsp; hspeed=-hspeed;&nbsp; &nbsp; vspeed=-vspeed;}
-Explicando-Se o NPC colidir com o player e eles estiverem na mesma altura, o NPC, ele irá inverter a direção.Agora no evento de colisão com o&nbsp;obj_block&nbsp;coloque:
CÓDIGO:

if(z=other.z-16){&nbsp; &nbsp; hspeed=-hspeed;&nbsp; &nbsp; vspeed=-vspeed;}
-Explicando-Se ele colidir com o bloco, ele inverterá a direção. Se passar por cima ou por baixo do bloco, ele continuará andando.E por último, no evento&nbsp;Draw&nbsp;coloque:
CÓDIGO:
draw_sprite(sprite_index,image_index,x,y-z);
-Explicando-Ele desenhará o NPC nos pontos x e y, diminuindo o ponto y pela altura.

E o NPC já está pronto. Ele possui movimentos aleatórios nas diagonais e colisão com os objetos.
2- Pulo e Gravidade


Se o player pode pular e ter gravidade, qual o problema se um NPC também poder?Agora iremos configurar o pulo e a gravidade do NPC:No evento&nbsp;Create&nbsp;adicione o seguinte código:
CÓDIGO:

zspeed=0;zgravity=0;zland=0;
-Explicado-zspeed=0;Define a velocidade do pulo do NPC.zgravity=0;Define a gravidade do NPC.zland=0;Define a altura mínima do NPC.No evento&nbsp;Step&nbsp;adicione o seguinte código:
CÓDIGO:

z+=zspeed;zspeed-=zgravity;if(z&gt;zland) zgravity=0.5;
if(z
{&nbsp; &nbsp; z=zland;&nbsp; &nbsp; zgravity=0;}if(!place_meeting(x,y,obj_block)) zland=0;
Os códigos são iguais o do player, e foram explicados no primeiro tutorial.
Agora que foi tudo configurado, vamos declarar quando ocorrerá o pulo. Neste exemplo, ele será feito a cada 5 segundos, contados por um alarme.No evento&nbsp;Create&nbsp;adicione o código:
CÓDIGO:
alarm[0]=150;
-Explicando-Dispara o alarme 0 em 150 Steps(5 segundos).No evento&nbsp;Alarm 0&nbsp;coloque:
CÓDIGO:

zspeed=7;alarm[0]=150;
-Explicando-zspeed=7;O NPC pulará com a velocidade 7.alarm[0]=150;Dispara o alarme 0 novamente em 150 Steps.
Agora está tudo pronto. Mas... quando o NPC pula por cima do&nbsp;obj_block, ele trava. Por que isso acontece?Porque o bloco foi configurado para ficar sólido quando o player não estivesse em cima dele. Temos que reconfigurar isso, configurando-o a fazer o mesmo se o NPC estiver sobre ele.No evento&nbsp;Step&nbsp;do&nbsp;obj_block&nbsp;haverá um código assim:
CÓDIGO:
if(obj_player.z&gt;=z) solid=false;
Substitua por:
CÓDIGO:
if(obj_player.z&gt;=z || obj_npc.z&gt;=z) solid=false;
Assim ele não ficará mais sólido, evitando que o NPC trave sobre ele.
3- NPCs em Plataformas Móveis


A única coisa que resta ao NPC fazer é andar nas plataformas móveis.Adicione um evento de colisão com o&nbsp;obj_platform&nbsp;e coloque:
CÓDIGO:

if(z&gt;=other.z) zland=other.z;if(zland=other.z){&nbsp; &nbsp; hspeed=other.hspeed;&nbsp; &nbsp; vspeed=other.vspeed;}
if(z&gt;=other.z-40 &amp;&amp; z
{&nbsp; &nbsp; zspeed=-2;&nbsp; &nbsp; zspeed-=zgravity;}
-Explicando-if(z&gt;=other.z) zland=other.z;Se ele estiver acima da plataforma a altura mínima será a altura da plataforma.if(zland=other.z){hspeed=other.hspeed;vspeed=other.vspeed;}Se estiver em cima da plataforma ele irá se mover junto com ela.if(z&gt;=other.z-40 &amp;&amp; z{</other.z)
zspeed=-2;</other.z)
zspeed-=zgravity;</other.z)
}</other.z)
Se estiver abaixo da plataforma e pular, ele irá colidir e voltar para o chão.