Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Motor Común En C#

Iniciado por Haddd, 16 de Septiembre de 2004, 09:43:27 AM

« anterior - próximo »

Haddd

 Actualizado el 03/10/04 a las 19:49.

Proyecto en VC# Express 2005 Beta

CitarHerramientas GRATUITAS necesarias para utilizar el motor:

Enlace a VStudio Express

DirectX9 SDK Summer Update 2004


CitarUltimos cambios:

Exportador de MAX.
Se ha simulado los submateriales hasta que se resuelva el ¿bug?


CitarActualmente incluye las siguientes clases:

Creación Device
Fuentes
Texturas
Render
Camara
Mallas
Meshes
Importación de archivos .X
Importación de archivos .haddd + Exportador MAX
Apariencia
Carga XML
Effects
Escena

El motor es capaz de renderizar objetos importados en .X con sus propios efectos.


CitarSiguiente Paso:

Iluminación


CitarSe necesita:

Implementar el selector de resoluciones de vídeo, formato del buffer y demás que aparecen en los ejemplos del SDK.
Mejorar el diseño de las clases.

Paralelamente:

Terrenos
Lighmaps
Colisiones
Física
Exportadores
....

Venga, hay para todos. ¡A ver si os animais!

Grugnorr

 [Voy a parecer el profesor cabrón o algo así a este paso  :P ]

Me ha gustado que uses regiones para agrupar código relacionado


       /// <summary>
       /// Definimos las variables de acceso a las clases contenidas
       /// </summary>
       public CInicializar Inicializar;
       public CRender Render;
       public CFuentes Fuentes;
       public CTexturas Texturas;


El comentario ese es comentario de documentación, al generar la documentación (y en el Intellisense  (ole) )te saldrá como descripción general de la variable Inicializar  O_O, los comentarios que pertenecen al código, no a la documentación que sean comentarios "clásicos": //... o /*....*/

No uses variables miembro ("atributos" en POO clásica) públicos. Si lo necesitas publicar al exterior crea una propiedad, si es para uso interno tampoco, claro está.

Nomenclatura Standard C#:
       Clases sin prefijo C. Sólo usar prefijo en interfaces I: Render en vez de CRender por ejemplo.
       camelCasing en variables, tanto de clase como parámetros, PascalCasing para Clases y Métodos.


       ~Video()
       {
           Console.WriteLine("video");
       }


Supongo que el mensaje por Consola es de coña, pero.....       :
         En código manejado, los destructores sólo se usan en una clase que tiene recursos no manejados, y para liberarlos. Los objetos de clases con destructores se gestionan aparte por el recolector y son más costosos. Deberías usar el diseño de implementar IDisposable y... busca en la ayuda del SDK, en index "destructors, and resources"

float zDepth = 1;

1-->int
1.0-->double
1.0f-->float
(juraría yo  :lol: )


           /// <summary>
           /// Limpia el viewport
           /// </summary>
           /// <returns>Siempre devuelve true</returns>
           public bool Clear()
           {
               video.Device().Clear(clearFlags, color, zDepth, stencil);
               return true;
           }


No le veo mucho sentido que un método, que no es virtual, devuelva siempre un valor que no indica nada


public Device Device()
       {
           return Inicializar.device;
       }


Property, plz

El diseño de las clases anidadas, aparte de que mucho mejor una clase por fichero.cs, no lo entiendo. Si quieres agrupar a nivel lógico Inicializar, Render y Video, porqué no un namespace dentro de Hadd?

Lo de CTimer dentro de la clase Entorno es más de lo mismo.

En el diseño yo añadiría varios Manager Singleton para cosas mantener el Device, que supongo que sólo tendrás uno creado y vas guardando referencias en mil sitios, un manager de Texturas para no repetirlas, ordenarlas a la hora de renderizar....

La clase Textura que contiene una referencia a una lista de texturas para poder saber su extensión... :blink:

....
A mi juicio codificas muy rápido pero no diseñas mucho, no es que yo sea Sweeney(me llama más la atención que Carmack  :P ), pero mi estilo es más bien al contrario, piénsalo bien antes y aprende del diseño de otros motores como Ogre, Axiom, Purple#...

PD: Ya tienes deberes para un tiempo  ;)  
hat the hells!

Haddd

 Tengo que usar CRender porque quiero que la variable se llame Render. Como ves, las variables dentro de Video, son para encapsular otras clases, y quería que se notara más que variables son subclases.
En realidad la ventaja de esto es que tengo un objeto que se llama video donde se aglutina toda la información. Pero lo que creo que haré será crer una instacia llamado Haddd que tenga todos las clases:

Haddd motor;

Y tendré:

motor.Video
motor.Render
motor.Texturas

¿qué os parece esta nueva visión?


Respecto a lo de Device, tienes razón, no había caido que ser una Property es mucho más cómodo.

Lo de los Singleton, por favor, ponme un ejemplo, porque estoy buscando la forma de hacerlo y no acabo de verlo claro.

La clase textura tiene una referencia a la clase texturas para poder acceder desde una textura a la clase que hace de "colección." Esto lo hago porque en el futuro, la clase texturas tendrá información general que se utilizará en la clase textura:

class Texturas {
public bool soportaDXT1;
....
};

Entonces en la clase textura, al crear una nueva textura, miraré si soporta DXT1 y ya la comprimo.


Grugnorr

 Singleton en C#, la forma óptima adaptada al entorno .NET, según Microsoft:

Link


Citar
Tengo que usar CRender porque quiero que la variable se llame Render.

Como quieras, con el standard la clase se llamaría Render y la variable render

CitarComo ves, las variables dentro de Video, son para encapsular otras clases, y quería que se notara más que variables son subclases.

Uhm, bienvenido al mundo de como entender un programador a otro cuando no usan la misma terminología  :(  .Las variables dentro de video encapsulan otras clases  :blink:  y quería que se notara más que variables son subclases  :blink: , supongo que en vez de subclase te refieres a clase anidada.

Tengo la impresión que mezclamos el "aspecto lógico" con el "aspecto físico",  evidentemente tendrás una variable de tipo Render dentro de Video(en tu diseño, vamos), lo que ya me disgusta más es una clase pública definida dentro de otra, en el mismo fichero

CitarEn realidad la ventaja de esto es que tengo un objeto que se llama video donde se aglutina toda la información

CitarEn realidad la ventaja de esto es que tengo un objeto que se llama video donde se aglutina toda la información

Uhm, si hablas de objeto, te refieres al código. Para esono tienes porque definir las clases dentro de la implementación de Video.

Tener una clase que englobe toda la aplicación con sus subsistemas es lo lógico, llamarlo Hadd... es egocentrismo  (uoh)



hat the hells!

Vicente

 Hola,

comparto las opiniones de Grugnorr en todos los puntos. Sobre todo en nomenclatura y lo de una clase por fichero (soy un cuadriculado). Respecto a los códigos que has colgado, veo que algunas cosas son de tutos o de algun otro lado no? Porque encuentro cosas en inglés y en español mezcladas... En general, creo que quizás deberíamos ver quienes somos, y antes de liarnos a tirar codigo organizar un poco las cosas (namespaces, que hace cada uno, clases, nomenclaturas, organizacion del curro,...), vamos, por no hacer cada uno la guerra por su parte. Venga, un saludo!

Vicente

P.D.: unos tutos pa mi gusto muy majos de managed directx con c#

http://www.pluralsight.com/craig/articlevi...irectX/Direct3D

Haddd

 Este mensaje sólo es para indicar que se ha actualizado el motor. Todos los cambios los voy manteniendo en el primer post. Por desgracia, no aparece como mensaje nuevo una modificación de un post, así que debo escribir este mensaje para que la gente se de cuenta  <_<  

ethernet

 has pensado en darlo de alta en sourceforge para tener un CVS ?

un saludo y suerte

PD:haddd tu cuantas horas codeas al día ? :)

Haddd

 Creo que es un poco pronto todavía. Quiero ver la respuesta de la gente y luego ya se tomará la decisión.

Codeo poco tiempo, lo que ocurre es que ya lo he escrito tantas veces que me lo sé de memoria. :blink:  

Pogacha

 
Citar// probamos con todas las extensiones
                for (int c = 0; c < extensiones.Length; c++)
                {
                    if(System.IO.File.Exists(path+nombre+extensiones[c]))
                    {
                        pathCompleto=path+nombre+extensiones[c];

                        return true;
                    }


                }

Si hay dos archivos con mismo nombre y dos extenciones distintas te fracasa.
Es mejor, permitir al usuario cual elegir tambien.
Una manera rapida seria agregar "" a extensiones.

o sea
Citarprivate string[] extensiones={ "", ".png",".jpg",".tga",".bmp",".dds" };   // lista de extensiones que queremos probar para cargar la textura

No por molesto ni metiche son solo ganas de ayudar.

Haddd

 Muy buena Pochaga, no se me había ocurrido lo de "".  (ole)

La única pega que le veo es que el programa primero mira si la textura existe, y para comprobarlo utiliza el nombre sin la extensión. No creo que sea mucho pedir que no se utilice el mismo nombre de textura dos veces, pero con extensiones diferentes.

Pero queda dicho y por lo menos lo añadiré al código comentando lo que tu dices.


Haddd

 He vuelto a actualizar el motor. He mejorado las clases un poco y he añadido soporte para carga de archivos .X. Recordad que siempre mantengo el estado actual en el primer mensaje de este post.

C# y Managed DX son la leche. (uoh)  

tewe76

 Perdón por offtopic, pero, ¿cómo haces para modificar un post días después de ser publicado? ¿No se supone que hay un límite de 15 minutos para editar? Supongo que serás webmaster o tendrás contacto directo con ellos...
Perdón de nuevo. Si queréis borrar este post para no ensuciar el thread no me parece mal. Ah, ánimo con el proyecto de todas formas :)
Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

Haddd

 Yo no tengo problemas para hacerlo, y no soy administrador.

Haddd

 He vuelto a actualizar el motor. He mejorado las clases un poco, he añadido una clase de carga en XML de Vicente y he incluido la clase Apariencia, que responde al post de atributos que puse en este mismo foro. Recordad que siempre mantengo el estado actual en el primer mensaje de este post.

Vicente

 Hola,

voy a poner aqui el código del cargador de XML a ver si la gente asi se anima a colaborar ;) He corregido un fallo del cargador de XML (si había dos rutas de XML iguales petaba).

Lo que hace el cargador es bien simple. Si tenemos un XML como este:


<Config>
  <ProfundidadColor>32</ProfunidadColor>
  <Resolucion>
     <Ancho>1024</Ancho>
     <Alto>768</Alto>
  </Resolucion>
</Config>


Se genera una tabla hash como la siguiente (clave - valor, todo son strings):

Config.ProfundidadColor - 32
Config.Resolucion.Ancho - 1024
Config.Resolucion.Alto - 768

El bug era que si teníamos dos rutas iguales, la tabla hash petaba al añadir la segunda (claves repetidas). Ahora si hay dos rutas iguales se agrupan dentro de un arraylist (eso creo, lo tengo que probar un poco más, pero parece que tira ;)).

El código:


using System;
using System.Collections;
using System.Xml;

namespace Utilidades
{
public class ManejadorXml
{
 private ManejadorXml()
 {
 }

 public static void VolcarXmlaHash(Hashtable datos, string nombreXml)
 {
  XmlDocument documento;

  //Cargamos el fichero xml
  documento = new XmlDocument();
  documento.Load(nombreXml);

  //Volcamos los valores del xml en la tabla hash
  CargarNodos(documento, datos, documento.ChildNodes, string.Empty);
 }

 private static void CargarNodos(XmlDocument documento, Hashtable datos, XmlNodeList listaNodos, string ruta)
 {
  string rutaFinal, xPathQuery;
  XmlNodeList resultadoQuery;

  //Para cada nodo de la lista miramos si es raiz o no.
  for (int i=0; i<listaNodos.Count; i++)
  {
   //Es raiz: llamada recursiva aumentado la ruta que necesitamos para llegar al nodo
   if (listaNodos.Item(i).HasChildNodes == true)
    CargarNodos(documento, datos, listaNodos.Item(i).ChildNodes, ruta + listaNodos.Item(i).Name + ".");

   //Es hoja
   else
   {
    //Realizamos una query de xpath para ver si el nodo está repetido en el documento
    rutaFinal = ruta.Substring(0, ruta.Length - 1);
    xPathQuery = rutaFinal.Replace('.', '/');
    resultadoQuery = documento.SelectNodes(xPathQuery);

    //El nodo está repetido, lo guardamos en un arraylist
    if (resultadoQuery.Count > 1)
    {
     //Es el primer nodo repetido, creamos el array de valores
     if (datos[rutaFinal] == null)
      datos.Add(rutaFinal, new ArrayList());

     //Añadimos el valor del nodo a la lista
     ((ArrayList) datos[rutaFinal]).Add(listaNodos.Item(i).InnerText);
    }

    //El nodo es único, lo añadimos
    else
     datos.Add(ruta.Substring(0, ruta.Length - 1), listaNodos.Item(i).InnerText);
   }
  }
 }
}
}


Yo de gráficos cero, pero estas pijadas me encantan ;) Venga, a ver si se anima la gente. Se esperan también críticas al código ;) Un saludo!

Vicente






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.