ProdutosNewsComprarDownloadsDownloadsDownloadsTutoriaisSuporteNão disponívelGaleriaForumContato  

DarkBASIC Pro
Versão de Avaliação
Patch 5.4
USB Dongle
Forum
Indique
Lista de Email
  Diário Antigo
Outros Produtos
Cartography Shop
DarkMatter
Curso 3D Studio
Combinados
Local DBPro Sites
Italy
UK

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".

Promoção de Lançamento

Clique aqui para comprar o 
DBPro R$220,00

Clique aqui para comprar o 
DBPro para Universitários R$150,00


clique aqui para comprar o Upgrade a partir da versão clássica por R$150,00

Nova pagina 1

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