Aula Avancada - Pathfinding

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Qualidade Aula Avancada - Pathfinding

Mensagem por PedroX em Seg 31 Jan 2011, 19:17

Pathfinding


Essa é a primeira aula da serie "Aulas avançadas". Houve um atraso, era para ser ontem, mas nao deu, entao vai ser hoje.

Essa aula é um pouco avancada e pode ser feita em qualquer versão do Game Maker, mas é recomendada para as versoes: GM7 e GM8.

Introdução

Se voce nao sabe o que é pathfinding, aqui esta a tradução:
'path' - caminho
'finding' - procurando
'pathfinding' - procurando caminho

Pathfinding é muito usado em jogos 2D com visao Top Down, assim o inimigo acha o caminho mais perto que deve seguir desviando dos obstaculos, como arvores, caixas e paredes.

Vamos comecar entao.

1 - Crie uma sprite que sera a parede, com tamanho 16x16 px.
2 - Crie outra sprite que sera o player, com tamanho 8x8 px.

Agora voce deve criar tres objetos, 1 para o player, 1 para a parede e 1 para ser o controlador.
Coloque as sprites no player e na parede. Chame como quiser os objetos.

Objeto Controlador
CREATE
Código:

global.mpgrid=mp_grid_create(0,0,room_width/16,room_height/16,16,16)//cria um plano de movimento, criando quadrados de 16 pixels em toda a room
mp_grid_add_instances(global.mpgrid,obj_parede,0)//adiciona a parede nessa grade
PAREDE
Coloque ele como solido e com depth 1.

PLAYER
CREATE
Código:

mypath=path_add() //adiciona um path (caminho) para ele seguir depois

COLISAO COM PAREDE:
Código:
move_bounce_solid(1);//'rebate' na parede
DRAW
Código:

draw_sprite(sprite_index,-1,x,y)//desenha a sprite
draw_set_alpha(0.2)//transparencia
draw_set_color(c_aqua) //cor da agua
draw_path(mypath,x,y,1)//desenhar o caminho, voce vera no jogo

draw_set_alpha(1)//tirar a transparencia
draw_set_color(c_red);//cor vermelho
draw_circle(mouse_x,mouse_y,8,0)//desenhar um circulo vermelho no mouse
draw_set_color(0);
GLOBAL MOUSE LEFT PRESSED:
Código:

var dx,dy; //cria variaveis

dx=floor(mouse_x/16)*16+8;//faz o x do mouse ser multiplo de 16
dy=floor(mouse_y/16)*16+8;//faz o y do mouse ser multiplo de 16

if !mp_grid_path(global.mpgrid,mypath,x,y,dx,dy,true) //checa se nao existe um caminho
    {
    var x1,y1,x2,y2; //mais variaveis
    for (i=0; i<path_get_number(mypath); i+=1) //checa os pontos do caminho
        {
        x1=path_get_point_x(mypath,i); // x1 pega o valor do ponto 'i' do path
        y1=path_get_point_y(mypath,i); //y1 pega o valor do ponto 'i' do path
        x2=path_get_point_x(mypath,i+1);//x2 pega o valor do ponto seguinte
        y2=path_get_point_y(mypath,i+1);//y2 pega o valor do ponto seguinte
       
if collision_line(x1,y1,x2,y2,block,false,true)//ve se tem uma colisao com a parede entre os dois pontos
            {
            dx=x1; //faz com que o dx  seja o x1
            dy=y1; //faz a mesma coisa o dy
            break;
            }
        }
    mp_grid_path(global.mpgrid,mypath,x,y,dx,dy,true); //recria o path com os pontos certos e com a possibilidade de mover diagonalmente
    path_start(mypath,8,0,1);//mover o player pelo path
    }
else //se existir o caminho
    {
    mp_grid_path(global.mpgrid,mypath,x,y,dx,dy,true); //cria o path...
    path_start(mypath,8,0,1); //mover o player pelo path
    }

É isso ai, terminamos a aula, coloque os blocos (parede) na room em forma de labirinto, o controlador e o player. Ai teste o jogo e clique em algum lugar que nao tenha parede. Vera que ele desvia da parede e vai para onde voce clicou, se existir um caminho.

Até mais!


Última edição por Pedrø em Qua 25 Abr 2012, 23:40, editado 2 vez(es)

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Qualidade Re: Aula Avancada - Pathfinding

Mensagem por Markituh em Seg 31 Jan 2011, 19:59

.__. Legal, bem legal... Lembro que o itarodrigo postou um tutorial de como fazer isso, mas o desvio era imperfeito e ele se movia antes mesmo de checar no objeto... Por que será? Acho que o teu código está com configurações para arrumar isso.

Bom, não creio que ele seja feito para essa função mas... Coloquei várias paredes misturadas, deixando brechas é claro, então quando clico no que se pode dizer a "saída" daquela algazarra, ele calcula o caminho errado e trava no bloco. POR QUE SERÀ? >_<

Uma imagem para entender melhor. Pode ver que a linha azul está certa, mas o player redondamente errado >_< Tipo, se o obj_parede está abaixo do player, e a pessoa clicar abaixo do obj_parede, o player vai tentar passar por cima do bloco ao invés de dar a volta >_< A linha calcula certo, mas o problema é o player, na sprite dele =/ Mas bom tutorial Pedro, vai ajudar muita gente... Será? Meu argumento é falho =|

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Aula Avancada - Pathfinding

Mensagem por PedroX em Seg 31 Jan 2011, 21:44

Voce criou os sprites com tamanhos certos?
Porque se voce colocou um tamanho diferente para o player, tem que por a speed no mesmo tanto, nao sei porque, mas da certo. Tem que colocar a parede como solida tambem.
Manda a engine para mim ver se nao conseguir.

FLW

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Qualidade Re: Aula Avancada - Pathfinding

Mensagem por Markituh em Seg 31 Jan 2011, 21:47

Ambas as sprites são de 32x32, o problema é que ele não faz a volta, ele vai pra cima do bloco. A linha mostra a volta, mas como tem direção vertical para baixo no começo da linha, aí ele trava no bloco. Deve ser algum código que adiciona valores iniciais na vspeed não importa a circunstância...

___________

"Não deixe para amanhã o que se pode fazer hoje"

Links úteis:
Índice de Tutoriais
Manual online do GMS

Markituh

Ranking : Sem avaliações
Número de Mensagens : 2183
Data de inscrição : 11/10/2009
Reputação : 106
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Aula Avancada - Pathfinding

Mensagem por Kiko em Seg 31 Jan 2011, 21:52

ele disse:

1 - Crie uma sprite que sera a parede, com tamanho 16x16 px.
2 - Crie outra sprite que sera o player, com tamanho 8x8 px.

não:

1 - Crie uma sprite que sera a parede, com tamanho 32x32 px.
2 - Crie outra sprite que sera o player, com tamanho 32x32 px.

Kiko

Número de Mensagens : 188
Idade : 18
Data de inscrição : 16/01/2011
Reputação : 2
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Qualidade Re: Aula Avancada - Pathfinding

Mensagem por PedroX em Ter 01 Fev 2011, 10:03

Substitua os valores 16 por 32, assim:

global.mpgrid=mp_grid_create(0,0,room_width/32,room_height/32,32,32)//cria um plano de movimento, criando quadrados de 32 pixels em toda a room

E no mouse tambem:

dx=floor(mouse_x/32)*32+8;//faz o x do mouse ser multiplo de 32
dy=floor(mouse_y/32)*32+8;//faz o y do mouse ser multiplo de 32

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Qualidade Re: Aula Avancada - Pathfinding

Mensagem por williamsp em Qua 09 Mar 2011, 15:13

Olá boa tarde!
otima iniciativa e uma otima dica para mim e muita gente que procurava um tutorial desse nivel. Esta de parabens.
Ficaria mais completo seu tutorial se vc postasse o projeto da aula do dia.

vlws Razz

williamsp

Número de Mensagens : 5
Idade : 30
Data de inscrição : 26/01/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

http://www.receitasegostosuras.com

Voltar ao Topo Ir em baixo

Qualidade Re: Aula Avancada - Pathfinding

Mensagem por PedroX em Qua 09 Mar 2011, 16:14

Obrigado.
Como comecaram as aulas, houve alguns atrasos.
Mas eu nao esqueci das aulas.
Quando possivel, vou continuar as proximas...

FLW

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Qualidade Re: Aula Avancada - Pathfinding

Mensagem por Conteúdo patrocinado Hoje à(s) 10:20


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum