Space Invaders

Este es el segundo entregable para el Curso de Experto en Desarrollo de Videojuegos (6ª Edición) de la UCLM.

En esta ocasión creamos, mediante una estructura dada en C++ con el motor gráfico Ogre 3D, un minijuego basado en el clásico Space Invaders pero dándole un toque 3D.

En cada nivel encontraremos el planeta al que defenderemos en la parte central y tanto los enemigos como nosotros podremos movernos en torno a él girando 365º sobre su eje.

Como en el anterior minijuego la estructura del juego está basada en una máquina de estados que se controla mediante una pila, de esta forma podemos pasar entre los diferentes estados haciendo las correspondientes comprobaciones al entrar y salir de los mismos.

Todos los modelos están creados con Blender, el motor gráfico es Ogre 3D, la entrada de datos se controla con OIS y la interfaz gráfica está realizada con CEGUI. Además hemos incorporado un SkyBox para recrear el espacio.

En este proyecto todo la configuración está controlada mediante XML. Gracias a esto, y sin compilar de nuevo el juego, podemos crear nuevos enemigos, nuevos niveles, añadir música, cambiar valores de daño, vidas, etc… de una forma muy sencilla.

Un ejemplo sería la creación de un nuevo enemigo. Para ello solamente tendríamos que crearlo en Blender, añadirlo al .xml de enemigos e incluirlo en alguna oleada del .xml de niveles.

Aquí podéis ver cómo está configurada la lectura de archivos y los .xml de enemigos y niveles para poder entender el ejemplo anterior. En la parte inferior está en link del repositorio dónde podéis ver todo el proyecto.

<config>
  <options fx="on" music="on"></options>
  <ui fx="main_fx" music="main_music"></ui>
  <load fx="load_fx" music="load_music"></load>
  <xml_paths>
    <path type="Enemy">./data/enemy.xml</path>
    <path type="Fx">./data/fx.xml</path>
    <path type="Level">./data/level.xml</path>
    <path type="Music">./data/music.xml</path>
    <path type="Planet">./data/planet.xml</path>    
    <path type="Player">./data/player.xml</path>    
    <path type="Shield">./data/shield.xml</path>    
    <path type="Shoot">./data/shoot.xml</path>
    <path type="Score">./data/score.xml</path>
  </xml_paths>
</config>
<enemies>
  <enemy index="squid">
    <name>squid</name>
    <mesh>squid.mesh</mesh>
    <life>1.0</life>
    <size>1.0</size>
    <height>0.5</height>
    <length>2.5</length>
    <points>10.0</points>
    <impact_fx>enemy_hit</impact_fx>
    <destroy_fx>enemy_dead</destroy_fx>
    <shoot>enemy_shoot</shoot>
    <shield>none</shield>
  </enemy>
  <enemy index="craby">
    <name>craby</name>
    <mesh>craby.mesh</mesh>
    <life>1.0</life>
    <size>1.0</size>
    <height>0.874</height>
    <length>1.2</length>
    <points>20.0</points>
    <impact_fx>enemy_hit</impact_fx>
    <destroy_fx>enemy_dead</destroy_fx>
    <shoot>enemy_shoot</shoot>
    <shield>none</shield>
  </enemy>
  <enemy index="heady">
    <name>heady</name>
    <mesh>heady.mesh</mesh>
    <life>1.0</life>
    <size>1.0</size>
    <height>2.0</height>
    <length>2.0</length>
    <points>30.0</points>
    <impact_fx>enemy_hit</impact_fx>
    <destroy_fx>enemy_dead</destroy_fx>
    <shoot>enemy_shoot</shoot>
    <shield>none</shield>
  </enemy>
  <enemy index="_ufo_">
    <name>_ufo_</name>
    <mesh>_ufo_.mesh</mesh>
    <life>1.0</life>
    <size>1.0</size>
    <height>2.0</height>
    <length>2.0</length>
    <points>50.0</points>
    <impact_fx>enemy_hit</impact_fx>
    <destroy_fx>enemy_dead</destroy_fx>
    <shoot>enemy_shoot</shoot>
    <shield>none</shield>
  </enemy>
</enemies>
<levels>
  <init>0</init>
  <level index="0" last="0" radio="20.00">
    <music>level_one</music>
    <planet>plnt1</planet>
    <waves>
      <wave index="0" move="classic" speed="2.0" angle="0.0" height="20.0" split="10">
        <enemy number="10">squid</enemy>
        <enemy number="10">craby</enemy>
        <enemy number="10">heady</enemy> 
      </wave>
      <wave index="1" move="circle" speed="7.0" angle="10.0" height="14.0" split="1">
         <enemy number="1">_ufo_</enemy>
      </wave>
    </waves>
  </level>
  <level index="1" last="1" radio="20.00">
    <music>level_two</music>
    <planet>plnt2</planet> 
    <waves>
      <wave index="0" move="classic" speed="2.0" angle="0.0" height="22.0" split="10">
        <enemy number="20">squid</enemy>
        <enemy number="20">craby</enemy>
        <enemy number="20">heady</enemy> 
      </wave>
      <wave index="1" move="circle" speed="7.0" angle="10.0" height="14.0" split="1">
         <enemy number="1">_ufo_</enemy>
      </wave>
      <wave index="2" move="classic" speed="2.0" angle="30.0" height="22.0" split="10">
        <enemy number="20">squid</enemy>
        <enemy number="20">craby</enemy>
        <enemy number="20">heady</enemy> 
      </wave>
      <wave index="3" move="circle" speed="7.0" angle="40.0" height="14.0" split="1">
         <enemy number="1">_ufo_</enemy>
      </wave>
    </waves>
  </level>
</levels>
A %d blogueros les gusta esto: