Bienvenidos sean a este post, hoy agregaremos al primer obstaculo en nuestro juego.
En el post de hoy nos centraremos en la modificacion y aplicacion de un «enemigo» para que nuestro juego tenga un Game Over que podamos ver. Para trabajar con esto, necesitamos el codigo que estuvimos trabajando. Sino lo poseen, les dejo un link para descargarlo:
Descarguen el archivo y extraigan el contenido en el PC. Lo unico que deben hacer es revincular a SDL y SDL_Image. Para ello, les recomiendo este post donde comento como hacerlo para SDL y este otro post donde hago lo mismo para SDL_Image. Una vez que este todo funcionando correctamente, podemos continuar.
El primer cambio que haremos sera en el color de fondo de la ventana. Esto es asi porque cuando trabajemos con el estado de Game Over no se vera el cartel. Para evitar esto debemmos cambiar el color de fondo que veniamos utilizando de color blanco a negro y para ello modificar el siguiente bloque dentro de la funcion iniciar en Juego.cpp:
SDL_SetRenderDrawColor(m_pRenderer, 255, 255, 255, 255);
Y lo modificaremos de la siguiente manera:
SDL_SetRenderDrawColor(m_pRenderer, 0, 0, 0, 255);
Con esta modificacion realizada nuestro siguiente paso sera descargar la imagen que contiene la lamina de sprites para nuestro enemigo:
Una vez descargado copienlo dentro de la carpeta assets de nuestro proyecto. Con esto realizado, lo siguiente sera ir a Enemigo.cpp donde modificaremos al constructor de la sigueinte manera:
Enemigo::Enemigo(const CargadorParams* pParams) :
SDLObjetoJuego(pParams) {
m_velocidad.setY(2);
m_velocidad.setX(0.001f);
}
En este caso, incrementamos la velocidad de los ejes X e Y siendo la mas evidente la del eje Y que hara que nuestro enemigo se desplace hacia abajo y hacia arriba (esto lo veremos enseguida) y un muy leve movimiento horizontal. Nuestra siguiente modificacion sera en la funcion actualizar la cual actualmente tiene este codigo:
void Enemigo::actualizar() {
m_posicion.setX(m_posicion.getX() + 1);
m_posicion.setY(m_posicion.getY() + 1);
}
Y lo modificaremos de la siguiente manera:
void Enemigo::actualizar() {
m_frameActual = int(((SDL_GetTicks() / 100) % 6));
if (m_posicion.getY() < 0)
m_velocidad.setY(2);
else if (m_posicion.getY() > 480)
m_velocidad.setY(-2);
SDLObjetoJuego::actualizar();
}
Primero calcularemos el valor del frame actual luego chequearemos si la ubicacion sobre el eje Y es menor a 0 y en caso de ser verdadero establecemos a setY con el valor de 2. De lo contrario, chequeamos si el valor del eje Y es mayor a 480 y en este caso establecemos a setY con un valor negativo para que empiece a ascender a nuestro enemigo. Por ultimo, utilizamos la funcion actualizar de SDLObjetoJuego. Con esto concluimos a nuestra clase Enemigo solo nos resta implementarlo.
Para implementarlo debemos ir a la clase EstadoJugar, en el archivo .cpp modificaremos la funcion enIngreso pero antes veamos el codigo actual:
bool EstadoJugar::enIngreso() {
if (!Elmanejador::instanciar()->cargar("assets/helicoptero.png",
"helicoptero",Eljuego::instanciar()->getRenderer())) {
return false;
}
ObjetoJuego* jugador = new Jugador(new CargadorParams(
100, 100, 128, 55, "helicoptero"));
m_objetosJuego.push_back(jugador);
OutputDebugStringA("Ingresando al Estado de jugar\n");
return true;
}
Y lo modificaremos de la siguiente manera:
bool EstadoJugar::enIngreso() {
if (!Elmanejador::instanciar()->cargar("assets/helicoptero.png",
"helicoptero",Eljuego::instanciar()->getRenderer())) {
return false;
}
if (!Elmanejador::instanciar()->cargar("assets/helicoptero2.png",
"helicotero", Eljuego::instanciar()->getRenderer())) {
return false;
}
ObjetoJuego* jugador = new Jugador(new CargadorParams(
500, 100, 128, 55, "helicoptero"));
ObjetoJuego* enemigo = new Enemigo(new CargadorParams(
100, 100, 128, 55, "helicotero"));
m_objetosJuego.push_back(jugador);
m_objetosJuego.push_back(enemigo);
OutputDebugStringA("Ingresando al Estado de jugar\n");
return true;
}
Tecnicamente son muy parecidas pero para esta ocasion modificamos la posicion de la creacion de nuestro jugador. Cuando creamos el objeto jugador, lo siguiente sera verificar si existe el asset que descargamos al principio y en caso de no existir devuelve un false, siendo este el condicional que vinimos usando hasta ahora para nuestros assets en posts anteriores. Lo siguiente que hicimos fue crear el objeto enemigo tal como el del jugador y por ultimo agregamos el nuevo objeto en la coleccion m_objetosJuego. Con estas modificaciones realizadas podemos pasar a compilar y probar su funcionamiento mediante el siguiente video
Hasta aqui tenemos un enemigo en nuestro juego y a nuestro jugador pero en el proximo post agregaremos el impacto y el Game Over!
En resumen, hoy hemos visto como implementar nuestro enemigo en un juego, hemos agregado el asset, tambien hemos visto las pequeñas modificaciones que debimos realizar sobre las clases existentes para finalmente implementarla en el juego, en el proximo post veremos el impacto entre dos sprites y el ultimo estado de un juego. Espero les haya sido de utilidad y les dejo un link a GitHub donde estan los codigos creados hoy:
Les dejo algunas de mis redes sociales para seguirme o recibir una notificacion cada vez que subo un nuevo post:


Donación
Es para mantenimento del sitio, gracias!
$1.50





