[Resolvido] path_direction - como fazer?

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

Resolvido [Resolvido] path_direction - como fazer?

Mensagem por saim em Ter 20 Mar 2012, 10:54

Eu tive uma idéia mágica pra resolver o problema da classificação num jogo de corridas. Seria ótimo, se funcionasse, mas eu não consigo fazer funcionar.

Ela funcionaria da seguinte forma:
1 - primeiro, eu faço um path pra ser o eixo da pista. Comece com o path seguindo da esquerda pra direita, em linha reta, pra entender a idéia, que nesse caso específico, ela funciona. Coloque um objeto (vou chamá-lo de objSeguePath) e, no create desse objeto, mande ele seguir o path com velocidade zero.
create:
Código:
path_start(path_reto, 0, 0, 0);
2 - crie um segundo objeto pra ser o carro (vou chamá-lo de objCarro) e defina, no create, algumas variáveis pra ser a direção e a velocidade. Vou chamá-las de "lado" e "velo". Pra facilitar minha vida, essas variáveis estão globais, mas depois, quando estiver tudo funcionando elas serão locais. Ainda nesse objeto, crie um step event pra ele andar em função dessas variáveis.
create:
Código:
globalvar lado, velo;
lado = 0; velo = 0;
antiHorario = vk_left; horario = vk_right; acelera = vk_up
step:
Código:
lado += 10 * (keyboard_check(antiHorario) - keyboard_check(horario));
velo = 3 * keyboard_check(acelera);
Agora o pulo do gato:
3 - de volta ao primeiro objeto (objSeguePath), defina o valor de path_speed em função da projeção da movimentação do carro no path que define o traçado da pista. Teoricamente, isso vai te colocar numa posição proporcional ao caminho percorrido pelo carro e, quando tivermos mais carros na mesma pista, fazendo a mesma coisa, isso vai te permitir usar a variável path_position pra comparar sua posição com a dos outros.
step:
Código:
path_speed = lengthdir_x(velo, lado);
lembrando que o path está na horizontal, o lengthdir_x vai me dar a projeção da movimentação do objCarro

E, olha que lindo, funciona! Agora, falta fazer funcionar em qualquer direção. Ora, isso é fácil, basta reduzir a direção do path a zero e reaplicar a mesma teoria!
correção do step:
Código:
path_speed = lengthdir_x(velo, lado - path_direction(path_position));
Ao reduzir a path direction do ponto em que o objeto está, o código fica equivalente ao anterior, com o path na horizontal

Agora começam os problemas. Pra começar, não existe a função path_direction. Até tentei usar a direção do movimento:
Código:
path_direction = point_direction(path_get_x(path_positionprevious), path_get_y(path_positionprevious), path_get_x(path_position), path_get_y(path_position));
Mas isso gerou uma série de problemas:
- Quando o movimento é no sentido inverso ao do fluxo normal, o objeto fica tremendo, porque a direção do path fica oscilando entre "igual à movimentação do objeto" e "inversa à movimentação do objeto", já que quando está "igual à movimentação do objeto", o path_speed resultante é positivo e, por conseqüência, o objSeguePath anda PRA FRENTE.
- No normal step event, path_position é igual à path_position_previous, o que me obriga a usar o end step event, o que não seria ruim se não fosse o delay de um step entre os dois objetos.
- Mesmo usando o end step, quando o carro pára (velo == 0), a direção da posição anterior para a nova é sempre zero, não importa qual seja a realidade.
- Curvas têm uma precisão medíocre, quando se usa esse tipo de código.

Então tenho essas perguntinhas simples:
- Como criar uma função (script) "path_direction", que sempre aponte pra direção positiva do path, em função da path_position, seja qual for a path_position?
- Como fazer isso funcionar em qualquer step event (begin, normal ou end)?
- Enfim, como fazer um sistema decente de posicionamento na corrida?


Última edição por saim em Ter 20 Mar 2012, 15:38, editado 1 vez(es)

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

Resolvido Re: [Resolvido] path_direction - como fazer?

Mensagem por jharik em Ter 20 Mar 2012, 11:03

para que serve isso

jharik

Número de Mensagens : 25
Data de inscrição : 19/03/2012
Reputação : 1
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] path_direction - como fazer?

Mensagem por Mart10carado em Ter 20 Mar 2012, 11:10

jharik escreveu:para que serve isso

Esse assunto e para programadores intermediário para avançado.Ate eu que sou intermediário tenho que ler 3 vezes ou mais para emtender

Mart10carado

Número de Mensagens : 134
Data de inscrição : 27/05/2011
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] path_direction - como fazer?

Mensagem por saim em Ter 20 Mar 2012, 11:42

jharik escreveu:para que serve isso
saim escreveu:isso vai te permitir usar a variável path_position pra comparar sua posição com a dos outros.
É pra definir, num jogo de corrida, quem está ganhando a corrida.

Mart10carado escreveu:
jharik escreveu:para que serve isso

Esse assunto e para programadores intermediário para avançado.Ate eu que sou intermediário tenho que ler 3 vezes ou mais para emtender
Na verdade, nem é tão avançado assim. Só que pra entender a pergunta, o sujeito tem que saber o que eu estou pensando, não é um raciocínio MUITO comum. Por isso o post ficou tão longo. Resumidamente, eu preciso saber a direção do path em função da posição no path. O resto é "o-que-eu-já-fiz-e-deu-errado".

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

Resolvido Re: [Resolvido] path_direction - como fazer?

Mensagem por Kabeção em Ter 20 Mar 2012, 12:37

- Como criar uma função (script) "path_direction", que sempre aponte pra direção positiva do path, em função da path_position, seja qual for a path_position?
- Como fazer isso funcionar em qualquer step event (begin, normal ou end)?
As posições da path são definidas depois do End Step (ou seria antes do Begin Step?), então você deve calcular a direção no Draw.

Enfim, como fazer um sistema decente de posicionamento na corrida?
Eu já tentei algo usando collision_line para cada pixel da path, ai num obj_path eu percorria todas as posições dela com collision_lines...
Não parece um método muito apropriado mas isso facilita bastante pois o movimento do carro pode ser livre sem calcular nada relativo a path.

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] path_direction - como fazer?

Mensagem por saim em Ter 20 Mar 2012, 14:04

Kabeção escreveu:As posições da path são definidas depois do End Step (ou seria antes do Begin Step?), então você deve calcular a direção no Draw.
Manual traduzido escreveu:Em algumas situações é importante para compreender a ordem os processos de eventos
do Game Maker. É a seguinte:
• Begin step events
• Alarm events
• Keyboard, Key press, e Key release events
• Mouse events
• Normal step events
(agora todos as instâncias são definidas para suas novas posições)
• Collision events
• End step events
• Draw events
Na verdade, entre o normal step e o end step, por isso usei o end step. Mas eu estava pensando em algo mais imediato, alguma equação pra usar no create que me desse o ângulo de qualquer path_position, nem que usasse uma interpolação.

Kabeção escreveu:Eu já tentei algo usando collision_line para cada pixel da path, ai num obj_path eu percorria todas as posições dela com collision_lines...
Não parece um método muito apropriado mas isso facilita bastante pois o movimento do carro pode ser livre sem calcular nada relativo a path.
Já pensei nisso, mas pra fazer as linhas perpendiculares à pista, você vai precisar da inclinação da pista (que pode, inclusive, ter circuitos circulares), o que nos leva de volta ao primeiro problema.

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

Resolvido Re: [Resolvido] path_direction - como fazer?

Mensagem por Kabeção em Ter 20 Mar 2012, 14:45

Na verdade, entre o normal step e o end step, por isso usei o end step. Mas eu estava pensando em algo mais imediato, alguma equação pra usar no create que me desse o ângulo de qualquer path_position, nem que usasse uma interpolação.
Se é assim então o path_positionprevius é que esta atualizando em outra hora porque realmente eles não sempre igual não importa o tipo do step.

Bom, se você quer saber a posição anterior ou a proxima, o equivalente a path_position seria:
Código:
(1/(path_get_length(path0)/(path_speed*steps)) mod 1)
Sendo "steps" o numero de passos do objeto (+1 a cada Event Step normal) então para saber a proxima ou a anterior é só adicionar +1 ou -1 no steps.
Não da pra prever o futuro então se a velocidade varia não acho que da pra prever com precisão a proxima position mas a anterior não tem problema.
Ai usando path_get_x/y descobria a direção.

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Resolvido Re: [Resolvido] path_direction - como fazer?

Mensagem por saim em Ter 20 Mar 2012, 15:37

É, acho que isso já dá pra brincar um pouco... E essa idéia de dividir a pista em vários trechos pra checar as collision_lines pode mudar radicalmente a minha forma de programar.
Vou ver o que sai. Se eu conseguir alguma coisa a tempo, o resultado vai aparecer no concurso.

Obrigado!

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

Resolvido Re: [Resolvido] path_direction - como fazer?

Mensagem por Conteúdo patrocinado Hoje à(s) 18:05


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