lunes, 17 de junio de 2013

Proyecto RType


1. Introducción


Bueno este proyecto fue una práctica que realice para la universidad y bueno me pareció interesante publicarlo en la web. En esta documento se describe como plantee la práctica y como la implemente. La práctica está basada en el juego RType de la década de los 90s y está desarrollada usando el lenguaje de programación Java.

2. Requisitos del proyecto

A continuación se describen los requisitos que fueron solicitados para la realización del proyecto:
  1. El juego comenzará con una pantalla de bienvenida a partir de la cual se podrá seleccionar el modo de juego (FACIL, NORMAL, COMPLICADO, IMPOSIBLE) y comenzar a jugar.
  2. El juego constará de un único nivel donde el jugador deberá acabar con una horda de naves alienígenas. El número de alienígenas con los que acabar dependerá del modo de juego seleccionado. Fácil=10, Normal=15, Complicado=20, Imposible=30.
  3. El jugador controlará la nave aliada y dispondrá de 1 sola vida.
  4. Las naves alienígenas serán controladas por el ordenador.
  5. Las naves alienígenas no disparan.
  6. No hay que implementar relieve. Es decir, no hay que mostrar ningún tipo de suelo o techo como en el juego original.
  7. La nave aliada podrá moverse arriba (Tecla Q), abajo (Tecla A), izquierda (Tecla O) y derecha (Tecla P). Así mismo podrá disparar su laser utilizando la tecla ESPACIO.
  8. El área de movimiento permitido para la nave será toda la pantalla, aunque habrá que comprobar que la nave no salga de estos límites.
  9. El disparo que realiza la nave aliada es continuo, es decir, no es necesario esperar a que el misil disparado abandone la pantalla para que la nave aliada pueda volver a disparar.
  10. La nave aliada sólo puede realizar un tipo de disparo que se desplazará horizontalmente hacia la derecha de la pantalla, sin variar su trayectoria y a velocidad constante.
  11. Las naves alienígenas se mueven a velocidad constante y podrán ser de dos tipos:
    1. a. Nave Alienígena Tipo A. Aparecen por la parte derecha de la pantalla y se mueven horizontalmente hacia la izquierda a velocidad constante sin variar su trayectoria, es decir, su coordenada “y” no varia en todo el desplazamiento.
    2. b. Nave alienígena Tipo B. Aparecen por la parte derecha de la pantalla y se mueven horizontalmente hacia la izquierda a velocidad constante. La principal diferencia con las Naves de Tipo A es que éstas pueden variar su trayectoria, es decir, en su desplazamiento horizontal pueden variar su coordenada “y” de manera aleatoria.
  12. La velocidad a la que se mueven las naves alienígenas dependerá del modo de juego seleccionado. Todas las naves se mueven a la misma velocidad.
  13. Cuando las naves alienígenas alcancen la parte izquierda de la pantalla volverán a aparecer por la parte derecha de ésta.
  14. Se deberán de detectar dos tipos de colisiones.
    1. a. Las colisiones entre la nave aliada y las naves alienígenas, lo que supondrá el final del juego.
    2. b. Las colisiones entre los misiles disparados por la nave aliada y las naves alienígenas, lo que supondrá la destrucción de la nave alienígena contra la que ha chocado el misil.
  15. Si el jugador finaliza el nivel del juego deberá aparecer un mensaje de felicitación y se volvería a mostrar el menú inicial.
3. Análisis

El modelado del proyecto se ha llevado siguiendo los videos de la página de Web de la asignatura. En dichos videos se seguía el modelo vista controlador. En dicho modelo existe una clase que será la encargada de controlar los objetos que aparecen y cómo interactúan en entre ellos. Por tanto se podría decir que dicha clase se encuentra la mayoría de la lógica de la aplicación.
Por ello he divido el proyecto en 3 paquetes:

Principal: en esta paquete esta las clases existen dos clases una que es la encarga de ser el punto de inicio de la aplicación (Main()) y otra llamada Global que contiene las variables globales que se usan dentro de la aplicación.
Controlador: en esta paquete se encuentra la clase para controlar la vista es decir las interacciones éntrelos objetos que se encuentra en el paquete modelo.
Modelo: en este paquete se definen los objetos que se van utiliza desde la el controlador de la vista.
Img: este paquete contiene los recursos de las imágenes que se utilizan en el modelado de los objetos.

4. Diagrama de Clases

Paquete: Principal

Paquete: Modelo

Paquete: Controlador


5. Definición de Clases

  1. RType: Es la clase principal y de inicio de la aplicación es la encargada de crear la ventana principal y de iniciar los objetos principales.
  2. Global: Esta clase lo utilizo para almacenar todas las variables que se usan desde otros puntos de la aplicación y para no tener que volver almacenar estos valores lo he metido en esta clase global.
  3. Controlador_vista: Esta clase es una de las más grandes del proyecto si el proyecto siguiera creciendo tendría que dividirla pero ahora mismo tampoco tiene un tamaño muy muy grande. Se encarga de la lógica de los modelos que se utilizan en la aplicación. Control de colisiones y controlado el estado del juego etc...
    1. Definición de métodos:
    2. Comprueba_Existen_Enemigos: Procedimiento para comprobar si se han eliminado todos los enemigos.
    3. MoverFondo: Procedimiento para mover el fondo cuando este activado.
    4. MoverNaveAliadaYMisiles: Procedimiento encargado de mover la nave aliada y sus misiles.
    5. MoverNavesEnemigas: Procedimiento encargado de mover las naves enemigas.
    6. Paint: Método paint general.
    7. pintarFondo: Pintar Fondo Animado.
    8. pintarResumePartida: Procedimiento para pintar el fin de la partida.
    9. pintarMenu: Procedimiento encargado de pintar el Menú del Juego.
    10. pintarNaveAli: Pinta la nave aliada en la pantalla.
    11. pintarMisiles: Pinta los misiles en la pantalla.
    12. pintarNavesEnemiga: Procedimiento encargado de pintar las naves.
    13. ReiniciarPartida: Procedimiento para reiniciar todos los parámetros para comenzar la partida.
    14. Comprueba_Colisiones: Comprueba todas las colisiones.
    15. NaveAli_vs_NaveEnemiga: Procedimiento Comprueba colisiones entre las naves enemigas y la nave aliada.
    16. NaveEnemiga_vs_Misil: Procedimiento Comprueba las colisiones entre los misiles y las naves enemigas.
  4. ResumenFinal: Esta clase contiene la definición del objeto que se muestra a la ahora de termina la partida y se muestra un resumen de si el jugador a periodo o ganado.
    1. Definición de métodos:
    2. setMostrar: Procedimiento para modificar si se debe modificar el mensaje. Para conseguir el efecto de parpadeo.
    3. getMostrar: Función para obtener si se debe mostrar o no el mensaje de aviso.
    4. setVictoria: Procedimiento para definir qué mensaje principal aparece el de victoria. victoria = true => Jugador gano y victoria = false => Jugador perdió.
    5. getImg: Función que devuelve la imagen de la imagen principal.
    6. getImgMensaje: Función que devuelve la imagen del mensaje de aviso.
  5. FondoMovil: En esta clase se define el objeto que se encarga de animar el fondo de la aplicación, moverlo, etc…
    1. Definición de métodos:
    2. getX: Función que devuelve la coordenada x de fondo.
    3. Move: Procedimiento que desplaza el fondo a la izquierda.
    4. getImg: Función que devuelve la imagen de fondo.
  6. Menu: Define como es el menú principal que se muestra al iniciar la aplicación.
    1. Definición de métodos:
    2. getImgFacil: Función que devuelve la img de fácil.
    3. getImgNormal: Función que devuelve la img de normal.
    4. getImgComplicado: Función que devuelve la img de complicado.
    5. getImgImposible: Función que devuelve la img de imposible.
  7. Nave:Esta clase define los atributos que tiene que tener los objetos nave. Y es la clase padre para las clases NaveAliada y NaveEnemiga.
    1. Definición de métodos:
    2. getX:Función que devuelve la coordenada x del objeto nave.
    3. getY:Función que devuelve la coordenada y del objeto nave.
  8. NaveAliada: Hereda de la clase Nave y define el comportamiento y los atributos de la nave aliada es decir la de jugador.
    1. Definición de métodos:
    2. getMisils: Función que devuelve una colección de misiles.
    3. disparar: Procedimiento: que se encarga de aplicar la lógica del disparo.
    4. Move: Procedimiento que se encarga de mover la nave.
    5. getBounds: Función que devuelve un triángulo con las coordenadas de la nave.
    6. getImgNave: Función que devuelve la imagen de la nave.
  9. NaveEnemiga: Esta clase también hereda de la clase Nave y define también el comportamiento y atributos pero esta vez de la nave enemiga. En dicha clase ya se realiza la distinción entre clase de enemigo tipo A y B.
    1. Definición de métodos:
    2. Move: Procedimiento que mueve a todas las naves enemigas.
    3. getImgNave: Función que devuelvo la imagen de la nave enemiga.
    4. existeSolape: Función que devuelve si existe un choque entre las propias naves enemigas.
    5. getBounds: Función que devuelve perímetro del objeto.
    6. setEstado: Procedimiento para modificar el estado de la nave enemiga.
    7. getEstado: Función que devuelvo el estado de la nave enemiga.
  10. Misil: Contiene la definición para el objeto misil que un objeto que forma parte de clase NaveAliada.
    1. Definición de métodos:
    2. getImage: Función que devuelve la imagen del misil.
    3. getX: Función que devuelvo la coordenada x del misil.
    4. getY: Función que devuelve la coordenada y del misil.
    5. esVisible: Función que devuelve si el misil es visible es decir si está activo.
    6. setVisible: Procedimiento para modificar la propiedad de visible.
    7. move: Procedimiento para mover el misil.
    8. getBounds: Función que devuelve un triángulo creado con las coordenadas de la nave.

Capturas

Menú de inicio

Jugando

Fin partida

Video


No hay comentarios:

Publicar un comentario