Entrar
Últimos assuntos
» player não consegue andarpor lovn7 Ontem à(s) 13:33
» É possível fazer istó no game maker
por William Lima Ontem à(s) 10:56
» Rio Rise - novo launcher do Gta San Andreas SAMP Brasil
por Lua Sáb 16 Nov 2024, 20:22
» 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
» 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
[Tutorial] IA Básica de TDS (Pt. 2)
3 participantes
GMBR :: Ensine & Aprenda :: Tutoriais :: Game Maker
Página 1 de 1
[Tutorial] IA Básica de TDS (Pt. 2)
Tutorial TDS IA Parte 2 (Chamando Reforço)
Olá. Eu sou o Gonçalves e vim aqui ensinar o pouco que eu sei sobre Inteligência Artificial de jogos Top-down shooter. Baixe o conteúdo do fim da 1ª Parte aqui:
http://www.mediafire.com/?9oa9ivcjusjkiro
Tentarei deixar o mais claro possível para os leitores e estarei aceitando feedback.
Sumário
1. Atores patrulhando
2. Usando os grupos e criando aliados
3. Criando os "teammates"
Introdução
Vimos na 1ª Parte como fazer uma IA básica, agora iremos complementá-la com alguns adicionais que deixarão o jogo mais difícil e realista.
1. Atores patrulhando
Vamos agora passar o que ensinei em [Tutorial] Patrulha Top-Down para a nossa IA. Para não ter de ficar explicando tudo novamente, peço que deem uma olhada no tutorial de patrulha para saber como tudo funciona, darei breves explicações apenas por aqui. Primeiramente, adicione ao Create do atr_inimigo o seguinte código, que define as configurações da patrulha:
Explicações no próprio código. Agora criemos o script adicionar_ponto_patrulha, com o seguinte código:
E agora, adicionemos no Create do atr_inimigo o pontos de patrulha que queremos adicionar, citarei um exemplo:
Fará com que ele fique andando em uma espécie de quadrado. Agora substituíremos todo o Step por esse:
Substituímos aquele código simples por um com o sistema de patrulha, e houve uma ligeira modificação nos efeitos das primeiras condições, peço que deem uma olhada. Se quiser também, desenhe os pontos da patrulha do ator no cenário para ilustrá-la (Draw):
Resultado:
Os atores irão patrulhar e, ao avistá-lo, atacarão, se parar de vê-lo (ou matar o alvo), seguirão na patrulha.
2. Usando os grupos
Vamos agora montar um sistema de grupo (com os objetos grupo contidos na engine) para fazer com que grupos de atores se enfrentem (no caso Aliados e Inimigos). Primeiro vamos definir no Create do atr_inimigo qual o seu grupo inimigo:
No Step, modificaremos a parte:
Por:
O que modificamos? Primeiro definir como prox o inimigo mais próximo. Depois checamos se o tal está perto e o definiremos como alvo normalmente, só substituindo os atr_jogador pelo prox. Logo qualquer ator considerado um aliado (com parent grupo_aliado) será alvejado pelo mesmo se possível. Também trocamos o obj_caixote por grupo_objetos, fazendo com que qualquer objetos no grupo impeça a visão da IA.
Agora duplicaremos o objeto atr_inimigo, dando uma sprite diferente (se quiser ponha a mesma do jogador, ou mude ao menos a letra pra 'A', você que sabe). Nele, vamos colocar como parent o grupo_aliado e colocar como inimigo (no Create) o grupo_inimigo. Espalhe-os pelo mapa.
Resultado:
Os atores (aliados e inimigos) patrulham e se atacam.
3. Criando os "teammates"
Agora que já temos aliados por si só, vamos criar aliados (ou até mesmo inimigos) que seguem seus líderes, vamos lá. Dupliquemos o atr_aliado e coloquemos o nome atr_aliado2, no seu Create adicionaremos o seguinte:
Não se esqueça de desativar a variável patrulhar, pois ele não pode seguir e patrulhar ao mesmo tempo. Se as duas tiverem valor true, ele ficará como uma louco andando pra um lado e pra outro.
Agora que definimos suas config., vamos adicionar isso ao Step:
E vamos modificar a primeira parte do Step novamente, subs. isso:
Por isso:
Vai definir também ali quando ou não parar de seguir seu líder. Agora substitua todo o código de colisão com grupo_pessoas do obj_projetil por esse:
E ponha no Create do atr_jogador:
Assim seus aliados não o atacaram no caso de friendly fire.
Resultado:
O(s) teammate(s) te seguem e atacam os inimigos quando necessário.
Tudo pronto, espero que tenham entendido, qualquer problema só me avisar. O resultado final você pode baixar no link abaixo:
http://www.mediafire.com/?lcsee7bdw2z2777
Deixei como comentário as marcações na engine (percepção, linha até alvo etc.), ficando assim:
É isso aí, fico por aqui. Provavelmente terá uma Parte 3, só preciso de tópicos pra abordar.
VALEU!
Olá. Eu sou o Gonçalves e vim aqui ensinar o pouco que eu sei sobre Inteligência Artificial de jogos Top-down shooter. Baixe o conteúdo do fim da 1ª Parte aqui:
http://www.mediafire.com/?9oa9ivcjusjkiro
Tentarei deixar o mais claro possível para os leitores e estarei aceitando feedback.
Sumário
1. Atores patrulhando
2. Usando os grupos e criando aliados
3. Criando os "teammates"
Introdução
Vimos na 1ª Parte como fazer uma IA básica, agora iremos complementá-la com alguns adicionais que deixarão o jogo mais difícil e realista.
1. Atores patrulhando
Vamos agora passar o que ensinei em [Tutorial] Patrulha Top-Down para a nossa IA. Para não ter de ficar explicando tudo novamente, peço que deem uma olhada no tutorial de patrulha para saber como tudo funciona, darei breves explicações apenas por aqui. Primeiramente, adicione ao Create do atr_inimigo o seguinte código, que define as configurações da patrulha:
- Código:
patrulhar=true // Define se esse objeto vai patrulhar ou não.
fim_patrulha=false // Define se ele vai parar após passar por todos os pontos de patrulha ou vai voltar do início
ponto_atual=0 // Definirá por quantos pontos ele passará, deixe 0
patrulha_total=0 // Define o ponto inicial, deixe 0 caso não saiba o que está fazendo
patrulhando = patrulhar // Definir se irá começar já patrulhando
vel_patrulha = velocidade/4 // Velocidade no qual o ator vai patrulhar
Explicações no próprio código. Agora criemos o script adicionar_ponto_patrulha, com o seguinte código:
- Código:
patrulha_x[patrulha_total]=argument0
patrulha_y[patrulha_total]=argument1
patrulha_total+=1
E agora, adicionemos no Create do atr_inimigo o pontos de patrulha que queremos adicionar, citarei um exemplo:
- Código:
// Definir os pontos de patrulha (Ex. abaixo forma um quadrado)
adicionar_ponto_patrulha(x+100,y)
adicionar_ponto_patrulha(x+100,y+100)
adicionar_ponto_patrulha(x,y+100)
adicionar_ponto_patrulha(x,y)
Fará com que ele fique andando em uma espécie de quadrado. Agora substituíremos todo o Step por esse:
- Código:
checar_vida()
if distance_to_object(atr_jogador) < percepcao and ! collision_line(x,y,alvo.x,alvo.y,obj_caixote,0,0) {viu_alvo = true; alvo = atr_jogador; if patrulhar = true {patrulhando = false}}
if collision_line(x,y,alvo.x,alvo.y,obj_caixote,0,0) {viu_alvo = false; if patrulhar = true {patrulhando = true}}
if viu_alvo = true
{
if distance_to_object(atr_jogador) > percepcao*0.6 {mp_potential_step(alvo.x,alvo.y,1.2+(velocidade*0.1),1)}
olhar_para(alvo.x,alvo.y)
if tempo < 12 {tempo += 1}
if tempo >= 12 {atirar()}
}
if patrulhando = true
{
mp_potential_step(patrulha_x[ponto_atual],patrulha_y[ponto_atual],1.2+(vel_patrulha*0.1),0)
if distance_to_point(patrulha_x[ponto_atual],patrulha_y[ponto_atual]) <=0
{
ponto_atual+=1
}
if ponto_atual >= patrulha_total
{
if fim_patrulha = true
{
patrulhando=false
}
else
{
ponto_atual=0
}
}
}
Substituímos aquele código simples por um com o sistema de patrulha, e houve uma ligeira modificação nos efeitos das primeiras condições, peço que deem uma olhada. Se quiser também, desenhe os pontos da patrulha do ator no cenário para ilustrá-la (Draw):
- Código:
var w;
for (w=0; w<patrulha_total; w+=1)
{
draw_circle_color(patrulha_x[w],patrulha_y[w],5,c_lime,c_lime,1)
}
Resultado:
Os atores irão patrulhar e, ao avistá-lo, atacarão, se parar de vê-lo (ou matar o alvo), seguirão na patrulha.
2. Usando os grupos
Vamos agora montar um sistema de grupo (com os objetos grupo contidos na engine) para fazer com que grupos de atores se enfrentem (no caso Aliados e Inimigos). Primeiro vamos definir no Create do atr_inimigo qual o seu grupo inimigo:
- Código:
inimigo = grupo_aliado
No Step, modificaremos a parte:
- Código:
if distance_to_object(atr_jogador) < percepcao and ! collision_line(x,y,alvo.x,alvo.y,obj_caixote,0,0) {viu_alvo = true; alvo = atr_jogador; if patrulhar = true {patrulhando = false}}
if collision_line(x,y,alvo.x,alvo.y,obj_caixote,0,0) {viu_alvo = false; if patrulhar = true {patrulhando = true}}
if viu_alvo = true
{
if distance_to_object(atr_jogador) > percepcao*0.6 {mp_potential_step(alvo.x,alvo.y,1.2+(velocidade*0.1),1)}
olhar_para(alvo.x,alvo.y)
if tempo < 12 {tempo += 1}
if tempo >= 12 {atirar()}
}
Por:
- Código:
var prox;
prox = instance_nearest(x,y,inimigo)
if distance_to_object(prox) < percepcao and ! collision_line(x,y,prox.x,prox.y,grupo_objetos,0,0) {viu_alvo = true; alvo = prox; if patrulhar = true {patrulhando = false}}
if collision_line(x,y,alvo.x,alvo.y,obj_caixote,0,0) {viu_alvo = false; if patrulhar = true {patrulhando = true}}
if viu_alvo = true
{
if distance_to_object(prox) > percepcao*0.6 {mp_potential_step(alvo.x,alvo.y,1.2+(velocidade*0.1),1)}
olhar_para(alvo.x,alvo.y)
if tempo < 12 {tempo += 1}
if tempo >= 12 {atirar()}
}
O que modificamos? Primeiro definir como prox o inimigo mais próximo. Depois checamos se o tal está perto e o definiremos como alvo normalmente, só substituindo os atr_jogador pelo prox. Logo qualquer ator considerado um aliado (com parent grupo_aliado) será alvejado pelo mesmo se possível. Também trocamos o obj_caixote por grupo_objetos, fazendo com que qualquer objetos no grupo impeça a visão da IA.
Agora duplicaremos o objeto atr_inimigo, dando uma sprite diferente (se quiser ponha a mesma do jogador, ou mude ao menos a letra pra 'A', você que sabe). Nele, vamos colocar como parent o grupo_aliado e colocar como inimigo (no Create) o grupo_inimigo. Espalhe-os pelo mapa.
Resultado:
Os atores (aliados e inimigos) patrulham e se atacam.
3. Criando os "teammates"
Agora que já temos aliados por si só, vamos criar aliados (ou até mesmo inimigos) que seguem seus líderes, vamos lá. Dupliquemos o atr_aliado e coloquemos o nome atr_aliado2, no seu Create adicionaremos o seguinte:
- Código:
seguir_lider = true // Define se deve seguir alguém ou não
lider = atr_jogador // Definie seu líder
seguindo_lider = seguir_lider // Definir se irá começar já seguindo
seguir_dist = 60 // Definir distância pro líder
Não se esqueça de desativar a variável patrulhar, pois ele não pode seguir e patrulhar ao mesmo tempo. Se as duas tiverem valor true, ele ficará como uma louco andando pra um lado e pra outro.
Agora que definimos suas config., vamos adicionar isso ao Step:
- Código:
if seguindo_lider = true and seguir_lider = true and instance_exists(lider)
{
if distance_to_object(lider) > seguir_dist {mp_potential_step(lider.x,lider.y,1.2+(velocidade*0.1),0)}
}
E vamos modificar a primeira parte do Step novamente, subs. isso:
- Código:
if distance_to_object(prox) < percepcao and ! collision_line(x,y,prox.x,prox.y,grupo_objetos,0,0) {viu_alvo = true; alvo = prox; if patrulhar = true {patrulhando = false}}
if collision_line(x,y,alvo.x,alvo.y,grupo_objetos,0,0) {viu_alvo = false; if patrulhar = true {patrulhando = true}}
Por isso:
- Código:
if distance_to_object(prox) < percepcao and ! collision_line(x,y,prox.x,prox.y,grupo_objetos,0,0) {viu_alvo = true; alvo = prox; if patrulhar = true {patrulhando = false}; if seguir_lider = true {seguindo_lider = false}}
if collision_line(x,y,alvo.x,alvo.y,grupo_objetos,0,0) {viu_alvo = false; if patrulhar = true {patrulhando = true}; if seguir_lider = true {seguindo_lider = true}}
Vai definir também ali quando ou não parar de seguir seu líder. Agora substitua todo o código de colisão com grupo_pessoas do obj_projetil por esse:
- Código:
if atirador.inimigo != other.inimigo
{
other.alvo = atirador
other.viu_alvo = true
other.seguindo_lider = false
other.patrulhando = false
}
with(other)
{
energia -= (20+random(15)-resistencia) // Danificar o alvo
}
instance_destroy()
E ponha no Create do atr_jogador:
- Código:
inimigo = grupo_inimigo
Assim seus aliados não o atacaram no caso de friendly fire.
Resultado:
O(s) teammate(s) te seguem e atacam os inimigos quando necessário.
Tudo pronto, espero que tenham entendido, qualquer problema só me avisar. O resultado final você pode baixar no link abaixo:
http://www.mediafire.com/?lcsee7bdw2z2777
Deixei como comentário as marcações na engine (percepção, linha até alvo etc.), ficando assim:
É isso aí, fico por aqui. Provavelmente terá uma Parte 3, só preciso de tópicos pra abordar.
VALEU!
Última edição por Gonçalves em Dom 27 Jan 2013, 16:04, editado 1 vez(es)
Gonçalves- Games Ranking :
Notas recebidas : B + A + C
Data de inscrição : 29/10/2010
Reputação : 79
Número de Mensagens : 1013
Prêmios :
x 0 x 4 x 0
x 2 x 0 x 0
x 0 x 0 x 0
Re: [Tutorial] IA Básica de TDS (Pt. 2)
Po cara, muito bom, parabens, segui o tutorial ( antes que alguem venha falar algo eu n copiei e colei ) ta certinho, eu tava mesmo precisando disso, n comentei na parte 1 para comentar na parte 2, mas acho que quando player atirasse no inimigo e agente se escondesse ele continuasse a ver o player, entende?
Re: [Tutorial] IA Básica de TDS (Pt. 2)
@Arkd: Valeu cara! Pensei que ninguém tinha gostado, rs.
Então, na parte 1 eu explico o que fazer pra impedir de que ele continue "percebendo" o jogador, basta você não usar isso (caso não consiga, me peça ajuda).
Até mais!
Então, na parte 1 eu explico o que fazer pra impedir de que ele continue "percebendo" o jogador, basta você não usar isso (caso não consiga, me peça ajuda).
Até mais!
Gonçalves- Games Ranking :
Notas recebidas : B + A + C
Data de inscrição : 29/10/2010
Reputação : 79
Número de Mensagens : 1013
Prêmios :
x 0 x 4 x 0
x 2 x 0 x 0
x 0 x 0 x 0
Re: [Tutorial] IA Básica de TDS (Pt. 2)
Muito interessante seu tuto!! Vou utilizar em meus jogos! Prometo que ponho créditos a você!!
Marcellomine- Data de inscrição : 22/01/2013
Reputação : 11
Número de Mensagens : 134
Prêmios :
x 0 x 0 x 0
x 0 x 0 x 0
x 0 x 0 x 0
Tópicos semelhantes
» [Tutorial] IA Básica de TDS
» [Tutorial] IA Básica de TDS (Pt. 3)
» [Tutorial] 39dll Tutorial - Part I
» [Tutorial]I.A Básica – Movimentação de Inimigo com colisões
» Oi Galerinha, aqui um tutorial básico de um jogo de luta que eu fiz! [TUTORIAL]
» [Tutorial] IA Básica de TDS (Pt. 3)
» [Tutorial] 39dll Tutorial - Part I
» [Tutorial]I.A Básica – Movimentação de Inimigo com colisões
» Oi Galerinha, aqui um tutorial básico de um jogo de luta que eu fiz! [TUTORIAL]
GMBR :: Ensine & Aprenda :: Tutoriais :: Game Maker
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos