1 [Tutorial][Isométrico] Parte 3 - Movimentação de NPCs (POR JV JUSTINO) 20/11/11, 09:09 am
HenRyqUéè
Administrador
Avaliador
Helper
Nome: [Isométrico] Parte 3 - Movimentação de NPCs
Descrição: Como fazer NPCs terem inteligência artificial
Nível: Intermediário
Requerimentos: GM8 Lite/Pro
Olá!
Aqui estamos na terceira parte dos tutoriais sobre jogos Isométricos. Nesse tutorial serão ensinados movimentos de NPCs.
Vamos Começar!
Se ainda não viu os outros tutoriais, seguem os links:
Parte 1 - Movimentação Básica
Parte 2 - Blocos Flutuantes e Plataformas Móveis
Primeiramente, vamos fazer o NPC se mover para as diagonais, em direções randômicas.
Crie um sprite e chame-a de spr_npc. Carregue esta imagem:
Crie mais uma sprite e chame-a de mask_npc. Carregue esta imagem:
Crie um objeto chamado obj_npc. Coloque nele a sprite spr_npc e a mask mask_npc.
No evento Create coloque:
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 Step coloque:
if(place_snapped(32,16) && z=zland)
{
hspeed=choose(hspeed,hspeed,2,-2);
vspeed=choose(vspeed,vspeed,1,-1);
}
Se estiver alinhado a grade (32x16) e estiver no chão, ele poderá escolher outra direção, ou continuar na mesma. Repare que as variáveis hspeed e vspeed 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 y e sua altura.
Adicione um evento de colisão com o obj_player e coloque:
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 obj_block coloque:
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 Draw coloque:
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.
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 Create adicione o seguinte código:
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 Step adicione o seguinte código:
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 Create adicione o código:
Dispara o alarme 0 em 150 Steps(5 segundos).
No evento Alarm 0 coloque:
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 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 Step do obj_block haverá um código assim:
A única coisa que resta ao NPC fazer é andar nas plataformas móveis.
Adicione um evento de colisão com o obj_platform e coloque:
if(z>=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>=other.z-40 && z {
zspeed=-2;
zspeed-=zgravity;
}
Se estiver abaixo da plataforma e pular, ele irá colidir e voltar para o chão.
E este tutorial acaba aqui. Espero que tenham gostado da terceira parte. Ainda não sei quando vou fazer a quarta parte, e qual será o tema. Mas posso garantir que ela será feita!
さようなら!
Descrição: Como fazer NPCs terem inteligência artificial
Nível: Intermediário
Requerimentos: GM8 Lite/Pro
Olá!
Aqui estamos na terceira parte dos tutoriais sobre jogos Isométricos. Nesse tutorial serão ensinados movimentos de NPCs.
Vamos Começar!
Se ainda não viu os outros tutoriais, seguem os links:
Parte 1 - Movimentação Básica
Parte 2 - Blocos Flutuantes e Plataformas Móveis
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 spr_npc. Carregue esta imagem:
Crie mais uma sprite e chame-a de mask_npc. Carregue esta imagem:
Crie um objeto chamado obj_npc. Coloque nele a sprite spr_npc e a mask mask_npc.
No evento Create coloque:
- Código:
z=0;
hspeed=choose(2,-2);
vspeed=choose(1,-1);
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 Step coloque:
- Código:
if(place_snapped(32,16))
{
hspeed=choose(hspeed,hspeed,2,-2);
vspeed=choose(vspeed,vspeed,1,-1);
}
depth=-y-z;
if(place_snapped(32,16) && z=zland)
{
hspeed=choose(hspeed,hspeed,2,-2);
vspeed=choose(vspeed,vspeed,1,-1);
}
Se estiver alinhado a grade (32x16) e estiver no chão, ele poderá escolher outra direção, ou continuar na mesma. Repare que as variáveis hspeed e vspeed 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 y e sua altura.
Adicione um evento de colisão com o obj_player e coloque:
- Código:
if(z=other.z)
{
hspeed=-hspeed;
vspeed=-vspeed;
}
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 obj_block coloque:
- Código:
if(z<other.z && z>=other.z-16)
{
hspeed=-hspeed;
vspeed=-vspeed;
}
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 Draw coloque:
- Código:
draw_sprite(sprite_index,image_index,x,y-z);
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 Create adicione o seguinte código:
- Código:
zspeed=0;
zgravity=0;
zland=0;
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 Step adicione o seguinte código:
- Código:
z+=zspeed;
zspeed-=zgravity;
if(z>zland) zgravity=0.5;
if(z<zland)
{
z=zland;
zgravity=0;
}
if(!place_meeting(x,y,obj_block)) zland=0;
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 Create adicione o código:
- Código:
alarm[0]=150;
Dispara o alarme 0 em 150 Steps(5 segundos).
No evento Alarm 0 coloque:
- Código:
zspeed=7;
alarm[0]=150;
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 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 Step do obj_block haverá um código assim:
- Código:
if(obj_player.z>=z) solid=false;
- Código:
if(obj_player.z>=z || obj_npc.z>=z) solid=false;
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 obj_platform e coloque:
- Código:
if(z>=other.z) zland=other.z;
if(zland=other.z)
{
hspeed=other.hspeed;
vspeed=other.vspeed;
}
if(z>=other.z-40 && z<other.z)
{
zspeed=-2;
zspeed-=zgravity;
}
if(z>=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>=other.z-40 && z
zspeed=-2;
zspeed-=zgravity;
}
Se estiver abaixo da plataforma e pular, ele irá colidir e voltar para o chão.
E este tutorial acaba aqui. Espero que tenham gostado da terceira parte. Ainda não sei quando vou fazer a quarta parte, e qual será o tema. Mas posso garantir que ela será feita!
さようなら!