problema com path_position

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

problema com path_position

Mensagem por saim em Ter 24 Jan 2012, 13:52

Eu tenho uma coleção de paths que teminam num path quadrado. Queria que os objetos fossem distribuidos aleatoriamente nessa coleção, percorressem o path e, ao chegar no path quadrado, começassem a rodar nele.
Como esse path quadrado tem uma geometria bem definida, eu sei qual path_position corresponde a cada ponto de chegada.

pergunta 1: seria possível saber o path position de um ponto (x, y) SEM conhecer a geometria do path?

Sendo possível ou não, isso fica como curiosidade. Eu já alterei o jogo de forma a conhecer a geometria do path. Então, pra cada path de chegada, eu sei qual a path_position que ele deve começar a percorrer o path quadrado.
Evento end of path:
Código:
for(i = 0; i < número de paths de chegada; i += 1){
   if path_index = pathDeChegada[i]{
      path_start(path_quadrado, velocidade, 1, 1); //começa a rodar
      path_position = posição[i]; //pula pra posição correta
      }
   }
Todas as variáveis estão definidas no create.
Note que o path_position é definido no mesmo step em que se inicia o path, ANTES do evento draw. Entretanto, ainda vejo o objeto "piscando" no começo do path, imediatamente antes dele aparecer na posição correta (provavelmente, só no primeiro step dele percorrendo o path).

pergunta 2: Como faço pra o objeto entrar num path sem ser no ponto inicial do path?
(ou: como sumir com essa piscadela?)

Como o código realmente está:
Código:
object_event_add(objCarro, ev_other, ev_end_of_path, '
switch(pathAtual){
   case criacao: {
      path_start(Path[passagem], pspeed, 0, 1);
      path_position = pp[floor(vemDe / 2) + 1];
      pathAtual = passagem;
      break;
      }
   case passagem: {
      if (clicado == true){
         path_start(Path[limpeza1], pspeed, 0, 1);
         pathAtual = limpeza1;
         cor = $ffffff;
         clicado = false;
         }
         else {
            path_start(Path[passagem], pspeed, 0, 1);
            objControle . money = max(objControle . money - 5, 0);
            }
      break;
      }
   case limpeza1:
   case limpeza2:
   case limpeza3: {
      alarm[0] = 30;
      clicado = false;
      break;
      }
   case saida: {
      instance_destroy();
      objControle . money += 20;
      }
   }
')
pathAtual é uma variável que eu uso pra saber o tipo de path está sendo percorrido.
O path que eu chamei de "quadrado", na pergunta, é o Path[passagem]

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: problema com path_position

Mensagem por Mr.Brum em Ter 24 Jan 2012, 15:39

Já tive esta mesma dúvida, fiz até uma engine pra tentar resolver esse problema da piscada,mas não consegui (ainda).
1ª resposta:
sim, as funções seguintes podem ser usadas:
px=path_get_point_x(PATH,path_position)
py=path_get_point_y(PATH,path_position)

2ª resposta: a única forma que eu sei é definindo o path position, mas vc já testou ela, e eu tenho o mesmo problema que vc: "A piscada".

Edit: Se não encontrar a solução para esse problema, vc pode criar seus próprios paths em tempo de execução, veja esse tuto do Pedro:
http://gmbr.forumeiros.com/t13821-aula-avancada-pathfinding

Mr.Brum

Ranking : Nota C
Número de Mensagens : 913
Idade : 25
Data de inscrição : 28/04/2011
Notas recebidas : D + D + C + C + D + B
Reputação : 41
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 0

http://mrbrumgames.blogspot.com/

Voltar ao Topo Ir em baixo

Re: problema com path_position

Mensagem por saim em Ter 24 Jan 2012, 16:11

Não, não... eu quero é ter a posição (x, y) e encontrar a path_position do path. As funções path_get_point_x/y fazem o contrário (me retornam a posição (x, y) se eu der a path_position). Não existe função que faça isso, mas talvez alguém tenha algum método ou dll, sei lá. Sempre me surpreendo quando peço algo que acho impossível.

Quanto ao pathfind, não me serve, porque eu não tenho inimigo, obstáculo, nada além de várias intâncias do mesmo objeto e alguns paths. Eu realmente preciso seguir aqueles paths pré-programados.
Até posso descer ao trabalho braçal de criar um path ligando cada posição final dos afluentes, imitando o limite do path quadrado, até o início do path quadrado. Aí, começar do começo do path vai ser a coisa certa. Mas é uma solução meio tosca, se for possível, quero evitar o trabalho desnecessário.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: problema com path_position

Mensagem por PedroX em Ter 24 Jan 2012, 16:51

px=400
py=300
for(i=0 i<=1 i+=0.01)
{
pgx=path_get_point_x(path, i);
pgy=path_get_point_y(path, i);

if abs(pgx-px) <= dmp/100 && abs(pgy-py) <= dmp/100
{
//normal
return i;
//porcentagem: return i*100;
}
}

Onde dmp representa desvio maximo em porcentagem.

Ou seja, com uma margem de erro de 1% ou 2% é uma boa.

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

Re: problema com path_position

Mensagem por saim em Ter 24 Jan 2012, 17:13

Aproximação? Até pensei nisso, mas eu queria usar a teoria do raio laser, que soma ou divide a metade da distância restante até chegar na precisão requerida. Isso era impossível de fazer com paths, porque não dá pra saber se você está se aproximando ou afastando do objetivo.

Percorrer o path do início ao fim pode ser mais lento, mas é garantido. Nisso eu não tinha pensado. Vou testar um pouco, ver se um processador fraco aguenta, e volto a escrever. Realmente uma margem de 2% de erro deve me atender.

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: problema com path_position

Mensagem por PedroX em Ter 24 Jan 2012, 18:04

Só corrigindo, não é porcentagem.
É centésimos mesmo.
Ele checa assim:

Se a posição real é 0.5 (metade do path) e o desvio máximo é de 0.01 (1%).
Se der 0.49 ele aceita, pois é 0.01 de diferença.
No entanto, basta diminuir o valor que é somado ao i, diminuir o desvio máximo e a diferença poderá chegar a 0.00001 ou menos. Realmente, não há importância isso. Se der 0.01 de diferença é o suficiente.

Código:
px=400
py=300
fator=0.1
for(i=0 i<=1 i+=fator)
{
pgx=path_get_point_x(path, i);
pgy=path_get_point_y(path, i);

if abs(pgx-px) <= 0.001 && abs(pgy-py) <= 0.001
return i;
}


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

Re: problema com path_position

Mensagem por Conteúdo patrocinado Hoje à(s) 17:19


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