Ir al contenido

publicidad

Foto

DEMO en curso. ESENTHEL


Este tema ha sido archivado. Esto significa que no puedes responder en este tema.
3 respuestas en este tema

  • IsGreen

  • Neonate

  • vida restante: 100%
  • Registrado: 12 ene 2009
  • Mensajes: 73
#1

Escrito 10 abril 2009 - 19:28

Este es el enlace de descarga de la demo que estoy realizando con ESENTHEL (lenguaje de programacion c++).

http://www.mediafire.com/?nzztmhqzndm


Incluye:

-Código de programacion.
-Recursos del juego.
-Todos los tutoriales .cpp de Esenthel en un archivo .html
-Pequeña guía BLENDER&Mesh Editor

Imagen Enviada


Tareas pendientes de realizar:

- Sonido
- Interfaz o HUD
- Menu.
- Crear más tipos de enemigos. :roll:
- ...

El codigo ya funciona con los elementos básicos del juego.

Si alguien está interesado en agregar o mejorar código para la demo que lo deje en este post.

Saludos.

  • IsGreen

  • Neonate

  • vida restante: 100%
  • Registrado: 12 ene 2009
  • Mensajes: 73
#2

Escrito 13 abril 2009 - 20:44

Saludos,

Imagen Enviada


Este es el codigo de lo que sería el menu del juego. Primero, deberían ejecutar el tutorial de la SDK situado en "Advanced\2 - Animation, Physics, Rendering\Rendering\20 - Volumetric Clouds.cpp", y generar las texturas y el archivo con la configuracion establecida.

[code:1]
/******************************************************************************/
#include "stdafx.h"
/******************************************************************************/

// Global Variables

Mesh meshPlane;
Matrix matrixPlane;
CChar8 *ccText[7]={"Player","Difficulty","Start","Easy","Normal","Expert","Insert Name"};
Flt PosicionTexto[6][4]={0.514f,0.357f,0.885f,0.235f, 0.443f,0.058f,0.952f,-0.06f, 0.552f,-0.243f,0.855f,-0.354f, 0.55f,0.357f,0.847f,0.239f, 0.495f,0.056f,0.912f,-0.052f, 0.498f,-0.243f,0.906f,-0.357f};
Str Name;
I8 indiceMenu(0),difficulty(0);

Flt IncX, IncY, IncZ;

// General Functions

void ActualizarRaton(Vec2 pos) {

switch (indiceMenu) {
case 0 : {
FREP(3) if ((pos.x>PosicionTexto[i][0])&&(pos.xPosicionTexto[i][3])) indiceMenu=i+1;
break;
}
case 2 : {
FREP(3) if ((pos.x>PosicionTexto[i+3][0])&&(pos.xPosicionTexto[i+3][3])) difficulty=i;
}
}

}



/******************************************************************************/
void InitPre()
{
App.name("Volumetric Clouds");
App.flag=APP_FULL_TOGGLE;
IOPath("../data");
PakAdd("engine.pak");

D.full(true).ambMode(AMB_HIGH4).ambPower(0.3).hdr(true).hdrMaxBright(1.5).hdrExposure(0.7);
}
/******************************************************************************/
Bool Init()
{
Sky.set();

Sun &sun=Suns.New(); // create a new sun in 'Suns' container
sun.set(*Gfxs("gfx/sky/sun.gfx")); // set image
sun.pos=!Vec(-20000,-5800,-5000); // set custom position
sun.rays.color.set(0.3f,0.2f,0.1f);
sun.size=0.2f;
sun.rays.mode=SUN_RAYS_HIGH;

Clouds.volumetric.set(Gfxs("LocalData/cloud.gfx"),Gfxs("LocalData/detail.gfx"));
Clouds.volumetric.load("LocalData/volumetric_clouds");

meshPlane.load("LocalData/Obj/glider/glider.mesh");
meshPlane.mirrorY()
.setRender();
matrixPlane.setScale(1)
.move(Vec(-62,76,34))
.orn.setRotateY(-1.7f)
.scale(40);

Cam.matrix.move(Vec(0,65,0));
Cam.setAngle(Cam.matrix.pos,1.57f,0.2f,3.1415f).updateVelocities().set();

IncX=RandomF()/10; IncY=RandomF()/10; IncZ=RandomF()/10;

return true;
}
/******************************************************************************/
void Shut()
{
}
/******************************************************************************/
Bool Main()
{
if(Kb.bp(KB_ESC)) if (indiceMenu==0) {return false;} else {indiceMenu=0; return true;}

if ((Kb.bp(KB_BACK)) && (indiceMenu==1) && (Name.length()>0)) {Name.removeLast(); return true;}

if((Kb.c()) && (indiceMenu==1) && (Name.length()<15)) {Name+=Kb.c(); return true;}

if (Ms.b(0)) ActualizarRaton(Ms.pos);

// if (indiceMenu==3) RUN_GAME;

Clouds.volumetric.update(Vec2(4,4));

return true;
}
/******************************************************************************/
void Render()
{
switch(Renderer())
{
case RM_SOLID:
matrixPlane.move(Vec(IncX,IncY,IncZ));
if ((matrixPlane.pos.x>-42) || (matrixPlane.pos.x<-82)) IncX=-IncX;
if ((matrixPlane.pos.y>96) || (matrixPlane.pos.y<56)) IncY=-IncY;
if ((matrixPlane.pos.z>54) || (matrixPlane.pos.z<20)) IncZ=-IncZ;
meshPlane.draw(matrixPlane);
break;
}
}
void Draw()
{
Renderer(Render);

TextDS tds;

tds.color=GREY_DARK;
tds.scale*=2;
tds.shadow=64;


switch (indiceMenu) {
case 0 : {
FREP(3) D.text(tds,0.7f,0.3f-i*0.3f,ccText[i]);
break;
}
case 1 : {
D.text(tds,0.75f,0.25f,ccText[6]);
tds.align.set(1,0);
tds.color=GREY_DARK2;
tds.shadow=0;
if ((int)Tm.time()%2==0) D.text(tds,0.25f,0,S+Name+'_'); else D.text(tds,0.25f,0,Name);
break;
}
case 2 : {
FREP (3) {
if (difficulty==i) {tds.color=GREY_DARK2;} else {tds.color=GREY;}
D.text(tds,0.7f,0.3f-i*0.3f,ccText[i+3]);
}
}


}

//D.text(0,-0.8,S+Ms.pos);
}
/******************************************************************************/
[/code]

  • IsGreen

  • Neonate

  • vida restante: 100%
  • Registrado: 12 ene 2009
  • Mensajes: 73
#3

Escrito 10 mayo 2009 - 23:53

Nuevo código DEMO en curso.

http://www.speedysha.../195238708.html

- Añadido terreno creado con el World Editor.
- Crear y eliminar copias de las estructuras del juego utilizando contenedores de memoria (nodos, memoria dinámica)
- Añadida pequeña interfaz de juego
- Musica y sonido
- Mejorado código, simplificando procesos del juego y reduciendo el numero de variables utilizadas.

Imagen:
Imagen Enviada


--------------------------------------------

Para la creación del terreno en un archivo .mshg (mesh group) donde podemos aplicar varios materiales sobre una malla, primero, creamos el escenario desde el World Editor y después ejecutamos la acción contruir desde el menú Main-->Build. Si el escenario creado esta formado por varias areas o superficies durante la construcción del escenario se habrán generado varios archivo .mshg. Por esta razón he creado un escenario compuesto por una única superficie o área.

El World Editor detecta automáticamente los materiales disponibles para la creación del escenario desde la carpeta mtrl situada en la ruta establecida al iniciar por primera vez el World Editor o el Mesh Editor, pero también, he tenido que copiar los materiales utilizados en la creación del archivo .mshg, en la carpeta del motor de juego Data/mtrl y así ser utilizado desde el código del programa.

---------------------------------------------

Partes del código:


[code:1]// Archivos de cabecera

#include ....

// Definir nombre de macros

#define ...

// Variables globales

.....

// DECLARACION de Estructuras o Clases. Tu puedes crear copias durante este proceso (memoria estática)

.....

// Crear copias de estructuras/clases (memoria estática) o Crear Contenedores de Memoria (nodos) de estructuras/clases del juego (memoria dinámica)

.....

// Funciones Generales.

.....

// DEFINICION Estructuras o Clases

.....

// Funciones del Motor de Juego Esenthel

// void InitPre() { ... }
// Bool Init () { Desde aquí, realizamos la construcción de las copias de las estructuras/clases de memoria estática}
// void Shut {}
// Bool Main { Aquí, creamos y eliminamos las copias de estructuras/clases que utilizan memoria dinámica (contenedores de memoria) }
// void Draw() {}[/code]

Para crear contenedores de memoria, he utilizado el contenedor de tipo Memx.

Características de este tipo de contenedor de memoria (Memx):


VENTAJAS:
Rápido (ligeramente más lento que Memb)
Baja fragmentación de memoria
Rápido acceso a i-th elemento (nodos)
Cálculo inmediato del índice de elementos
La eliminación de cualquier elemento es sencillo
La eliminación de elementos no cambia la dirección a memoria de otros elementos.

DESVENTAJAS:
La inserción manual de elementos antes que otros no esta disponible.


Declaración del contenedor de memoria Memx:

[code:1]Memx NombreContenedor;[/code]

Crear nuevo nodo con la función New(). También, añadimos el nombre de la función constructora (en este caso activar ());

[code:1]NombreContenedor.New().activar();[/code]

Actualizar contenedor y eliminar elemento i-th o nodo si es necesario. Utilizaremos la macro REPA (Dato) (del inglés Repeat All, es decir, Repetir Todo que genera un bucle que se repite tantas veces como el número de elementos existentes del tipo de Dato establecido entre paréntesis) para recorrer todos los nodos y ejecutar la función de actualización (en este caso actualizar()). Añadimos la condición donde si Inactivo es verdadero, eliminamos el elemento i-th o nodo en curso.

[code:1]REPA (NombreContenedor) {

NombreContenedor[i].actualizar();
if (NombreContenedor[i].Inactivo) NombreContenedor.removeValid(i);
}[/code]

Dibujamos desde la función Render del programa que utiliza los modos de renderizado del motor de juego (RM_SOLID, RM_LIGHT, RM_BLEND, ...) mediante la función de dibujo (en este caso dibujar())

[code:1]REPA (NombreContenedor) {

NombreContenedor[i].dibujar();
}[/code]

También, he añadido algunas líneas de código en la fución Shut del motor de juego para limpiar los contenedores de memoria.

[code:1] NombreContenedor.clear();[/code]


No he utilizado funciones 'virtual' en las estructuras del juego porque necesito ejecutar la función actualizar() individualmente para eliminar los nodos en los contenedores de memoria, o algunos elementos del juego son renderizado desde varios modos.

--------------------------------------------------------------------------------------

Para calcular el movimiento de los disparos del enemigo, he utilizado:

Vec dir = ( Vec Posicion del Objetivo - Vec Posicion Inicial) * Tm.d() * _VELOCIDAD_ / Dist ( Vec Posicion del Objetivo , Vec Posicion Inicial )

Donde _VELOCIDAD_ es el nombre de una macro que representa el valor asignado a la velocidad de movimiento, y 'Dist' es una función del motor de juego que calcula la distancia entre dos puntos. Esta es la mejor fórmula que conozco para calcular el desplazamiento del objeto (disparo del enemigo). Después, aplicaremos el vector 'dir'a la matrix del objeto con la función move() (es decir, mover).

[code:1]matrixDisparoEnemigo.move(dir);[/code]

--------------------------------------------------------------------------------------

La barra de energia del jugador esta formada por dos imágenes. Estas imágnes fueron convertidas desde el formato .png al formato .gfx utilizado por el motor de juego mediante la herramienta Converter Tool, que emplea varios formatos de pixel:

DXT3: (compressed, 4-bit nonpremultiplied alpha)
DXT5: (compressed, interpolated nonpremultiplied alpha)
A8R8G8B8: (32 bits per pixel, A: 8, R: 8, G: 8, B: 8 )
X8R8G8B8: (32 bits per pixel, A: x, R: 8, G: 8, B: 8 )
A8: (8 bits per pixel, alpha: 8 )
L8: (8 bits per pixel, luminance:8 )
A8L8: (16 bits per pixel, A: 8, L:8 )

Mas información: http://msdn.microsof...y/bb322854.aspx

La opción MipMap se encuentra establecida inicialmente en el Converter Tool (en la pestaña GFX). Durante la conversión en formato .gfx, he desactivado esta opción y he seleccionado el formato de pixel A8R8G8B8 que guarda la imagen junto al canal alpha.

Deberemos arrastrar y soltar el archivo imagen desde el explorados de windows hasta el Converter Tool. Entonces podremos renderizar la imagen desde el modo RM_BLEND.


Saludos.

  • Ellolo17

  • Midna

  • vida restante: 100%
  • Registrado: 16 nov 2006
  • Mensajes: 6.208
#4

Escrito 11 mayo 2009 - 12:39

Y ahora por arte de magia tus imagenes estan disponibles para ser vistas ;)

Un saludo y gran trabajo.


Este tema ha sido archivado. Esto significa que no puedes responder en este tema.
publicidad