GMBR
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Entrar

Esqueci-me da senha

Últimos assuntos
» player não consegue andar
por lovn7 Qui 21 Nov 2024, 13:33

» É possível fazer istó no game maker
por William Lima Qui 21 Nov 2024, 10:56

» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por Lua Sáb 16 Nov 2024, 20:22

» (Resolvido) Cenario longo x Texture Pages
por josuedemoraes Sáb 16 Nov 2024, 15:31

» Kids' band
por Adilson Lucindo Santos Sex 15 Nov 2024, 12:23

» (RESOLVIDO) Engasgos-Troca de Sprites/animações
por josuedemoraes Ter 12 Nov 2024, 01:49

» Block Room - DEMO
por Joton Qua 06 Nov 2024, 22:58

» Game Infinito vertical (subindo)
por macmilam Sáb 26 Out 2024, 12:36

» Retorno da GMBR!!!
por Dancity Ter 22 Out 2024, 16:36

» Máquina de estados
por aminaro Qui 10 Out 2024, 13:33

» como faço pra um objeto colidir com o outro e diminuir a vida do player ?
por josuedemoraes Qui 03 Out 2024, 16:51

» RESOLVIDO: Colisão com objetos moveis
por josuedemoraes Qua 02 Out 2024, 20:28

» Crypt of the Blood Moon
por divin sphere Qua 11 Set 2024, 18:18

» como fazer um objeto seguir?
por divin sphere Dom 18 Ago 2024, 18:08

» Procuro de alguém para Modelar/Texturizar/Animar objetos 3D
por un00brn Dom 11 Ago 2024, 11:10

» Destruição de cenário (estilo DD Tank)
por CoronelZeg Sex 09 Ago 2024, 17:16

» RESOLVIDO-Como destruir uma instancia especifica de um objeto
por josuedemoraes Ter 23 Jul 2024, 00:40

» Automatizar a coleta de id
por GabrielXavier Seg 22 Jul 2024, 18:01

» Preciso de ajuda para concluir um pequeno projeto
por lmoura Qui 27 Jun 2024, 15:45

» ANGULO ACOMPANHAR O OBJETO
por Klinton Rodrigues Qui 27 Jun 2024, 08:34

» Musica reinicia quando sala reinicia
por GabrielXavier Ter 18 Jun 2024, 07:28

» como fazer uma copia de gd
por generico_cube Sex 14 Jun 2024, 15:48

» Square Adventure
por guilherme551 Ter 11 Jun 2024, 09:54

» como posso definir limite de uma variavel
por GabrielXavier Sex 07 Jun 2024, 14:14

» [Resolvido] Dúvida, colisão única de objeto
por vdm842 Sex 24 maio 2024, 09:50


Checando distancia para atirar no mais próximo

3 participantes

Ir para baixo

Checando distancia para atirar no mais próximo Empty Checando distancia para atirar no mais próximo

Mensagem por marcin_w_ Qua 10 Jul 2013, 22:28

Já tirei boas dúvidas aqui e agora venho com essa que está martelando minha cabeça.
Preciso que meu inimigo que atira e aponta para 8 direções diferentes calcule qual o obj_aliado mais próximo e passe a atirar nele. porém caso o obj_player estiver mais próximo tbm atirar no obj_player. (tanto para a bala do inimigo quanto para o inimigo eu uso point direction para que siga a direção do obj_player)
marcin_w_
marcin_w_

Data de inscrição : 25/11/2012
Reputação : 4
Número de Mensagens : 90
Prêmios : Checando distancia para atirar no mais próximo Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

Checando distancia para atirar no mais próximo Empty Re: Checando distancia para atirar no mais próximo

Mensagem por saim Qui 11 Jul 2013, 08:36

marcin_w_ escreveu:Preciso que meu inimigo (...) calcule qual o obj_aliado mais próximo e passe a atirar nele. porém caso o obj_player estiver mais próximo tbm atirar no obj_player.
Já ouviu falar em objetos parents? Parents são objetos, tipo, "chefes" dos objetos-child. Então se você manda uma ação acontecer num parent, ela acontece em todos os child. Sempre que você "fala" pra um objeto-parent, os objeto-child "escutam".
Então, se o tanto o player quanto os objetos aliados tiverem como parent o mesmo objeto (vou chamar de objeto_aliado_parent) e seu inimigo calcular qual o objeto_aliado_parent mais próximo, isso vai valer tanto pra um aliado comum quanto pro player. Não vai ter preferência.

E, pra saber qual o mais próximo, basta usar instance_nearest.

Agora, pra conseguir colocar o carinha na mira usando apenas as 8 direções, aí já é mais complicado. Mas como isso não faz parte da pergunta, vou presumir que já exista solução.
saim
saim

Games Ranking : Nota B

Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios : Checando distancia para atirar no mais próximo Empty

Medalhas x 1 Tutoriais x 6 Moedas x 0

Ouro x 1 Prata x 0 Bronze x 3

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

Checando distancia para atirar no mais próximo Empty Re: Checando distancia para atirar no mais próximo

Mensagem por fredcobain Qui 11 Jul 2013, 11:04

Penso que a função que vai resolver seu problema é a instance_nearest(x, y, obj);

Mais precisamente:

No código do obj_player:

Código:

vouatirar=instance_nearest(x, y, obj_aliado);
fredcobain
fredcobain

Games Ranking : Sem avaliações

Data de inscrição : 14/04/2011
Reputação : 163
Número de Mensagens : 692
Prêmios : Checando distancia para atirar no mais próximo Empty

Medalhas x 0 Tutoriais x 3 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

Checando distancia para atirar no mais próximo Empty Re: Checando distancia para atirar no mais próximo

Mensagem por marcin_w_ Qui 11 Jul 2013, 14:16

Vou tentar ser um pouco mais claro, meu jogo é basicamente um Player que se movimenta atirando em 8 direções, porém os tiros não são precisos...eu uso random (oque resolve o problema de mira das 8 direções).....o obj inimigo eh basicamente a msma coisa....porém ao invés de usar o random ...uso apenas point direction nas balas inimigas seguindo o player...e faço o obj inimigo me seguir com as direções dando assim uma solução para os tiros sairem na direção em que ele está apontando.


Minha intenção agora é fazer objetos tanto aliados quanto inimigos que batalham entre si ...

raciocinando a respeito pensei que as duas primeiras coisas que preciso saber para programar a IA dessas batalhas entre os figurantes são:

1- Fazer obj_aliado_do_inimigo identificar qual o obj_aliado mais próximo e atirar nele (vice versa)
porque nas batalhas os obj vão estar em movimento e as vezes vão parar.

2 - preciso que eles se movimentem pela batalha de forma natural..se escondam...em alguns casos recuam....em outros atiram....

no caso de usar instance_nearest...preciso de um esclarecimento melhor de como usar isso no meu caso.

desde já mais uma vez obrigado!!!
marcin_w_
marcin_w_

Data de inscrição : 25/11/2012
Reputação : 4
Número de Mensagens : 90
Prêmios : Checando distancia para atirar no mais próximo Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

Checando distancia para atirar no mais próximo Empty Re: Checando distancia para atirar no mais próximo

Mensagem por saim Qui 11 Jul 2013, 14:30

marcin_w_ escreveu:2 - preciso que eles se movimentem pela batalha de forma natural..se escondam...em alguns casos recuam....em outros atiram....
Isso requer uma IA BEM avançada. É infinitamente mais complicado que encontrar uma instância mais próxima. Quer mesmo tentar algo assim? Eu vou fazer um monte de perguntas, se quiser.

Me diz uma coisa... se o tiro segue o player, tipo, mudando de direção ao longo do tempo, qual o sentido de colocar uma margem de erro nele? Sempre ele vai atingir o alvo. O que eu recomendo é atirar na direção mais próxima e usar o erro na hora de criar o tiro. Uma vez criado, o tiro não muda de direção.

instance_nearest te retorna a id da instância mais próxima do objeto que chamou a função. Tendo a id, você tem a posição da instância. Tendo a posição, você sabe pra onde atirar.
Código:
alvo := instance_nearest(objeto_parent);
direção_do_tiro := point_direction(x, y, alvo . x, alvo . y);
with(instance_create(x, y, objeto_tiro)){
direction = -erro + random(2 * erro) + other . direção_do_tiro;
}
saim
saim

Games Ranking : Nota B

Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios : Checando distancia para atirar no mais próximo Empty

Medalhas x 1 Tutoriais x 6 Moedas x 0

Ouro x 1 Prata x 0 Bronze x 3

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

Checando distancia para atirar no mais próximo Empty Re: Checando distancia para atirar no mais próximo

Mensagem por fredcobain Qui 11 Jul 2013, 14:41

marcin_w_ escreveu:
no caso de usar instance_nearest...preciso de um esclarecimento melhor de como usar isso no meu caso.

Essa função (instance_nearest(x,y,obj)) vai retornar o ID do objeto (do tipo obj) mais próximo da posição x,y passadas como parâmetro.

Por exemplo, se vc quiser saber qual inimigo está mais próximo de um aliado:
Dentro do Objeto Aliado:
Código:
inimigomaisproximo=instance_nearest(x, y, obj_inimigo);

Entendeu ?
fredcobain
fredcobain

Games Ranking : Sem avaliações

Data de inscrição : 14/04/2011
Reputação : 163
Número de Mensagens : 692
Prêmios : Checando distancia para atirar no mais próximo Empty

Medalhas x 0 Tutoriais x 3 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

Checando distancia para atirar no mais próximo Empty Re: Checando distancia para atirar no mais próximo

Mensagem por marcin_w_ Qui 11 Jul 2013, 15:18

Saim, o tiro não muda de direção ao longo do percurso...

mudaria se fosse o msmo tiro...mas eu falei de dois

1-tiro player = usa direcção player apontando + random
2 tiro inimigo = usa point direction no create.

a respeito da IA, vc ja me ajudou em outras vezes de forma bem construtiva....se vc tiver paciencia para me ajudar na IA seria mt bom pra mim....vou enviar uma foto do jogo pra vc entender melhor o esquema.


Checando distancia para atirar no mais próximo Zhf6


Nessa imagem pode ser visto o Player no canto inferior esquerdo...2 aliados..(terceiro ta morto)....e 3 inimigos.....todos se movimentam em 8 direções...porém a unica IA q criei foi dependendo da distancia q tem um do outro eles param.....

É um jogo sobre a segunda guerra...de tempos em tempos trabalho nele...agora q as sprites estao em um padrão que gostei (ja redesenhei 5 vezes tudo) quero q o jogo fique mais dinamico....aberto a sugestões...abraço!
marcin_w_
marcin_w_

Data de inscrição : 25/11/2012
Reputação : 4
Número de Mensagens : 90
Prêmios : Checando distancia para atirar no mais próximo Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

Checando distancia para atirar no mais próximo Empty Avisado por TRFN!

Mensagem por marcin_w_ Qui 11 Jul 2013, 15:22

Fred, valeu tbm por esclarecer muito bem o "instance_nearest"...


eu utilizo bastante o depth=-y portanto os objetos tem colisões e depths mt "realistas" como passar atrás do tronco ou na frente dependendo da "altura" em que o player ou os objetos estão se movimentando...

Editado por TRFN
Evite postagens consecutivas para não infringir alguma regra. Avisado, sem alerta. Postagens Fundidas!
marcin_w_
marcin_w_

Data de inscrição : 25/11/2012
Reputação : 4
Número de Mensagens : 90
Prêmios : Checando distancia para atirar no mais próximo Empty

Medalhas x 0 Tutoriais x 0 Moedas x 0

Ouro x 0 Prata x 0 Bronze x 0

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

Checando distancia para atirar no mais próximo Empty Re: Checando distancia para atirar no mais próximo

Mensagem por saim Qui 11 Jul 2013, 16:15

Primeiro, tenho que dar a dica do "edit". Triple post, cara, cuidado com isso. Fica parecendo que você está ansioso, que não sabe esperar. A gente sabe que não é o caso, mas a regra existe e tem que ser seguida. Edite o post e acrescente o que quiser acrescentar.

Quanto ao tiro, ok, tem o inimigo e tem o aliado mais próximo dele. Então o inimigo vai atirar na direção do aliado. MAS o aliado está numa direção de 165° do inimigo, que só atira de 45 em 45 graus. Eu vejo 3 alternativas de solução:
1 - Ignore a regra dos 45° e atire no ângulo certo, com um erro aleatório, pro jogo ficar um pouco mais realista. Não importa se o ângulo da imagem do inimigo está num múltiplo de 45°, se você não mencionar isso, o jogador não vai se importar.
2 - Atire no ângulo múltiplo de 45° mais próximo do desejado. Colocar um erro pra deixar o jogo realista, aqui, me parece bobagem. O jogo não é realista. Pode ser pra melhorar o visual dos tiros andando na tela, mas aí, é testar e ver.
3 - Ande até um ponto próximo em que o ângulo entre as instâncias SEJA múltiplo de 45°, pra só então, atirar. Essa é a opção complicada que eu falei, lá no começo do tópico. Porque você vai precisar traçar uma linha num ângulo próximo do que você quer, do aliado até perto do inimigo, num ângulo múltiplo de 45° e outra linha, do inimigo até essa linha, perpendicular a ela. O inimigo vai ter que se deslocar de onde está até essa intersecção. Mas, quando isso acontecer, o aliado já vai ter mudado de lugar, então você precisa PREVER onde o aliado estará pra poder atirar. Muita complicação pra um tirinho que vai em linha reta.

Minha sugestão? 2.

saim escreveu:
marcin_w_ escreveu:2 - preciso que eles se movimentem pela batalha de forma natural..se escondam...em alguns casos recuam....em outros atiram....
Isso requer uma IA BEM avançada. É infinitamente mais complicado que encontrar uma instância mais próxima. Quer mesmo tentar algo assim? Eu vou fazer um monte de perguntas, se quiser.
marcin_w_ escreveu:a respeito da IA, vc ja me ajudou em outras vezes de forma bem construtiva....se vc tiver paciencia para me ajudar na IA seria mt bom pra mim....vou enviar uma foto do jogo pra vc entender melhor o esquema.
Eu quis dizer BEM AVANÇADA MESMO. Do tipo "não tenho certeza se eu consigo fazer algo do tipo".
Pra você ver que não estou te enrolando, deixa eu externar minhas preocupações abaixo. Tem alguns conceitos que você pode pegar nos tutoriais da minha assinatura, então não vou me preocupar em explicá-los.

Primeiro, você vai ter que entender a máquina de estados finitos. Não é complicado, mas é muito importante. Porque sem ela, eu nem saberia como começar a programar isso.
Depois, você vai os definir parâmetros que mudam a atitude dos inimigos. Em que situação eles atacam? Em que situação eles recuam? Muito sizo nessa hora. Se você usar "eles recuam quando o exercito deles é menor", pode fazer os inimigos recuarem diante de um soldado sozinho, que tem um exército mosntruoso tomando café, a milhas dali. Essa é a parte mais importante da IA: definir o que causa a mudança de comportamento.
E tem a questão deles se esconderem... COMO eles vão se esconder em campo aberto? Procurar cobertura? Certo, mas cobertura contra os tiros de quem? De TODO o exército aliado? E se o exército estiver bem espalhado? O que fazer se a cobertura estiver distante?Qual o alcance de um tiro? O que é considerado um lugar "seguro"?
Até consigo pensar em alguma coisa, usando um raciocínio parecido com o A*, mas pra definir pontos de segurança (células não atingidas pela linha de fogo inimiga). Depois, usa-se o A* propriamente dito pra chegar até esse ponto. Só que o A* é lento. De quanto em quanto tempo você quer rodar o código? E até quantas instâncias podem estar ativas ao mesmo tempo, no jogo? Em que plataforma o jogo será jogado?

Vale responder "não sei" pra qualquer uma dessas perguntas. Mas se você não tiver todas as respostas, não tem como programar o jogo.
Na verdade, não estou interessado nas respostas, imediatamente, mas em mostrar que o conceito é mais difícil de implementar do que parece, a princípio.
Mas não é impossível. Se se esforçar, você consegue. Mas eu não vou te ensinar como fazer, porque eu não sei fazer.
A gente pode inventar alguma coisa juntos.
saim
saim

Games Ranking : Nota B

Notas recebidas : C-D-A-B
Data de inscrição : 14/01/2011
Reputação : 136
Número de Mensagens : 3033
Prêmios : Checando distancia para atirar no mais próximo Empty

Medalhas x 1 Tutoriais x 6 Moedas x 0

Ouro x 1 Prata x 0 Bronze x 3

Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Ir para o topo Ir para baixo

Checando distancia para atirar no mais próximo Empty Re: Checando distancia para atirar no mais próximo

Mensagem por Conteúdo patrocinado


Conteúdo patrocinado


Ir para o topo Ir para baixo

Ir para o topo

- Tópicos semelhantes

 
Permissões neste sub-fórum
Não podes responder a tópicos