Obrigado por visitar a The Game Makers Brasil Use o fórum de Dúvidas para fazer perguntas. Se está em busca de aprender dê uma olhada nos tutoriais. |
Dúvida sobre IA inimigo em plataforma
Dúvida sobre IA inimigo em plataforma
Boa noite pessoal.
Estou programando a IA de um inimigo em especial num jogo de plataforma que estou fazendo, e estou com a seguinte situação:
1 - Quando eu estiver longe do inimigo, quero que ele ande aleatoriamente, uns passos pra frente, uns passos pra trás.
2 - Quando eu chego perto dele, a uma distancia x, quero que ele atire uma lança na direção de meu personagem.
3 - Quando eu estiver a uma distancia y, mais perto, quase que colado nele, quero que dê um ataque melee.
Qual a melhor maneira de se programar isso?
Estou tentando usando if e vários else if, mas está dando altos bugs aqui.
ps.: Sou iniciante
Estou programando a IA de um inimigo em especial num jogo de plataforma que estou fazendo, e estou com a seguinte situação:
1 - Quando eu estiver longe do inimigo, quero que ele ande aleatoriamente, uns passos pra frente, uns passos pra trás.
2 - Quando eu chego perto dele, a uma distancia x, quero que ele atire uma lança na direção de meu personagem.
3 - Quando eu estiver a uma distancia y, mais perto, quase que colado nele, quero que dê um ataque melee.
Qual a melhor maneira de se programar isso?
Estou tentando usando if e vários else if, mas está dando altos bugs aqui.
ps.: Sou iniciante
Re: Dúvida sobre IA inimigo em plataforma
Nesse caso seria ideal a utilização de uma máquina de estados finitos :D
No seu caso, teríamos que programar no mínimo três estados: um para quando o inimigo estiver longe do player, outro para uma distância média e outro para mais perto do player.
Com uma máquina de estados finitos, garantimos que apenas um estado seja executado por vez.
É importante notar que nós temos que programar as mudanças de estados dentro dos próprios estados.
Exemplo:
O ideal é que para sistemas mais complexos você faça um fluxograma pra organizar as possíveis mudanças de estado.
Exemplo:
Para o Game Maker Studio, tem também um pack de scripts muito úteis que adicionam algumas facilidade para trabalhar com Finite State Machines: LINK
Bom, perdão se eu não consegui explicar de forma detalhada, espero que não tenha ficado confuso e que você tenha entedido.
Até mais o/
No seu caso, teríamos que programar no mínimo três estados: um para quando o inimigo estiver longe do player, outro para uma distância média e outro para mais perto do player.
Com uma máquina de estados finitos, garantimos que apenas um estado seja executado por vez.
É importante notar que nós temos que programar as mudanças de estados dentro dos próprios estados.
Exemplo:
Código: Selecionar todos
///Create
estado = "longe";
///Step
if (estado == "longe")
{
*Andar aleatoriamente*
//Tratamos as mudanças de estado
if (point_distance(x,y,obj_player.x,obj_player.y) <= 500)
{
estado = "medio";
}
}
else if (estado == "medio")
{
*Atira lança*
//Tratamos as mudanças de estado
if (point_distance(x,y,obj_player.x,obj_player.y) > 500)
{
estado = "longe";
}
if (point_distance(x,y,obj_player.x,obj_player.y) <= 200)
{
estado = "perto";
}
}
else if (estado == "perto")
{
*Ataque melee*
//Tratamos a mudança destados
if (point_distance(x,y,obj_player.x,obj_player.y) > 200)
{
estado = "medio";
}
}
Exemplo:
Para o Game Maker Studio, tem também um pack de scripts muito úteis que adicionam algumas facilidade para trabalhar com Finite State Machines: LINK
Bom, perdão se eu não consegui explicar de forma detalhada, espero que não tenha ficado confuso e que você tenha entedido.
Até mais o/
Re: Dúvida sobre IA inimigo em plataforma
Nossa, já vi uns 'trocentos' tutoriais de GML, e até hoje não tinha visto nada relacionado a esses negócios de estados finitos.
Mas de certa forma, a lógica que eu estava seguindo era a mesma, pois até agora eu fiz da seguinte forma:
-
Vou tentar mudar aqui e fazer desta forma que você disse.
MUITO obrigado pela resposta amigo!
Mas de certa forma, a lógica que eu estava seguindo era a mesma, pois até agora eu fiz da seguinte forma:
Código: Selecionar todos
///Create
//Variaveis iniciais:
distancia_longe = 10000
distancia_perto = 500
atk_distancia = false
atk_perto = false
Código: Selecionar todos
///Step
if distance_to_object(obj_player) < distancia_longe
{atk_distancia = true}
else if distance_to_object(obj_player) < distancia_perto
{atk_distancia = false
atk_perto = true}
else
{atk_distancia = false
atk_perto = false}
MUITO obrigado pela resposta amigo!
Quem está online
Usuários navegando neste fórum: Ahrefs [Bot] e 1 visitante