If
you have your own tutorials or open
source and would like to share your
Director knowledge please send them
to info@shocksites.com.
We will review them, post it and give
full credit to the developer.
Este tutorial muestra
como construir juegos
basados en persecuciones.
Este modelo es utilizado
en inteligencia artificial
en juegos como Quake,
etc... de forma mucho
mas avanzada, de forma
que los bots siguen una
ruta de un punto a otro
del escenario, reaccionando
en funcion de la proximidad
al jugador humano de una
forma u otra en funcion
del nivel de vida, armadura,
superioridad en armas,
etc...
Es facil comprobar como
los bots se mueven por
si solos de un punto a
otro, siguiendo una pauta,
y en casos de inactividad
por parte del jugador
pasan a estado de reposo.
Esto se consigue combinando
path finding, con un modelo
de estados del bot.
En este tutorial, veremos
la forma mas basica y
simple que existe de este
estilo.
Quiza muy proximamente
prepare un tutorial completo,
en donde se extienda realmente
este concepto.
Making
the 3D models.
En mi caso soy un entusiasta
de Lightwave. Por eso
he usando Lightwave para
contruir las escenas base
del ejemplo.
Esto mismo se puede hacer
exactamente igual con
Maya, 3DS Max, Cinema
4D o cualquier otro paquete
con soporte Shockwave
3D.
En el primer paso he
creado en el Modeller,
una habitacion basica
a la que he invertido
las normales de los poligonos
para que se renderice
su parte interior. En
otras dos capas he creado
las dos naves. Antes de
exportar, es conveniente
comprobar que los pivot
de los objetos este bien
centrados para que se
produzcan bien las transformaciones
locales posteriores sobre
sus propios ejes durante
el juego.
En estas tres capas del
modelo final, tenemos
la primera capa llamada
"room",
la segunda que contiene
la nave verde del jugador,
llamada "myship",
y finalmente la tercera
capa con el nombre de
"heship"
conteniendo el modelo
de la nave amarilla perseguidora.
The
Lightwave Modeller with
all the game models prepared
to send to LW Layout.
Posteriormente estes
seran los nombre de cada
objeto, y seran llamados
desde lingo directamente
con este nombre. Con las
instrucciones:
member(1).model("scene:myship")
En donde member(1) es
el miembro del cast donde
esta importada toda la
escena.
Una vez montados los
modelos, simplemente los
he pasado al Layout de
Lightwave, he colocado
las luces y he exportado
toda la escena a Shockwave
3D.
The
Lightwave Layout with
the scene prepared to
export for Shockwave 3D
Ya tenemos toda la escena
en formato Shockwave 3D,
solo tendremos que importarla
en Director, colocar la
orientacion inicial de
la camara como mejor nos
convenga y empezar a poner
nuestros primeros scripts
para controlar todos y
cada uno de los objetos
que hemos importado juntos
en la misma escena. Cada
uno llamado por su propio
nombre.
The
Shockwave 3D scene prepared
to run.
Una vez hemos importado
la escena y la hemos colocado
en el escenario, veamos
paso a paso los scripts
necesarios para hacerla
funcionar.
Al nuevo sprite colocado
en el escenario con la
escena completa en Shockwave
3D, le asignamos el siguiente
script:
-- global variables global
w, myship, heship, distanci,
running, posy
on
beginsprite me
w = member(1) --
global variable W point
to member 1 of cast lib
w.resetworld() --
reset the world values
to defaults
myship = w.model("scene:myship")
-- get Lightwave models
from scene heship
= w.model("scene:heship")
posy
= heship.transform.position.y
-- get the
initial Y value
of heship vector position
on
exitframe me
-- camera looking at:
object position with
the especified constant
vector up w.camera[1].pointat(myship.transform.position,
vector(0,1,0))
heship.transform.position.y
= posy -- keep
the initial Y vector
value of the heship position.
---------------------------------------
path finding code mpos
= myship.transform.position
-- myship position hpos
= heship.transform.position
-- heship position distanci
= hpos.distanceto(mpos)
-- real time distance
from ships
-- yellow ship looking
at myship position. heship.pointat(myship.transform.position)
-- invert the yellow ship
orientation heship.transform.rotation
= heship.transform.rotation
+ vector(0,180,0)
if(distanci
> 25) then --
move when distance > 25
running = true heship.translate(0,0,0.5)
end if
if(distanci
<= 25 and running = true)
then -- stop
if distance <= 25 and
play laser sound running
= false
sound(1).play(member("alert"))
end if
--------------------------------------------------------
-- basic drive key codes
for myship if
keypressed(126) then
myship.translate(0,0,2)
end if
if keypressed(125) then
myship.translate(0,0,-2)
end if
if keypressed(123) then
myship.rotate(0,5,0)
end if
if keypressed(124) then
myship.rotate(0,-5,0)
end if
Y esto es todo. Este
como veis es un problema
bastante sencillo de resolver
en Director.
A partir de esto, es facil
pensar en distintos tipos
de juegos en los que con
unos pocos añadidos
podremos acceder a una
serie casi infinita de
distintas soluciones.