Código:
#include ninfa3d, bi.
Declaración de variables.
Variables declaradas con shared, para que puedan ser utilizadas en el bloque.
Principal y dentro de los distintos bloques de cada función (sub).
Dim shared cámara as ncamera.
Dim shared meshenano as nmesh.
Dim shared as integer posmousex, posmousey,camy.
Variables que son utilizadas solo en el bloque principal. Si se declaran.
Varias variables del mismo tipo se utiliza la forma Dim as var1, ar2.
En cambio, si se declara una sola variable de ese tipo se suele utilizar la.
Forma Dim nombrevariable as .
Dim lightluz_principal as nlight.
Dim sprite as nsprite.
Declaramos y asignamos valor a la constante pi del tipo double.
Const pi as double = 3.1415926535897932.
Activamos sincronización vertical de pantalla. Más información en documentación.
Enablevsync().
Iniciamos el motor ninfa3d con una resolución de pantalla 1024x768, 32 bits.
A pantalla completa (1).
Initengine (1024,768,32,1).
Backgroundcolor(128,128,12 color de fondo.
Ambientlight(64,64,64) color luz de ambiente.
Declaración de funciones.
========================
Sub createground() función que genera el escenario.
Declaración de variables locales. Solo visibles desde el bloque de esta función.
Dim Mesh as nmesh.
Dim body as nbody.
Dim as ntexture texture04, texture05.
Texture04 = loadtexture (media/wall.jpg).
Texture05 = loadtexture (media/wood.jpg).
Mesh = createmeshcube ().
Scalemesh(Mesh,512,20,1).
Positionentity(Mesh,0,10,256).
Entitytexture (Mesh, texture05,0).
Body = createbodycube (512,20,1,0).
Positionentity(body,0,10,256).
Mesh = createmeshcube ().
Scalemesh(Mesh,1,20,512).
Positionentity(Mesh,256,10,0).
Entitytexture (Mesh, texture05,0).
Body = createbodycube (1,20,512,0).
Positionentity(body,256,10,0).
Mesh = createmeshcube ().
Scalemesh(Mesh,512,20,1).
Positionentity(Mesh,0,10,-256).
Entitytexture (Mesh, texture05,0).
Body = createbodycube (512,20,1,0).
Positionentity(body,0,10,-256).
Mesh = createmeshcube ().
Scalemesh(Mesh,1,20,512).
Positionentity(Mesh,-256,10,0).
Entitytexture (Mesh, texture05,0).
Body = createbodycube (1,20,512,0).
Positionentity(body,-256,10,0).
Mesh = createmeshplane (64.
Entitytexture (Mesh, texture04,0).
Body = createbodycube (512,1,512,0).
End sub.
Sub mover_camara () situar la cámara detrás del jugador, tomando como referencia.
La orientación (yaw) de la malla del jugador.
Dim as single localx, localz.
Localz=cos(entityyaw(meshenano)+pi)*20.
Localx=sin(entityyaw(meshenano)+pi)*20.
Positionentity(cámara, localx+entityx(meshenano),64, localz+entityz(meshenano)).
Cameratarget(cámara,entityx(meshenano),64-camy,entityz(meshenano)).
End sub.
Sub actualizar_camara () recoge los movimientos realizados desde el ratón.
Los movimientos en el eje X (horizontales) afectan a la orientación de la malla.
Los movimientos en el eje y (verticales) afectan al ángulo vertical de la cámara.
Dim as single rotación.
Rotacion=(mousex-posmousex)*pi/180.
Turnentity(meshenano,0,rotación,0).
If ((mousey()-posmousey)>0) and (camy<20) then camy+=1.
If ((mousey()-posmousey)<0) and (camy>-20) then camy-=1.
Posmousex=mousex.
Posmousey=mousey.
Mover_camara ().
End sub.
Sub mover_malla () recoge la pulsación de las teclas wasd para mover la malla.
Del jugador, considerando la orientación (yaw).
Dim as single ángulo, velocidad, localx, localzvariables locales de la función ángulo=((keydown(key_d)-keydown(key_a))*(pi/2)/(1+(keydown(key_w))))+((keydown(key_s))*pi*(1-(keydown(key_a))*2)/(1+(keydown(key_d)+keydown(key_a))*3)) ángulo+=entityyaw(meshenano).
Velocidad=0.5+0.5*(keydown(key_control)).
Localx=sin(ángulo)*velocidad.
Localz=cos(ángulo)*velocidad.
Positionentity(meshenano, localx+entityx(meshenano),0, localz+entityz(meshenano)).
Mover_camara ().
End sub.
Creamos un punto de iluminación (luz). Ver en documentación diferentes tipos.
Lightluz_principal = createlight().
Lighttype (lightluz_principal,1) tipo de luz.
Positionentity(lightluz_principal,0,128,12 posición.
Lightcastshadow(lightluz_principal) hace que la luz proyecte sombras sobre los.
Objetos que tenga activada esta opción.
Lightradius(lightluz_principal,256) radio o alcance de la luz.
Sprite = loadsprite (media/Glow.bmp).
Entityparent(sprite, lightluz_principal).
Scalesprite (sprite,30,30).
Meshenano = loadmesh(media\dwarf2.b3d).
Meshcastshadow(meshenano) activar proyección de sombras sobre este objeto.
Animatemesh(meshenano,1,15,1,30,1) animar la malla. Ver documentación.
Positionentity(meshenano,0,0,0) situar la malla en el escenario.
Createground() llamada a la función que genera el escenario (suelo y muro).
Cámara = createcamera () crear cámara. Imprescindible.
Mover_camara () llamada a la función que sitúa la cámara detrás del jugador.
Variables utilizadas para comprobar las variaciones en el ratón.
Posmousex=mousex.
Posmousey=mousey.
Ocultar puntero del ratón.
Hidemouse ().
While (enginerun)devuelve 1 si el motor sigue funcionando.
Comenzar escena.
Beginscene ().
Si pulsamos la tecla escape cerramos el motor.
If keyhit(key_escape) then closeengine ().
Si la posición actual del ratón es diferente de la anterior.
If (not posmousex=mousex) or (not posmousey=mousey) then actualizar_camara ().
Si pulsamos wasd.
If keydown(key_w) or keydown(key_s) or keydown(key_a) or keydown(key_d) then mover_malla ().
Actualizar motor.
Cambiando el valor que afectara a la velocidad de actualización de la física.
Del juego. Ver documentación.
Updateengine (0).
Finalizar la escena.
Endscene ().
Wend.
Mostrar puntero del ratón.
Showmouse ().
Finalizar motor ninfa3d.
Endengine ()
Saludos.