aula11_xna
DESCRIPTION
Programação para jogos com a plataforma .NetTRANSCRIPT
-
Curso: Desenvolvendo Jogos 2d Com C# E Microsoft X NA
Conteudista: Andr Luiz Brazil
TORNANDO A ESPAONAVE INIMIGA MAIS INTELIGENTE META
Tornar a espaonave inimiga mais gil e inteligente. OBJETIVOS
Ao final da aula, voc deve ser capaz de:
1. Fazer a espaonave inimiga tentar escapar dos tiros di sparados pelo jogador; 2. Fazer a espaonave inimiga atirar na nave do jogador ; 3. Fazer a espaonave inimiga se aproximar da nave do j ogador.
PR-REQUISITOS
1. Conhecer a ferramenta XNA Game Studio, conceito abordado na aula 2;
2. Possuir um computador com as ferramentas Visual C# e XNA Game Studio instaladas, conforme explicado na aula 3;
3. Ter o seu projeto de jogo atualizado conforme o contedo da aula 9, que inclui a a verificao de colises entre os tiros disparados e a es paonave inimiga.
-
Introduo
Na aula anterior aprendemos a programar efeitos duradouros dentro do jogo, tais
como exploses. Acrescentamos o efeito de exploso quando uma espaonave inimiga
era acertada pelo tiro disparado pela nave do jogador.
Agora vamos trazer um pouco mais de inteligncia ao jogo. Aprenderemos como
programar algumas tticas para a espaonave inimiga se tornar mais desafiadora.
Figura 11.1
Fonte: http://www.carteret.edu/IntranetHome/Admissions/images/thinking.jpg (Jefferson, favor redesenhar)
Caixa de nfase
Inteligncia Artificial a programao de aes automticas
a serem tomadas pelos objetos do jogo de acordo com os
acontecimentos ocorridos durante o jogo.
Fim da Caixa de nfase
Como podemos tornar a espaonave inimiga mais intelig ente?
Precisamos programar algumas aes automticas a serem tomadas pela
espaonave inimiga, com base nas aes que o jogador est tomando durante o jogo.
Quais aes automticas podem tornar a espaonave inimig a mais inteligente?
Se esquivar dos tiros disparados pelo jogador;
Atirar na espaonave do jogador;
Se aproximar da espaonave do jogador.
O que inteligncia artificial?
-
Escapando dos tiros
Vamos programar a espaonave inimiga para tentar se es quivar dos tiros
disparados pelo jogador.
Passo 1: Adicione o mtodo Proximo classe Espaonave, para verificar se um
objeto est prximo da espaonave. Este mtodo muito importante e ser a base para
todos os outros testes que iremos fazer.
// Testa a proximidade em relao a um objeto public bool Proximo( int p_proximidade, int p_posicaox_objeto, int
p_posicaoy_objeto) { // Testando se o objeto est prximo da espaonave if (_posicaox + _textura.Width + p_proximidade > p_po sicaox_objeto && _posicaox < p_posicaox_objeto + p_prox imidade && _posicaoy + _textura.Height + p_proxim idade > p_posicaoy_objeto && _posicaoy < p_posicaoy_objeto + p_prox imidade) { return true ; } else return false ; }
O teste para verificar se o objeto est prximo da espaonave bastante
semelhante ao teste de coliso, apenas inclui mais um valor de proximidade para verificar
quando o objeto est chegando mais perto da espaonave.
Passo 2: Acrescente um mtodo Escapar classe Espaconave para fazer com
que ela se movimente na direo oposta aos tiros disparad os no jogo quando estes se
aproximarem dela
// Fugir de um tiro public void Escapar( int p_posicaox_objeto, int p_posicaoy_objeto, int
p_posicaox_maxima, int p_posicaoy_maxima) { // Testando se o objeto est prximo da espaonave if ( Proximo(50, p_posicaox_objeto, p_posicaoy_objeto ) ) { // Tiro abaixo e esquerda - mover para cima e dir eita if (p_posicaox_objeto >= _posicaox && p_posicaoy_obje to >
_posicaoy) { Mover(1, p_posicaox_maxima, p_p osicaoy_maxima); Mover(4, p_posicaox_maxima, p_p osicaoy_maxima); } // Tiro abaixo e direita - mover para cima e esqu erda if (p_posicaox_objeto < _posicaox && p_posicaoy_objet o >
_posicaoy) { Mover(1, p_posicaox_maxima, p_p osicaoy_maxima);
-
Mover(2, p_posicaox_maxima, p_p osicaoy_maxima); } } }
Repare que o mtodo Escapar recebe quatro parmetros: as posies x e y do
objeto do qual a espaonave est tentando escapar e as posies-limite x e y da tela.
Observe que o movimento da espaonave sempre na dire o contrria posio
atual do objeto em relao espaonave, ou seja, se o objeto est abaixo e esquerda
da espaonave, por exemplo, esta se movimentar para cima e para a direita.
Passo 3: Acrescente ao mtodo de atualizao do jogo ( Update ) uma instruo
para chamar o mtodo Escapar da espaonave inimiga. O melhor local para fazer isso
logo aps a movimentao de cada tiro. Veja como ficou:
// Movendo os tiros do jogo foreach ( Tiro oTiro in TirosDisparados.GetRange(0,TirosDisparados.Count)) { oTiro.Mover(); // Inimigo foge dos tiros NaveInimiga.Escapar(oTiro.PosicaoX(),
oTiro.PosicaoY(), this .Window.ClientBounds.Width, this .Window.ClientBounds.Height);
Atividade Prtica 1 Atende ao Objetivo 1
Seguindo os trs passos descritos anteriormente, abra o seu projeto de jogo na
ferramenta Visual C# e programe o mtodo Escapar da classe espaonave para fazer a
espaonave inimiga tentar escapar dos tiros disparados pela nave do jogador.
Fim da Atividade Prtica 1
Atirando contra o jogador
Vamos agora programar a espaonave inimiga para atacar a espaonave do
jogador atirando contra ela.
Passo 1: Acrescente um mtodo Atacar classe Espaconave para fazer com que
ela se decida se ir atacar caso algum objeto esteja se aproximando dela.
// Atacar um objeto inimigo public bool Atacar( int p_posicaox_objeto, int p_posicaoy_objeto) { if (Proximo(200, p_posicaox_objeto, p_posicaoy_objeto )) return true ; else
-
return false ; }
Repare que o mtodo Atacar apenas uma chamada ao mtodo Proximo com o
valor 200, ou seja, apenas decide se a espaonave deve o u no atacar com base na
proximidade do objeto inimigo em relao espaonave .
Passo 2: Ajuste o mtodo Atirar da classe Espaonave para que receba um novo
parmetro, que a direo do tiro.
public void Atirar( int p_direcao_tiro , GraphicsDevice p_dispositivo_grafico, string p_local_textura_tiro, List p_lista_tiros)
{ Tiro oTiro; // Cria um tiro
oTiro = new Tiro (_potencia_tiro, p_direcao_tiro , _velocidade_tiro, _posicaox, _posicaoy);
// Carrega a textura do tiro oTiro.CarregarTextura(p_dispositivo_gra fico, p_local_textura_tiro); // Ajusta a posio inicial do tiro oTiro.PosicaoX(oTiro.PosicaoX() + (_tex tura.Width /2)); if (p_direcao_tiro == 3) // Tiro para baixo { oTiro.PosicaoY(oTiro.PosicaoY() +
_textura.Height); } // Acrescenta o tiro na lista de tiros do jogo p_lista_tiros.Add(oTiro); }
Observe que foi acrescentado tambm um ajuste para a posio inicial y do tiro
caso a direo do tiro seja para baixo (direo 3). Ist o foi feito para que o tiro saia abaixo
da textura da espaonave inimiga e no por dentro dela .
Passo 3: Acrescente ao mtodo de atualizao do jogo ( Update ) uma instruo
para chamar o mtodo Atacar da espaonave inimiga. O melhor local para fazer isso
logo aps a movimentao da espaonave do jogador. Veja como ficou:
if (teclado.IsKeyUp( Keys .Space) && apertou_tiro) { apertou_tiro = false ; } // Atirando contra o jogador if (NaveInimiga.Atacar(NaveJogador.PosicaoX(),
NaveJogador.PosicaoY()))
-
{ NaveInimiga.Atirar(3,graphics.GraphicsDev ice,
"../../../Content/Imagens/tiro.png" , TirosDisparados);
}
Atividade Prtica 2 Atende ao Objetivo 2
Seguindo os trs passos descritos anteriormente, abra o seu projeto de jogo na
ferramenta Visual C# e programe o mtodo Atacar da classe espaonave para fazer a
espaonave inimiga tentar atirar contra a nave do jogad or.
Fim da Atividade Prtica 1
Se aproximando do jogador
Vamos agora programar a espaonave inimiga para se ap roximar da espaonave
do jogador, indo na sua direo quando esta chega per to.
Passo 1: Acrescente um mtodo Aproximar classe Espaconave para fazer com
que ela se movimente na direo da nave do jogador qu ando esta ficar prxima dela.
// Se aproximar do objeto public void Aproximar( int p_posicaox_objeto, int p_posicaoy_objeto, int
p_posicaox_maxima, int p_posicaoy_maxima) { // Testando se o objeto est longe da espaonave if (Proximo(250, p_posicaox_objeto, p_posicaoy_objeto )) { // Objeto abaixo e esquerda - mover para baixo e esquerda if (p_posicaox_objeto >= _posicaox && p_posicaoy_obje to > _posicaoy) { Mover(3, p_posicaox_maxima, p_p osicaoy_maxima); Mover(2, p_posicaox_maxima, p_p osicaoy_maxima); } // Objeto abaixo e direita - mover baixo e direit a if (p_posicaox_objeto < _posicaox && p_posicaoy_objet o > _posicaoy) { Mover(3, p_posicaox_maxima, p_p osicaoy_maxima); Mover(4, p_posicaox_maxima, p_p osicaoy_maxima); } } }
Repare que o mtodo Aproximar bastante semelhante ao mtodo Escapar ,
sendo que a espaonave, neste caso, se movimenta na mesma d ireo que o objeto, indo
de encontro a ele quando este se aproxima.
-
Passo 2: Acrescente ao mtodo de atualizao do jogo ( Update ) uma instruo
para chamar o mtodo Aproximar da espaonave inimiga. O melhor local para fazer isso
logo aps a movimentao da espaonave do jogador. Vej a como ficou:
if (teclado.IsKeyUp( Keys .Space) && apertou_tiro) { apertou_tiro = false ; } // Aproximando o inimigo do jogador NaveInimiga.Aproximar(NaveJogador.PosicaoX(),
NaveJogador.PosicaoY(), this .Window.ClientBounds.Width, this .Window.ClientBounds.Height);
// Atirando contra o jogador if (NaveInimiga.Atacar(NaveJogador.PosicaoX(),NaveJog ador.PosicaoY())) { NaveInimiga.Atirar(3,graphics.GraphicsDevice,
"../../../Content/Imagens/tiro.png" , TirosDisparados); }
Atividade Prtica 3 Atende ao Objetivo 3
Seguindo os dois passos descritos anteriormente, abra o seu projeto de jogo na
ferramenta Visual C# e programe o mtodo Aproximar da classe espaonave para fazer
a espaonave inimiga agir na ofensiva, se aproximando da nave do jogador quando esta
chega perto dela.
Fim da Atividade Prtica 3
Atividade Prtica 4 Atende ao Objetivo 1
Existe uma pequena falha no cdigo do jogo. Repare qu e a espaonave inimiga
tenta escapar dos seus prprios tiros. Ajuste o cdigo do jo go de forma que a espaonave
inimiga tente escapar apenas dos tiros disparados pela espaonave do jogador.
Dica: Ser necessrio criar na classe Tiro um atributo para indicar quem disparou o
tiro.
Fim da Atividade Prtica 4
CAIXA DE FRUM Informao sobre Frum
-
! "#$ %##!()
*+,-./*0/,-123+
CAIXA DE ATIVIDADE Informao sobre Atividade on-line
4445 %##!() ! " *+./*0/,-/6*7*,/,-
Resumo
Inteligncia Artificial a programao de aes automticas a serem tomadas
pelos objetos do jogo de acordo com os acontecimentos ocorridos durante o jogo.
Para tornar a espaonave inimiga mais inteligente, p odemos programar as
seguintes aes automticas com base nas aes que o jogador est tomando
durante o jogo:
o Se esquivar dos tiros disparados pelo jogador;
o Atirar na espaonave do jogador;
o Se aproximar da espaonave do jogador.
O mtodo mais importante a ser criado na classe Espaonave o mtodo
Proximo . Ele serve para verificar se um objeto est prximo da espaonave. Este
mtodo muito importante e ser a base para todos os outros testes que iremos
fazer. Este mtodo bastante semelhante ao mtodo ColisaoSimples do jogo.
Tambm precisaremos criar os mtodos Escapar, Atacar e Aproximar , para que
a espaonave tome as aes descritas acima.
o No mtodo Escapar , a espaonave se movimenta na direo contrria do
objeto em questo;
o No mtodo Atacar , a espaonave atira contra o objeto em questo, tentan do
acerta-lo;
-
5
o No mtodo Aproximar , a espaonave se move na mesma direo que o
objeto em questo.
Fim do resumo