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

 Me parece una buena idea. De esta forma la configuración de las teclas es mucho más sencilla. Sin embargo, creo que deberías ligarlo a DInput directamente, puesto que al final es lo que utilizaremos.

Otra cosa, ¿porque no en castellano?

Vicente

 Hola,

Citar
¡A ver si os animais, que hay mucho que hacer!  (ole)

he retocado alguna cosa del xml y el gestor de configuracion y como de lo otro no me entero, me he puesto a cacharrear con otro tema que no se si será interesante para el motor: IA. Estoy haciendo clases para manejar automatas finitos (normales y con logica difusa). Cuando los acabe lo postearé todo. Si parece un tema interesante, después seguiré o con búsquedas o con algoritmos genéticos. Que os parece?

Citar
Otra cosa, es posible que C# no sea todo lo rápido que quisiéramos, pero os aseguro que es LO MAS PRODUCTIVO QUE HE VISTO EN MI VIDA. Aunque hay cosas que expondré aquí para que me ayudeis a resolver que no sé cómo se pueden resolver sin los punteros de toda la vida.

A mi me tiene enamorado. Es cómodo, se programa rapidísimo, etc etc. Para mi es una gozada. Venga, un saludo!

Vicente

Haddd

 Hombre, eso ni se pregunta Vicente!! Es realmente interesante todo lo relacionado con juegos, y la IA es algo bastante importante.

¿nadie se anima con los terrenos?

Haddd

 He modificado la estructura del motor para poder "simular" los subsets. Sin embargo NO me funciona, y quizás sea un problema sobre el desconocimiento que tengo a la hora de copiar arrays.  :blink:

Bueno, la idea es que cojo el mesh y un array de int[] donde está la información del atributo.

Para cada atributo:

Genero una nueva tabla de indices donde aparecen sólo aquellas caras que utilizan ese atributo.
Copio TODOS los vértices y sólo los índices que he calculado antes.
Lo añado a una lista.

He puesto todo el código por si alguien puede detectar el problema. También he añadido la clase escena. En principio, Berserker tendrías que intentar adecuar tu código a esta nueva estructura, pero verás que los cambios son mínimos mínimos, y espero que convengas conmigo que también son lógicos :D

También he incluido el importador de Haddd que exporta de MAXScript. Pero todavía no lo he terminado puesto que necesito los subsets. El código es bastante feo, pero es código medianamente legible.

Bajarme lasPruebas


BeRSeRKeR

 No he podido echarle un vistazo aún a lo que dices de los subsets pero he terminado la clase (otro singleton al canto) que encapsula DInput.

Con las pruebas que he hecho parece que funciona bien (teclado y ratón). Lo que no sé es cómo integrarlo en la estructura del motor. He intentado añadir un miembro "input" a la clase Haddd (tal y como tienes el video, texturas, etc) pero no lo he podido hacer funcionar (tampoco le he dedicado mucho tiempo). Así que como es un singleton, allá donde he tenido que utilizarlo, lo he hecho a través de:

Citarif (Input.Instance.KeyPressed(Key.Escape)) ....
if (Input.Instance.MouseButtonPressed(0)) ...
etc

Y así ha funcionado perfectamente. Eso sí, he tenido que modificar (más bien añadir) unas cuantas cosas más para dar cabida a la clase ésta. Por ejemplo, he tenido que añadir un handler al evento Form_Activated para hacer la adquisición (Acquire) tanto del ratón como del teclado. De todas formas, ahí donde he hecho cambios lo he anotado en la parte superior del archivo de código en cuestión.

Lo próximo será crear las clases de cámara y bueno, a ver si le echo un vistazo a lo de los subsets.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

BeRSeRKeR

 Bueno pues ya he desarrollado la clase base de cámara (Camera) con soporte para frustum culling (BBox & BSpheres) y la clase de cámara controlada por el usuario (CameraFirstPerson) a través de teclado y ratón (más adelante habrá que enumerar los dispositivos de entrada para que el usuario escoja uno).  Evidentemente esta clase deriva de la clase base que he mencionado antes. Lo siguiente será crear otra clase pero en esta ocasión será otro tipo de cámara (CameraSelfDriven) que se controlará a sí misma a través de paths exportados de MAX. Esta cámara será perfecta para crear secuencias cinemáticas. Finalmente haré la cámara (CameraTrackball) tipo Maya, MAX, etc, que para un juego no tiene mucha utilidad pero para cosas como editores de partículas, visor de modelos, etc, viene perfecta.

Así que de momento llevo el parser, el wrapper de DInput, las cámaras y el cargador de modelos de Doom III. Seguramente sacaré el código cuando termine las cámaras. Aunque el cargador MD5 me gustaría sacarlo ya terminado, pero para eso necesitaríamos tener una respuesta referente al tema de los subsets.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Haddd

 Bien, ya he resuelto el problema del "simulador" de atributos.

He subido la versión en:

Ultima version

Con esto Berserker, podrás simular sin apenas modificar código las tablas de atributos. Echale un vistazo a la clase CMesh, método Prueba() y el que genera los subsets se llama CrearSubMallas()

Bueno, lo que estás haciendo de la clase cámara es genial. Fíjate que en muy poco tiempo tenemos un buen engine, con efects, carga de .X y MD5 y escenas generadas con un script de MAX. Si Vicente se anima con las AI, quizás otros también se animen a colaborar. Creo que el proyecto está funcionando bastante bien (ole)


Deciros a los que querais colaborar que simplemente lo digais, cojais el código y..¡a trabajar! Si quereis discutir lo que haceis, abrid un post que empiece por
CitarMotor común en C#:

¡Animo a todos!  (ole)

Otra cosa, este fin de semana no podré hacer nada, pero el domingo creo que le podré pegar un estirón. A ver el Lunes ya puedo tener el importador de escenas.

Zaelsius

 A ver si montais un proyecto en SourceForge, con su cvs y tal..  :rolleyes:

donald

 el  .X y MD5 abren la cosa a mucho más que max...

hay muchos grafistas que curran con maya, XSI(yo, y legal :D ), blender(tb yo), character fx(idem), AM,Lightwave, Truespace, Gamespace, etc...

con esos formatos, pueden pasar personajes animados a vuestro engine...

Lástima que tenga yo un spool de cosas más largo que la muralla china...


Me paso por aquí de cuando en cuando (1 vez cada 3 o 4 meses) ...así que si no respondo a algo no es por antipático. ;) Posteo, y me acuerdo del foro tres meses después... ;)    :-S

BeRSeRKeR

 He probado con los modelos de Doom3 el sistema que has creado para crear los subsets y parece funcionar bien.

Ahora estoy terminando la clase CameraSelfDriven que básicamente funciona ya. He probado a exportar una secuencia de cámara del MAX y la he cargado en el motor y funciona bien. Aunque la verdad es que no sé si la conversión de las rotaciones MAX->D3D estará bien. En las pruebas que he hecho parece que sí. Lo ideal sería probarlo con una escena más compleja. ¿Cómo llevas el cargador de escenas?. Estaría bien probarlo con eso.

Una vez que acabe esta cámara supongo que me pondré con la animación de los MD5 que va a tener tela. Más que nada porque no tengo ni idea de cómo funcionan los D3DXMeshes en temas de animación. Pero bueno, será cuestión de echarles un vistazo.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

StraT

 Juas, manda huevos, entre dos personas hacen un motor de la ostia en ¿cuanto? y se quedan tan anchos, porque no currais en Pyros o algo asi? :S

Un saludo
quot;Solo hay dos cosas infinitas, el universo y la estupidez humana, aunque de lo primero no estoy muy seguro\\\" Einstein

ethernet

 o mejor, por qué no montais una empresa en vez de que os contrate una. O incluso mejor por qué no os montais una empresa y codeais un juego en vez del enésimo motor?  

Haddd

 He subido una nueva versión, está como siempre, en el primer post de este mensaje.

Berserker, necesitaría la clase cámara, porque no veas lo mal que va ver si he importado bien un objeto ¡sin poder rotar la cámara! Ya que tu las tienes desarrolladas, prefiero utilizar las tuyas que ponerme con las mías, así que cuando puedas, por favor, súbelas.

He incluido el exportador en MAXScript. Como podreis ver, me parece que el formato es muy sencillo, y espero que la gente se ánime a crear otros conversores a este formato. (ole)

Por cierto, los comentarios que no estén relacionados con el motor, por favor, abrid otro post para que este no se convierta en lo que todos sabemos. Gracias. ;)  

BeRSeRKeR

 Ya puedes bajar las clases Parser, Input, Camera y CameraFirstPerson de aquí.

Tienes que haces algunas cosas para hacer funcionar el cotarro...

Para hacer funciona "Input"

La clase "Input" necesita de un handle al formulario para poder crear el dispositivo del teclado y el ratón (en SetCooperativeLevel). Yo lo que he hecho ha sido declarar una propiedad "handle" (es de tipo System.IntPtr) en la clase "Haddd" de forma que luego, en el método "CreateKeyboard" y "CreateMouse" (en "Input.cs") hago:

Citarkeyboard.SetCooperativeLevel(Haddd.handle, ...

Por supuesto, tienes que inicializar la variable handle. Yo lo he hecho en "Formulario.cs", en el método "Main" he puesto:

Citarusing (Formulario frm = new Formulario())
{
    Haddd.handle = frm.Handle;
    ....
}

Otra cosa que tienes que hacer es crear un método para manejar el evento "Activated" y ahí adquirir los dispositivos de entrada:

Citarprivate void Formulario_Activated(object sender, EventArgs e)
{
    Input.Instance.Acquire();
}

También, en "Haddd.cs", en el método "Finalizar" liberamos "Input":

Citarpublic static void Finalizar()
{
    Input.Instance.Dispose();
    ....
}

Ahora ya sólo queda actualizar el "Input". Para ello, en "Main.cs", en el método "Render" (esto debería estar mejor en un método "Update"), he puesto:

Citarpublic void Render()
{
    if (Haddd.device == null)
        return;

    // Actualizamos el input
    Input.Instance.Update();

    // ¿Salimos de la aplicación?
    if (Input.Instance.KeyPressed(Key.Escape))
        Application.Exit();

    ....
}

Fíjate que además del "Input.Instance.Update()", también compruebo si se ha pulsado la tecla "ESCAPE". Esto es así porque una vez activado DInput, no se manejará el evento "OnKeyPress" del formulario.

Creo que no se me pasa nada...


Para hacer funciona "Camera"

Lo primero que tienes que hacer es declarar el miembro "camaraActiva" - que antes tenías en "Haddd.cs" y en las últimas pruebas en "Escena.cs" - del tipo "Camera" en vez de "Camara".

Ahora tienes que declarar la cámara en "Main.cs":

CitarCameraFirstPerson camara;

En en el método "InitializeGraphics" creas la cámara:

Citarcamara = new CameraFirstPerson(8.0f, 100.0f);
camara.Position = new Vector3(0.0f, 60.0f, -200.0f);
Haddd.camaraActiva = camara;

Como ves, primero se crea la cámara especificando la sensibilidad del ratón y la velocidad de traslación y luego se especifica la posición inicial. También se especifica la nueva cámara como cámara activa. Ten en cuenta que los parámetros velocidad y sensibilidad deberán variar dependiendo de la escala de tu escena. Si la escala es muy pequeña, deberás reducir los valores.

Por último tienes que actualizar la cámara. En el método "Render" (como antes he mencionado, esto debería estar mejor en un método "Update") pones:

CitarHaddd.camaraActiva.Update();


Una última cosa. En la inicialización del dispositivo de render tienes puesto:

CitarpresentParams.BackBufferWidth = 800;
presentParams.BackBufferHeight = 600;

cuando en realidad, las dimensiones de la ventana son 600x600. Lo mejor es que elimines esas dos líneas y Direct3D ya se encargará de crear el backbuffer con el tamaño de la ventana.

Bueno, eso es todo. Si tienes alguna duda, pregunta. :)

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

BeRSeRKeR

 He actualizado una cosilla en la clase Input.

Por cierto, si tengo comentado el código con todo el tema de los tags , , etc, ¿cómo se crearía la documentación del proyecto?. ¿Con el propio Visual C# 2005 Express Edition Beta?.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!






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.