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


[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