Avatar do usuário
Tutoriais & Aulas
Colaborador
Colaborador
Autor
Mensagens: 174
Registrado em: Qui Abr 28, 2016 11:37 am
Karma: 240

[INT] [Tutorial] Patrulha Top-Down

Qui Abr 28, 2016 4:37 pm

Autor original: Gonçalves


SISTEMA DE PATRULHA TOP-DOWN

Bom, vou ensinar como criar um sistema de patrulha para jogos top-down, é simples.

1. Definindo as configurações de patrulha: Primeiramente vamos definir as configurações da patrulha no Create do objeto:

patrulhar=true
fim_patrulha=false
ponto_atual=0
patrulha_total=0


Sendo que:

  • patrulhar define se esse objeto vai patrulhar ou não.
  • fim_patrulha define se ele vai parar após passar por todos os pontos de patrulha.
  • patrulha_total definirá por quantos pontos ele passará, deixe 0.
  • ponto_atual define o ponto inicial, deixe 0 caso não saiba o que está fazendo.

2. Definindo os pontos de patrulha: Abaixo dos últimos códigos definiremos os pontos de patrulha x e y usando arrays: (MÉTODO 1)

patrulha_x[0]=20
patrulha_y[0]=20

patrulha_x[1]=150
patrulha_y[1]=50

patrulha_x[2]=80
patrulha_y[2]=180

patrulha_total=3


Sempre seguindo a array, e definindo a n° de patrulhas ao fim...
Se você quiser faço como eu (MÉTODO 2), crie um script chamado adicionar_ponto_patrulha(x,y) com o seguinte conteúdo:

patrulha_x[patrulha_total]=argument0
patrulha_y[patrulha_total]=argument1
patrulha_total+=1


O código acima então ficará assim:

adicionar_ponto_patrulha(20,20)
adicionar_ponto_patrulha(150,50)
adicionar_ponto_patrulha(80,180)


A variável patrulha_total já terá o valor 3 automaticamente por causa do script.

3. Movimentação de patrulha:

Agora no Step do objeto vai o sistema de movimentação:

if patrulhar=true
{
    mp_potential_step(patrulha_x[ponto_atual],patrulha_y[ponto_atual],2,0)

    if distance_to_point(patrulha_x[ponto_atual],patrulha_y[ponto_atual]) <=0
    {
    ponto_atual+=1
    }
    
    if ponto_atual >= patrulha_total
    {
        if fim_patrulha = true
        {
        patrulhar=false
        }
        else
        {
        ponto_atual=0
        }
    }

}


if patrulhar=true vai checar se a variável de patrulha do objeto está ativada, se sim, mp_potential_step vai fazer com que ele ande até o ponto de patrulha atual. if distance_to_point vai checar se ele chegou, se sim, passar pro próximo. if ponto_atual >= patrulha_total checa se ele passou por todos os pontos, e se a variável fim_patrulha for true, ele para, caso contrário, ele vai voltar pro primeiro ponto e fazer tudo de novo.

ADICIONAIS

1. Desenhando os pontos para Debugging: Crie uma variável qualquer (no meu caso nomeei w) no Create com valor 0:

w=0


E no Draw use:

draw_sprite(sprite_index,image_index,x,y)

for (w=0; w<patrulha_total; w+=1)
{
    draw_circle_color(patrulha_x[w],patrulha_y[w],5,c_red,c_red,1)
}


Isso vai desenhar a sprite e círculos nos pontos de patrulha do objeto.

2. Use a relatividade à posição atual para poder usar vários objetos: Ao invés de usar apenas números para dar um ponto de patrulha, você pode usar em relação ao xy do objeto:

adicionar_ponto_patrulha(x+20,y+20)
adicionar_ponto_patrulha(x+150,y+50)
adicionar_ponto_patrulha(x+80,y+180)


Assim você poderá colocar vários objetos iguais e eles irão patrulhar, sem ir pro mesmo lugar.

3. Crie um "delay time": Caso você queira que o objeto, ao chegar em um ponto, dê uma parada para depois continuar, crie uma variável delay no create, siga meu exemplo se quiser:

delay=40


Agora subsititua essa parte do código normal de movimentação:

if distance_to_point(patrulha_x[ponto_atual],patrulha_y[ponto_atual]) <=0
    {
    ponto_atual+=1
    }


Por esse:

if distance_to_point(patrulha_x[ponto_atual],patrulha_y[ponto_atual]) <=0
    {
    patrulhar=false
    alarm[0]=delay
    }


E no evento Alarm 0 use:

ponto_atual+=1
patrulhar=true


Assim ele vai esperar 40 frames antes de ir pro próximo ponto.

Talvez ponha mais alguns adicionais posteriormente, mas por enquanto é isso. VALEU!

Tags:

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes