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
» Retorno da GMBR!!!
por theguitarmester Ter 19 Mar 2024, 22:38

» Procuro Programador de game maker
por Wou Sex 15 Mar 2024, 10:27

» Mod APK
por gamerainha Qua 13 Mar 2024, 06:30

» Mudar cor de apenas uma palavra
por lunalol Sex 01 Mar 2024, 13:42

» Aceito pedidos de sprites (Com exemplos meus)
por Sevilha Qua 28 Fev 2024, 12:17

» Inventário simples
por Isquilo_Roedor Qui 22 Fev 2024, 15:18

» Problemas na programaçnao de inimigo [jogo DOOM LIKE]
por Black Mirror Dom 11 Fev 2024, 13:34

» ANDROID MULTI TOUCH
por DiegoBr Dom 04 Fev 2024, 12:13

» Servidor de Discord do fórum?
por Lighter Sáb 27 Jan 2024, 17:18

» Save e Load Json
por Klinton Rodrigues Qui 25 Jan 2024, 11:12

» Colisão com mais de um objeto
por aminaro Seg 22 Jan 2024, 15:02

» Oi sou novo aqui
por Thiago Silveira Alexandre Sáb 20 Jan 2024, 20:55

» Como acessar conteudo comprado no marketplace
por macmilam Sex 19 Jan 2024, 07:42

» Devlogs em vídeos do Block Room
por Joton Seg 15 Jan 2024, 16:56

» Alguém aqui já ganha dinheiro com seus games?
por Joton Seg 15 Jan 2024, 16:49

» ACERVO GMBR MAGAZINE
por Joton Qui 11 Jan 2024, 19:21

» como aumentar o obj sem aumentar a colisão??
por GabrielXavier Qua 10 Jan 2024, 07:21

» Asteroid Core - Early Acesse Update [0.2.0.0]
por JOZ. Seg 08 Jan 2024, 14:39

» Versionamento de código com GitHub
por GabrielXavier Seg 08 Jan 2024, 07:32

» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por kolesovsup Sex 29 Dez 2023, 07:16

» a funçao approach ainda existe?
por PEDRINDEV Ter 26 Dez 2023, 20:05

» Inimigo ataca até por trás! >:(
por saim Sex 22 Dez 2023, 08:55

» [RESOLVIDO]Spawn após morte
por Deception_1999 Dom 17 Dez 2023, 16:39

» Remunerado $$$ - Procuro programador para ajudar a "montar" um jogo
por theguitarmester Sáb 02 Dez 2023, 16:28

» Game maker nao abre
por Cerf Dom 26 Nov 2023, 12:01


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


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