Aspectos del motor

Estado y evolución del proyecto.

Aspectos del motor

Notapor Jorge » Mié Ago 15, 2007 02:52

Con una imagen es difícil verlo, pero quería comentaros que ahora las salas dobles y triples pasar a ser una sala grande que al llegar a un punto empiezan a desplazarse manteniendo al jugador en el centro de la pantalla.

También podéis ver la sombra que proyecta Head mientras cae.

Imagen

Chulos los gráficos ¿verdad? Ciertamente, no descarto sacar una versión 1.0 con estos gráficos a 640x480, con un par de melodías, las notas musicales de cambio de sala (que también estarán en la nueva, Octavio) y sin vídeo. Más que nada como tributo a Davit que se lo merece. Sé muy bien que sin él jamás me hubiera embarcado en esta aventura. De paso también podrías ir probando el juego, mientras yo continuo con el trabajo para la nueva versión. El motor isométrico será el mismo, claro. Así que probada una, probada al 90% la otra.

La versión con gráficos renderizados a 1024x768 será la 1.5 (este numerillo ya lo tenía decidido, porque los cambios con respecto a la v0.67 serán brutales).
Avatar de Usuario
Jorge
Administrador
Administrador
 
Mensajes: 1563
Registrado: Vie Ago 10, 2007 17:30
Ubicación: Valdepeñas

Notapor Bergil » Lun Ago 20, 2007 20:34

Yupiiii :D Por fin una nueva descarga... :D :D :D
Avatar de Usuario
Bergil
Moderador
Moderador
 
Mensajes: 2116
Registrado: Vie Ago 10, 2007 20:14
Ubicación: Madrid, Villa y Corte

Notapor Lenko » Mar Sep 18, 2007 00:43

Antes de nada me alegro de que te hayas embarcado de nuevo en el proyecto que algunos seguimos desde hace tantos años.

Sobre la versión 1.0... yo creo que es de justicia que la saques ya que los gráficos de Davit son absolutamente geniales, una maravilla del pixel-art que no puede quedar abandonada.
Avatar de Usuario
Lenko
Aprendiz
Aprendiz
 
Mensajes: 2
Registrado: Mar Sep 18, 2007 00:35

Notapor Jorge » Mar Sep 18, 2007 09:39

Hola Lenko. Bienvenido de nuevo a este foro. Me alegre mucho tenerte por aquí. :)

No os quepa la menor duda a ninguna que la principal razón para sacar esta versión 1.0, como muy bien dice Lenko, es que sería muy injusto y también triste dejar olvidados los gráficos de Davit; que aparte de su genialidad, sé muy bien lo mucho, muchísimo, que trabajó en ellos.
Avatar de Usuario
Jorge
Administrador
Administrador
 
Mensajes: 1563
Registrado: Vie Ago 10, 2007 17:30
Ubicación: Valdepeñas

Notapor Bergil » Mar Sep 18, 2007 12:42

O sea, que como entrante para el plato fuerte, le haremos los honores merecidos.
Avatar de Usuario
Bergil
Moderador
Moderador
 
Mensajes: 2116
Registrado: Vie Ago 10, 2007 20:14
Ubicación: Madrid, Villa y Corte

Notapor Jorge » Mar Sep 18, 2007 12:57

¡Exacto! :wink:
Avatar de Usuario
Jorge
Administrador
Administrador
 
Mensajes: 1563
Registrado: Vie Ago 10, 2007 17:30
Ubicación: Valdepeñas

Notapor Bergil » Mar Sep 18, 2007 13:35

Yum!
Slurp!
Ñam ñam!
Y demás onomatopeyas manducatorias :lol:
Avatar de Usuario
Bergil
Moderador
Moderador
 
Mensajes: 2116
Registrado: Vie Ago 10, 2007 20:14
Ubicación: Madrid, Villa y Corte

Notapor linutux » Mar Sep 18, 2007 23:15

Bergil escribió:O sea, que como entrante para el plato fuerte, le haremos los honores merecidos.


Yo ya estoy poniendo la vajilla buena :D
Avatar de Usuario
linutux
Héroe
Héroe
 
Mensajes: 332
Registrado: Mié Ago 15, 2007 23:47

Notapor Jorge » Mar Sep 18, 2007 23:37

Ja, ja, ja. Espero que el menú acompañe.
Avatar de Usuario
Jorge
Administrador
Administrador
 
Mensajes: 1563
Registrado: Vie Ago 10, 2007 17:30
Ubicación: Valdepeñas

Notapor Bergil » Mié Sep 19, 2007 01:17

Y la cubertería de plata... :)
Y la cristalería de Bohemia... :D
Avatar de Usuario
Bergil
Moderador
Moderador
 
Mensajes: 2116
Registrado: Vie Ago 10, 2007 20:14
Ubicación: Madrid, Villa y Corte

Notapor linutux » Lun Oct 15, 2007 23:51

Jorge como esto está muy parado porque no nos cuentas que es lo que estas haciendo para que :babas: un rato pensando en el juego que estas haciendo.
Avatar de Usuario
linutux
Héroe
Héroe
 
Mensajes: 332
Registrado: Mié Ago 15, 2007 23:47

Notapor Bergil » Mar Oct 16, 2007 02:44

Eso, porfaporfaporfaaaaa :worthy:
Avatar de Usuario
Bergil
Moderador
Moderador
 
Mensajes: 2116
Registrado: Vie Ago 10, 2007 20:14
Ubicación: Madrid, Villa y Corte

Notapor Xavi » Mar Oct 16, 2007 20:31

Me apunto a la petición.
Avatar de Usuario
Xavi
Emperador
Emperador
 
Mensajes: 723
Registrado: Vie Ago 10, 2007 17:30
Ubicación: Barcelona

Notapor Jorge » Mar Oct 16, 2007 20:47

Vale, os cuento. :) Antes de ponerme a terminar las cosas que hay pendientes, me vi en la obligación de cambiar el analizador sintáctico XML que emplea el juego para leer los archivos de datos. Tuve que hacerlo porque aunque en la versión Linux no había problemas, me las veía moradas para compilar en Windows la biblioteca libxml++. Terminé tan harto que pensé en buscar otra alternativa...

Y la encontré: ahora uso el analizador XSD de CodeSynthesis. Una auténtica virguería que construye clases C++ a partir de un esquema XSD. Os pongo el esquema para definir los elementos del juego:

Código: Seleccionar todo
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="items" type="ItemsXML"/>
  <xsd:complexType name="ItemsXML">
    <xsd:sequence>
      <xsd:element name="item" maxOccurs="unbounded">
        <xsd:complexType>
          <xsd:sequence>
            <xsd:element name="door" minOccurs="0">
              <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                  <xsd:enumeration value="north"/>
                  <xsd:enumeration value="south"/>
                  <xsd:enumeration value="east"/>
                  <xsd:enumeration value="west"/>
                </xsd:restriction>
              </xsd:simpleType>
            </xsd:element>
            <xsd:element name="widthX" type="xsd:int" maxOccurs="3"/>
            <xsd:element name="widthY" type="xsd:int" maxOccurs="3"/>
            <xsd:element name="height" type="xsd:int" maxOccurs="3"/>
            <xsd:element name="directionFrames" type="xsd:byte"/>
            <xsd:element name="mortal" type="xsd:boolean"/>
            <xsd:element name="weight" type="xsd:double"/>
            <xsd:element name="framesDelay" type="xsd:double"/>
            <xsd:element name="speed" type="xsd:double"/>
            <xsd:element name="bitmap">
              <xsd:complexType>
                <xsd:sequence>
                  <xsd:element name="frameWidth" type="xsd:int"/>
                  <xsd:element name="frameHeight" type="xsd:int"/>
                 </xsd:sequence>
                 <xsd:attribute name="file" type="xsd:string" use="required"/>
              </xsd:complexType>
            </xsd:element>
            <xsd:element name="shadow" minOccurs="0">
              <xsd:complexType>
                <xsd:sequence>
                  <xsd:element name="shadowWidth" type="xsd:int"/>
                  <xsd:element name="shadowHeight" type="xsd:int"/>
                 </xsd:sequence>
                 <xsd:attribute name="file" type="xsd:string" use="required"/>
              </xsd:complexType>
            </xsd:element>
          <xsd:element name="extraFrames" type="xsd:int" minOccurs="0"/>
          <xsd:element name="frame" type="xsd:int" maxOccurs="unbounded"/>
          </xsd:sequence>
          <xsd:attribute name="label" type="xsd:short" use="required"/>
        </xsd:complexType>
      </xsd:element>
    </xsd:sequence>
  </xsd:complexType>
</xsd:schema>


Este esquema se usa para validar que la información de los archivos es correcta. El archivo XML de definición de elementos tiene este aspecto:


Código: Seleccionar todo
<?xml version="1.0" encoding="UTF-8"?>

<items xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:noNamespaceSchemaLocation="items.xsd">

  <!-- Brick #1 -->
  <item label="1">
    <widthX>16</widthX>
    <widthY>16</widthY>
    <height>24</height>
    <directionFrames>1</directionFrames>
    <mortal>false</mortal>
    <weight>0.032</weight>
    <framesDelay>0</framesDelay>
    <speed>0</speed>
    <bitmap file="gfx/item/brick1.bmp">
      <frameWidth>64</frameWidth>
      <frameHeight>56</frameHeight>
    </bitmap>
    <shadow file="gfx/item/brick1-shadows.bmp">
      <shadowWidth>64</shadowWidth>
      <shadowHeight>31</shadowHeight>
    </shadow>
    <frame>0</frame>
  </item>
 
  <!-- Vulcano -->
  <item label="2">
    <widthX>16</widthX>
    <widthY>16</widthY>
    <height>24</height>
    <directionFrames>1</directionFrames>
    <mortal>true</mortal>
    <weight>0</weight>
    <framesDelay>0</framesDelay>
    <speed>0</speed>
    <bitmap file="gfx/item/vulcano.bmp">
      <frameWidth>64</frameWidth>
      <frameHeight>56</frameHeight>
    </bitmap>
    <shadow file="gfx/item/vulcano-shadows.bmp">
      <shadowWidth>64</shadowWidth>
      <shadowHeight>31</shadowHeight>
    </shadow>
    <frame>0</frame>
  </item>
  ...
</item>


El analizador, como he dicho, construye una clase que da acceso mediante operaciones de consulta a toda la información contenida de un modo sencillo y limpio. Fantástico. Tiene un problema, que depende del analizador Xerces de la Fundación Apache y aunque viene preparado para compilarlo con las herramientas de Microsoft, al no usarlas, me he visto en la obligación de ver cómo compilarlo para MinGW. No ha sido difícil y ya está hecho. 8)

Por otra parte he querido pulir el código que tenía ya hecho. Diréis que así no se avanza rehaciendo cosas, pero merecerá la pena cuando andemos probando. Además, pensad que el motor debe ser fácilmente ampliable pues lo usaremos para otros proyectos: la versión 1.5, la segunda parte, algún otro remake, quizá.

Hoy he terminado el pulido y estoy muy contento. He aplicado patrones de diseño, concretamente el patrón Constructor, el patrón Mediador y el patrón Compuesto. Un buen diseño orientado a objetos da sus frutos y para muestra un botón:

Estas son las líneas de código del motor isométrico. Cuando hablo de líneas son líneas reales, ni comentarios, ni líneas en blanco, ni delimitadores de ámbito (las llaves), etc:
  • Isomot original (escrito en C): 4200 líneas.
  • Isomot en C++ (antes): 6000 líneas.
  • Isomot en C++ (ahora): 3000 líneas.

Como podéis ver el pulido era más que necesario. El primer diseño aunque funcionaba bien, era bastante malo, con mucho código repetido. Ahora está que da gusto trabajar con él y estoy muy contento. :boing:

Perdonad el ladrillo técnico, pero es en lo que estoy volcado desde hace casi tres semanas.
Avatar de Usuario
Jorge
Administrador
Administrador
 
Mensajes: 1563
Registrado: Vie Ago 10, 2007 17:30
Ubicación: Valdepeñas

Notapor Bergil » Mar Oct 16, 2007 21:13

No, si ha quedado clarísimo :lol: , ¿verdad, Xavi, Linutux?
Ahora, en serio, de la parte de código no pillo de la misa la media, pero de tus comentarios se deduce que el pulimiento de código, aunque no estrictamente imprescindible, resulta indudablemente útil. O, por emplear una expresión que yo suelo usar cuando hablo de informática, el código actual resulta mucho más elegante. Y, por lo tanto, funcionará mejor, precisamente por ser más sencillo.
Para resumir: Chapeau, Jorge! ¡Estamos contigo! Aunque (de momento) no hagamos demasiado... :oops:
Avatar de Usuario
Bergil
Moderador
Moderador
 
Mensajes: 2116
Registrado: Vie Ago 10, 2007 20:14
Ubicación: Madrid, Villa y Corte

Siguiente

Volver a El proyecto

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron