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


[Tutorial] IA Básica de TDS (Pt. 2)

3 participantes

Ir para baixo

[Tutorial] IA Básica de TDS (Pt. 2) Empty [Tutorial] IA Básica de TDS (Pt. 2)

Mensagem por Gonçalves Qua 26 Set 2012, 20:26

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:

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:

[Tutorial] IA Básica de TDS (Pt. 2) Tut1

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:

[Tutorial] IA Básica de TDS (Pt. 2) Tut3

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:

[Tutorial] IA Básica de TDS (Pt. 2) Tut2

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:

[Tutorial] IA Básica de TDS (Pt. 2) Tut4

É 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
Gonçalves

Games Ranking : Nota B

Notas recebidas : B + A + C
Data de inscrição : 29/10/2010
Reputação : 79
Número de Mensagens : 1013
Prêmios : [Tutorial] IA Básica de TDS (Pt. 2) Empty

Medalhas x 0 Tutoriais x 4 Moedas x 0

Ouro x 2 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

[Tutorial] IA Básica de TDS (Pt. 2) Empty Re: [Tutorial] IA Básica de TDS (Pt. 2)

Mensagem por Arkd Dom 27 Jan 2013, 15:48

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?
Arkd
Arkd

Data de inscrição : 03/04/2012
Reputação : 1
Número de Mensagens : 293
Prêmios : [Tutorial] IA Básica de TDS (Pt. 2) 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

http://www.arkadesgames.blogspot.com

Ir para o topo Ir para baixo

[Tutorial] IA Básica de TDS (Pt. 2) Empty Re: [Tutorial] IA Básica de TDS (Pt. 2)

Mensagem por Gonçalves Dom 27 Jan 2013, 16:07

@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!
Gonçalves
Gonçalves

Games Ranking : Nota B

Notas recebidas : B + A + C
Data de inscrição : 29/10/2010
Reputação : 79
Número de Mensagens : 1013
Prêmios : [Tutorial] IA Básica de TDS (Pt. 2) Empty

Medalhas x 0 Tutoriais x 4 Moedas x 0

Ouro x 2 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

[Tutorial] IA Básica de TDS (Pt. 2) Empty Re: [Tutorial] IA Básica de TDS (Pt. 2)

Mensagem por Marcellomine Dom 27 Jan 2013, 16:17

Muito interessante seu tuto!! Vou utilizar em meus jogos! Prometo que ponho créditos a você!! Smile
Marcellomine
Marcellomine

Data de inscrição : 22/01/2013
Reputação : 11
Número de Mensagens : 134
Prêmios : [Tutorial] IA Básica de TDS (Pt. 2) 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

[Tutorial] IA Básica de TDS (Pt. 2) Empty Re: [Tutorial] IA Básica de TDS (Pt. 2)

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