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.
Current Open Source and Tutorials

Download the Open Source Here

Follow Me Tutorial
Provided by Jose Luis R. Novoa

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.

Espero que os haya servido de ayuda.

Saludos y hasta pronto.

------------------------------------------
Jose Luis R. Novoa
jrnovoa.shockwaveserver.com