131 lines
4.2 KiB
C++
131 lines
4.2 KiB
C++
/*
|
|
This source code copyrighted by JailDesigner (2020)
|
|
started on Castalla 15-07-2020.
|
|
Using some sample source code from Lazy Foo' Productions
|
|
*/
|
|
|
|
/*Descripción del enfoque utilizado para crear el juego.
|
|
|
|
El programa contine una serie de clases/objetos básicos: la clase sprite
|
|
permite dibujar partes de un fichero png en pantalla. La clase AnimatedSprite
|
|
contiene funcionalidad adicional para crear animaciones. La clase text permite
|
|
dibujar letras de un png en pantalla a partir de una cadena de texto. La clase
|
|
menu permite crear una estructura con diferentes elementos, escribirlos en
|
|
pantalla y seleccionar uno de ellos.
|
|
|
|
A continuación tenemos las clases enfocadas a la lógica del juego, la clase player
|
|
contiene la información del jugador, la clase balloon la de los enemigos y la
|
|
clase bullet para las balas que dispara el jugador. La clase background es
|
|
muy simple y sirve para pintar el fondo de la pantalla. Por ultimo, la clase
|
|
gamedirector es la que realiza toda la lógica y se encarga de hacer interactuar
|
|
al resto de objetos entre si.
|
|
|
|
El objeto gamedirector tiene tres estados: titulo, juego y pausa. Segun su estado
|
|
el bucle que recorre es distinto. En el bucle juego, el objeto gamedirector
|
|
tiene un objeto jugador, un vector con los objetos globo y un vector con los
|
|
objetos bala. Se encarga de comprobar las entradas de teclado o gamepad para
|
|
cerrar la aplicacion, saltar al estado de pausa y para mover al jugador. Recorre
|
|
el vector de globos y de balas y si tienen algun tipo asignado las gestiona.
|
|
Comprueba las colisiones entre los globos y el jugador y entre las balas y los
|
|
globos. Tiene ademas un nivel de amenaza que calcula en funcion del numero de globos
|
|
en pantalla y que se va incrementando conforme aumenta la puntuación del jugador.
|
|
|
|
Los objetos globo tienen varios contadores para alternar de un estado a otro.
|
|
|
|
En los vectores que contienen objetos, se considera activos los objetos que tienen
|
|
un tipo asociado diferente a NO_KIND
|
|
*/
|
|
|
|
#include "ifdefs.h"
|
|
#include <time.h>
|
|
#include <stdio.h>
|
|
#include <string>
|
|
#include "const.h"
|
|
#include "gamedirector.h"
|
|
|
|
int main(int argc, char *args[])
|
|
{
|
|
// Inicia el generador de numeros aleatorios
|
|
srand(time(nullptr));
|
|
|
|
// Crea el objeto gameDirector
|
|
GameDirector *gameDirector = new GameDirector();
|
|
|
|
// Establece el valor de la variable con el path del ejecutable
|
|
gameDirector->setExecutablePath(args[0]);
|
|
|
|
// Inicializa la lista de ficheros
|
|
gameDirector->setFileList();
|
|
|
|
// Comprueba que existen todos los ficheros
|
|
if (!gameDirector->checkFileList())
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
// Arranca SDL y crea la ventana
|
|
if (!gameDirector->initSDL())
|
|
{
|
|
printf("Failed to initialize!\n");
|
|
return -1;
|
|
}
|
|
else
|
|
{
|
|
// Carga los recursos
|
|
if (!gameDirector->loadMedia(GAME_STATE_INIT))
|
|
{
|
|
printf("Failed to load media!\n");
|
|
}
|
|
else
|
|
{
|
|
// Inicializa el objeto gameDirector
|
|
gameDirector->init(false);
|
|
printf("Starting the game...\n\n");
|
|
|
|
// Mientras no se quiera salir del juego
|
|
while (!(gameDirector->getGameStatus() == GAME_STATE_QUIT))
|
|
{
|
|
switch (gameDirector->getGameStatus())
|
|
{
|
|
case GAME_STATE_LOGO:
|
|
gameDirector->loadMedia(GAME_STATE_LOGO);
|
|
gameDirector->runLogo();
|
|
gameDirector->unLoadMedia(GAME_STATE_LOGO);
|
|
break;
|
|
case GAME_STATE_INTRO:
|
|
gameDirector->loadMedia(GAME_STATE_INTRO);
|
|
gameDirector->runIntro();
|
|
gameDirector->unLoadMedia(GAME_STATE_INTRO);
|
|
break;
|
|
case GAME_STATE_TITLE:
|
|
gameDirector->loadMedia(GAME_STATE_TITLE);
|
|
gameDirector->runTitle();
|
|
gameDirector->unLoadMedia(GAME_STATE_TITLE);
|
|
break;
|
|
case GAME_STATE_PLAYING:
|
|
gameDirector->loadMedia(GAME_STATE_PLAYING);
|
|
gameDirector->runGame();
|
|
gameDirector->unLoadMedia(GAME_STATE_PLAYING);
|
|
break;
|
|
case GAME_STATE_GAME_OVER_SCREEN:
|
|
gameDirector->loadMedia(GAME_STATE_GAME_OVER_SCREEN);
|
|
gameDirector->runGameOverScreen();
|
|
gameDirector->unLoadMedia(GAME_STATE_GAME_OVER_SCREEN);
|
|
break;
|
|
case GAME_STATE_INSTRUCTIONS:
|
|
gameDirector->loadMedia(GAME_STATE_INSTRUCTIONS);
|
|
gameDirector->runInstructions();
|
|
gameDirector->unLoadMedia(GAME_STATE_INSTRUCTIONS);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Libera todos los recursos y cierra SDL
|
|
delete gameDirector;
|
|
printf("Shutting down the game...\n");
|
|
|
|
return 0;
|
|
}
|
|
}
|