Gracias Gracias:  0
Resultados 1 al 4 de 4

Tema: DEMO en curso ESENTHEL

  1. #1
    Miembro
    Fecha de ingreso
    Jan 2009
    Ubicación
    Alicante/España
    Mensajes
    40

    DEMO en curso. ESENTHEL

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

    Demostración

    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

    DEMO en curso  ESENTHEL-captura1c.png

    Tareas pendientes de realizar:

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

    El código ya funciona con los elementos básicos del juego.

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

    Saludos.

    Información sobre el motor de juego: http://www.foro3d.com/f113/esenthel-...ión-70205.html
    Archivos adjuntados Archivos adjuntados
    Última edición por 3dpoder; 28-11-2011 a las 15:13 Razón: Adjuntar las imágenes al foro

  2. #2
    Senior Member Avatar de pigo0019
    Fecha de ingreso
    May 2007
    Ubicación
    Mexico
    Mensajes
    2,616

    Respuesta: DEMO en curso. ESENTHEL

    Muchas gracias por el codigo. de inmediato le echaré un vistaso. te dejo un saludo desde Mexico.
    -------------------------------------------------
    Todo lo que hagamos hoy tiene eco en la eternidad
    -------------------------------------------------

  3. #3
    Miembro
    Fecha de ingreso
    Jan 2009
    Ubicación
    Alicante/España
    Mensajes
    40

    Respuesta: DEMO en curso. ESENTHEL

    Saludos,

    DEMO en curso  ESENTHEL-captura1z.png

    Este es el código de lo que sería el menú 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 configuración establecida.

    Código:
    /******************************************************************************/
    #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.x<PosicionTexto[i][2])&&(pos.y<PosicionTexto[i][1])&&(pos.y>PosicionTexto[i][3])) indiceMenu=i+1;
     break;
     }
     case 2 : {
     FREP(3) if ((pos.x>PosicionTexto[i+3][0])&&(pos.x<PosicionTexto[i+3][2])&&(pos.y<PosicionTexto[i+3][1])&&(pos.y>PosicionTexto[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); 
    }
    /******************************************************************************/
    Última edición por 3dpoder; 28-11-2011 a las 15:08 Razón: Adjuntar las imágenes al foro

  4. #4
    Miembro
    Fecha de ingreso
    Jan 2009
    Ubicación
    Alicante/España
    Mensajes
    40

    Respuesta: DEMO en curso. ESENTHEL

    Nuevo código DEMO en curso.

    http://www.speedyshare.com/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 dinamica)
    - Añadida pequeña interfaz de juego
    - Musica y sonido
    - Mejorado código, simplificando procesos del juego y reduciendo el número de variables utilizadas.

    DEMO en curso  ESENTHEL-capturaz.png

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

    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 áreas 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 area.

    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:

    Código:
    // Archivos de cabecera
    
    #include ....
    
    // Definir nombre de macros
    
    #define ...
    
    // Variables globales
    
    .
    
    // DECLARACION de Estructuras o Clases. Tu puedes crear copias durante este proceso (memoria estatica)
    
    .
    
    // Crear copias de estructuras/clases (memoria estatica) o Crear Contenedores de Memoria (nodos) de estructuras/clases del juego (memoria dinamica)
    
    .
    
    // 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 estatica}
     // void Shut {}
     // Bool Main { Aquí, creamos y eliminamos las copias de estructuras/clases que utilizan memoria dinámica (contenedores de memoria) }
     // void Draw() {}
    Para crear contenedores de memoria, he utilizado el contenedor de tipo Memx.

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

    VENTAJAS:
    Rapido (ligeramente más lento que Memb)
    Baja fragmentación de memoria
    Rapido acceso a i-th elemento (nodos)
    Calculo 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:

    Código:
    Memx <TipodeDato> NombreContenedor;
    Crear nuevo nodo con la función New(). También, añadimos el nombre de la función constructora (en este caso activar ());

    Código:
    NombreContenedor.New().activar();
    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.

    Código:
    REPA (NombreContenedor) {
    
     NombreContenedor[i].actualizar();
     if (NombreContenedor[i].Inactivo) NombreContenedor.removeValid(i);
    }
    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())

    Código:
    REPA (NombreContenedor) {
    
     NombreContenedor[i].dibujar();
    }
    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.

    Código:
     NombreContenedor.clear();
    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).

    Código:
    matrixDisparoEnemigo.move(dir);
    --------------------------------------------------------------------------------------

    La barra de energia del jugador esta formada por dos imágenes. Estas imagnes 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 )

    Más información: http://msdn.microsoft.com/en-us/library/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.
    Última edición por 3dpoder; 28-11-2011 a las 15:14

Temas similares

  1. Ofertas de Trabajo Cambio curso de animacion por curso de modelado
    Por haddock en el foro Colaboraciones e Iniciativas
    Respuestas: 0
    Último mensaje: 30-01-2012, 16:33
  2. aYUDa CURSO 3D Studio Max 2010 Curso certificado por autodesk
    Por blendermanu en el foro Educacion 3D, escuelas y universidades
    Respuestas: 2
    Último mensaje: 02-12-2009, 20:25
  3. ESENTHEL ENGINE Presentacion
    Por IsGreen en el foro Videojuegos
    Respuestas: 1
    Último mensaje: 18-02-2009, 23:26
  4. Nueva Demo
    Por Hid! en el foro Demoreel
    Respuestas: 8
    Último mensaje: 18-03-2008, 11:22
  5. demo 3d Max 5 0
    Por zuko10 en el foro Problemas con Programas
    Respuestas: 7
    Último mensaje: 25-06-2005, 22:46

Actualmente estos son sus permisos de publicación en el foro.

  • -No puedes crear nuevos temas al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes responder temas al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes subir archivos adjuntos al no estar registrado o no haber iniciado sesión en el foro.
  • -No puedes editar tus mensajes al no estar registrado o no haber iniciado sesión en el foro.
  •