![]() |
|
![]() ![]() ![]() |
|
3.14 A caça dos monstros
Proposta: Mostrar como criar o sistema "a caça dos monstros" para o jogador. Neste tutorial nós iremos adicionar ao IA monstro a habilidade de caçar o jogador. Nós também adicionamos algum IA para melhorar a capacidade de tiro do monstro ao detectar se o jogador está ocultado por algum obstáculo ou terreno. Rem Carregar alvo Load object "idle.x",3 append Object "Walk.x",3,21 Nós adicionamos esta linha de código antes do loop principal. O comando "Append Object" carrega os dados de animação de um arquivo diferente do que este primeiro arquivo que você carregou. Com este comando não é necessário carregar um outro objeto quando você pode somente anexar os dados de animação. Os objetos em cada um dos arquivos que você deseja anexar devem ser idêntico ou o comando falhará. O comando requer 3 parâmetros. O primeiro parâmetro é o nome do arquivo que você deseja anexar. O segundo parâmetro é o número do objeto para onde você deseja anexar os dados de animação. O terceiro parâmetro é o número do frame onde você deseja anexar a animação. Se o número do frame é maior que o número total de frames na primeira animação, o comando falhará. if DecoCollide(MbX#,MbY#,MbZ#) = 1 MonsterBulletLife = 0 BulletAvoidDeco = BulletAvoidDeco + 2 Endif if MbY# < Get Ground height(1,MbX#,MbZ#) MonsterBulletLife=0 ShootUp=3 endif As variáveis "ShootUp" e "BulletAvoidDeco" são adicionada à sub-rotina "MonsterShootBullet". À variável "ShootUp" é dado o valor 3 caso o projétil do monstro atinja o terreno. Esta variável será usada para modificar o ângulo que o monstro usa para atirar para permitir que a bala seja atirada sobre o terreno. A variável "BulletAvoidDeco" tem o valor 2 adicionado à ela a cada vez que o projétil atinge uma das colunas. Esta variável é usada para modificar o ângulo que o monstro atira para dar à ele a oportunidade de atirar em torno dos obstáculos. Mesmo que o monstro não esteja atirando diretamente no jogador, quando os ângulos são modificados o projétil possui os atributos do seu guia original modificado para a mira do projétil. Rem IA simples para o projétil guiado do monstro MonsterAI: Point object 3,X#,Y#,Z# If AvoidDeco >0 mA# = Object Angle Y(3) Dec AvoidDeco Yrotate object 3,WrapValue(mA#+AvoidDeco*60) endif Rem Posicionar monstro em uma nova localização Position Object 3,mX#,mY#,mZ# Rem Checar distância do jogador PDist=Sqrt((mX# - X#)^2 + (mY#+25 - Y#)^2 + (mZ# - Z#)^2) Rem Se o jogador está na faixa de tiro if PDist<1500 if MonsterBulletLife=0 or MonsterBulletLife < 500-Pdist/10 Point object 3,X#,Y#-25,Z# If BulletAvoidDeco > 0 CornerAim = Rnd(1) mA# = object angle Y(3) if CornerAim = 0 then Yrotate Object 3,WrapValue(mA#+BulletAvoidDeco*10) if CornerAim = 1 then Yrotate Object 3,WrapValue(mA#+BulletAvoidDeco*-16) Dec BulletAvoidDeco Endif If ShootUp > 0 mA# = object angle X(3) XRotate Object 3,WrapValue(mA#+ShootUp*-8) Dec ShootUp Endif Position object 102,mX#,mY#+25,mZ# Set object to object orientation 102,3 MonsterBulletLife =500 show object 102 Loop sound 102 Rem Executar animação Loop Object 3,0,20 Endif Endif if PDist>1000 Rem Armazenar localização antiga OldmX# = mX# OldmZ# = mZ# OldmY# = mY# Rem Executar animação de caminhada Loop Object 3,21,46 Rem Mover monstro Move Object 3,7 Rem Obter nova posição mX# = Object Position X(3) mZ# = Object Position Z(3) mY# = Get Ground Height(1,mX#,mZ#) Rem Checar por colisão de decoração If DecoCollide(mX#,mY#,mZ#) = 1 and AvoidDeco = 0 mX# = OldmX# mZ# = OldmZ# mY# = OldmY# AvoidDeco = 3 Endif Endif Return Na sub-rotina "MonsterAI" nós adicionamos o código necessário para permitir que o monstro caminhe através dos obstáculos assim como o código modifica o ângulo de tiro do monstro quando as duas variáveis discutidas anteriormente são configuradas para valores diferentes de 0. If AvoidDeco >0 mA# = Object Angle Y(3) Dec AvoidDeco Yrotate object 3,WrapValue(mA#+AvoidDeco*60) endif A comparação "AvoidDeco" decrementar o valor em uma unidade e rotaciona a direção do monstro para adicionar o valor "AvoidDeco" multiplicado por 60 para o ângulo do monstro. Quando o monstro atinge um objeto de decoração, a variável "AvoidDeco" é configurada para 3. Em cada interação o monstro é movido primeiramente me 180 graus e então em 120 graus e logo após em 60 graus. Isto faz com que o monstro caminhe para trás de onde ele atingiu o obstáculo. Esta seção de código é relativo a como o monstro navega em torno dos obstáculos. If BulletAvoidDeco > 0 CornerAim = Rnd(1) mA# = object angle Y(3) if CornerAim = 0 then Yrotate Object 3,WrapValue(mA#+BulletAvoidDeco*10) if CornerAim = 1 then Yrotate Object 3,WrapValue(mA#+BulletAvoidDeco*-10) Dec BulletAvoidDeco Endif A comparação "BulletAvoidDeco" é similar a comparação avoid deco exceto pelo fato do ângulo não ser modificado tão drasticamente. Quando o projétil atinge um objeto de decoração, a variável "BulletAvoidDeco" é configurada para um valor igual a 2. Se o projétil atinge um obstáculo, novamente, um valor de 2 é adicionado. Isto é feito até que o projétil esteja apto a ir em torno do obstáculo. O projétil será atirado para a direita ou para a esquerda, dependendo de um valor aleatório. if PDist>1000 Rem Armazenar posição antiga OldmX# = mX# OldmZ# = mZ# OldmY# = mY# Rem Executar animação de caminhada Loop Object 3,21,46 Rem Mover monstro Move Object 3,7 Rem Obter nova posição mX# = Object Position X(3) mZ# = Object Position Z(3) mY# = Get Ground Height(1,mX#,mZ#) Rem Checar por colisão de decoração If DecoCollide(mX#,mY#,mZ#) = 1 and AvoidDeco = 0 mX# = OldmX# mZ# = OldmZ# mY# = OldmY# AvoidDeco = 3 Endif Endif Esta seção de código é onde nós movemos o monstro. Primeiramente, nós armazenamos a posição do monstro antes dele mover-se. Por próximo, nós executamos a animação de caminhada com o comando "Loop Object". Este comando possui mais dois parâmetros além daqueles usados em sua introdução. Os dois parâmetros após o número do objeto são a faixa de frames que nós desejamos fazer a repetição. Estes são os frames que nós, anteriormente, anexamos ao objeto. Esta animação faz com que o objeto repita a animação de caminhada enquanto nós movemos o objeto. Posteriormente, nós armazenamos a nova posição para onde nós desejamos mover o monstro. Nós checamos se a posição colide com alguma decoração. Se o monstro colidir nós modificamos as variáveis para seu valores originais e configuramos o comando "AvoidDeco" para o valor 3, fazendo com que o monstro caminhe a metade de um círculo em torno do objeto. If ShootUp > 0 mA# = object angle X(3) XRotate Object 3,WrapValue(mA#+ShootUp*-8) Dec ShootUp Endif A comparação "ShootUp" também é adicionada para a sub-rotina "MonsterAI". Se o projétil do monstro atinge o terreno, a variável "ShootUp" é configurada para um valor igual a 3. A direção do tiro do monstro é rotacionada para 24 graus acima do seu ângulo atual. O ângulo é decrementado em 8 graus em cada interação. Isto dá uma linha melhor de localização ao monstro em relação ao jogador. Você notará que nós não checamos pela queda do monstro na matriz. Isto não é necessário pelo fato do monstro sempre mover-se em direção ao jogador e o jogador nunca é permitido a mover-se fora da matriz. Estas poucas linhas de código deve tornar o jogo melhor e mais excitante além de dar ao monstro mais personalidade pelo fato dele "caçar o jogador". |
|
Esta é a barra de navegação para explorar todos os tutoriais da série "A Caça Aos Monstros" |
| 1.1 | 1.2 | 1.3 | 1.4 | 1.5 | 2.1 | 2.2 | 2.3 | 2.4 | 2.5 | 3.1 | 3.2 | 3.3 | 3.4 | 3.5 | 3.6 | 3.7 | 3.8 | 3.9 | 3.10 | 3.11 | 3.12 | 3.13 | 3.14 |
| Copyright © 2003 Dark Basic Software Limited. | ||
| Virtual Object Informática Ltda.® |
![]() |
![]() |