Empezando con los actores y polimorfismo. Ya pinta la plataforma movil

This commit is contained in:
2022-08-26 13:36:31 +02:00
parent aea71599ff
commit a4000d25db
12 changed files with 120 additions and 108 deletions

View File

@@ -0,0 +1,10 @@
frames_per_row=1
frame_width=16
frame_height=8
[animation]
name=default
speed=8
loop=0
frames=0
[/animation]

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 B

View File

@@ -11,32 +11,21 @@ room_right=02.map
01.tmx 01.tmx
[/tilemap] [/tilemap]
[enemy] [actors]
tileset=walking_eye.png
animation=walking_eye.ani [moving platform]
tileset=moving_platform.png
animation=moving_platform.ani
width=16 width=16
height=16 height=8
x=11 x=9
y=17 y=11
vx=0.3 vx=0.3
vy=0 vy=0
x1=11 x1=9
y1=17 y1=11
x2=15 x2=15
y2=17 y2=11
[/enemy] [/moving platform]
[enemy] [/actors]
tileset=flying_eye_horn.png
animation=flying_eye_horn.ani
width=16
height=16
x=20
y=8
vx=0.7
vy=0
x1=5
y1=8
x2=33
y2=8
[/enemy]

View File

@@ -10,33 +10,3 @@ room_right=0
[tilemap] [tilemap]
02.tmx 02.tmx
[/tilemap] [/tilemap]
[enemy]
tileset=flying_eye.png
animation=flying_eye.ani
width=16
height=16
x=18
y=11
vx=0
vy=0.5
x1=18
y1=11
x2=18
y2=17
[/enemy]
[enemy]
tileset=flying_eye_horn.png
animation=flying_eye_horn.ani
width=16
height=16
x=21
y=11
vx=0
vy=0.7
x1=21
y1=11
x2=21
y2=17
[/enemy]

View File

@@ -2,6 +2,11 @@
#include <fstream> #include <fstream>
#include <sstream> #include <sstream>
// Constructor
Actor::Actor()
{
}
// Constructor // Constructor
Actor::Actor(actor_t actor) Actor::Actor(actor_t actor)
{ {
@@ -23,7 +28,6 @@ Actor::Actor(actor_t actor)
// Inicializa el sprite con el resto de parametros comunes // Inicializa el sprite con el resto de parametros comunes
sprite->setWidth(actor.w); sprite->setWidth(actor.w);
sprite->setHeight(actor.h); sprite->setHeight(actor.h);
sprite->setCurrentAnimation("walk");
sprite->setFlip(actor.vx>0?SDL_FLIP_NONE:SDL_FLIP_HORIZONTAL); sprite->setFlip(actor.vx>0?SDL_FLIP_NONE:SDL_FLIP_HORIZONTAL);
} }

View File

@@ -36,16 +36,17 @@ protected:
public: public:
// Constructor // Constructor
Actor();
Actor(actor_t actor); Actor(actor_t actor);
// Destructor // Destructor
~Actor(); virtual ~Actor();
// Pinta el enemigo en pantalla // Pinta el enemigo en pantalla
void render(); void render();
// Actualiza las variables del objeto // Actualiza las variables del objeto
void update(); virtual void update();
// Obtiene el rectangulo de colision del enemigo // Obtiene el rectangulo de colision del enemigo
SDL_Rect &getCollider(); SDL_Rect &getCollider();

View File

@@ -3,8 +3,10 @@
#include <sstream> #include <sstream>
// Constructor // Constructor
ActorMovingPlatform::ActorMovingPlatform() ActorMovingPlatform::ActorMovingPlatform(actor_t actor, SDL_Point p1, SDL_Point p2) : Actor(actor)
{ {
this->p1 = p1;
this->p2 = p2;
} }
// Destructor // Destructor
@@ -19,14 +21,14 @@ void ActorMovingPlatform::checkPath()
if (sprite->getPosX() > p2.x || sprite->getPosX() < p1.x) if (sprite->getPosX() > p2.x || sprite->getPosX() < p1.x)
{ {
sprite->setVelX(sprite->getVelX() * (-1)); sprite->setVelX(sprite->getVelX() * (-1));
sprite->flip(); //sprite->flip();
} }
// Comprueba los límites verticales // Comprueba los límites verticales
if (sprite->getPosY() > p2.y || sprite->getPosY() < p1.y) if (sprite->getPosY() > p2.y || sprite->getPosY() < p1.y)
{ {
sprite->setVelY(sprite->getVelY() * (-1)); sprite->setVelY(sprite->getVelY() * (-1));
sprite->flip(); //sprite->flip();
} }
} }

View File

@@ -19,7 +19,7 @@ private:
public: public:
// Constructor // Constructor
ActorMovingPlatform(); ActorMovingPlatform(actor_t actor, SDL_Point p1, SDL_Point p2);
// Destructor // Destructor
~ActorMovingPlatform(); ~ActorMovingPlatform();

View File

@@ -65,7 +65,7 @@ public:
bool load(std::string filePath); bool load(std::string filePath);
// Establece la animacion actual // Establece la animacion actual
void setCurrentAnimation(std::string name); void setCurrentAnimation(std::string name = "default");
// Actualiza las variables del objeto // Actualiza las variables del objeto
void update(); void update();

View File

@@ -36,11 +36,11 @@ Map::~Map()
SDL_DestroyTexture(map_texture); SDL_DestroyTexture(map_texture);
for (auto enemy : enemy_list) for (auto actor : actors)
{ {
delete enemy; delete actor;
} }
enemy_list.clear(); actors.clear();
} }
// Carga las variables desde un fichero // Carga las variables desde un fichero
@@ -104,12 +104,44 @@ bool Map::load(std::string file_path)
} while (line != "[/tilemap]"); } while (line != "[/tilemap]");
} }
// Si la linea contiene el texto [enemy] se realiza el proceso de carga de un enemigo // Si la linea contiene el texto [actor] se realiza el proceso de carga de los actores
else if (line == "[enemy]") else if (line == "[actors]")
{ {
enemy_t enemy; do
enemy.asset = asset; {
enemy.renderer = renderer; std::getline(file, line);
if (line == "[moving platform]")
{
actor_t actor;
actor.asset = asset;
actor.renderer = renderer;
SDL_Point p1, p2;
do
{
std::getline(file, line);
// Encuentra la posición del caracter '='
int pos = line.find("=");
// Procesa las dos subcadenas
if (!setActor(&actor, &p1, &p2, line.substr(0, pos), line.substr(pos + 1, line.length())))
{
printf("Warning: file %s\n, unknown parameter \"%s\"\n", filename.c_str(), line.substr(0, pos).c_str());
success = false;
}
} while (line != "[/moving platform]");
printf("actor loaded\n");
actors.push_back(new ActorMovingPlatform(actor, p1, p2));
}
} while (line != "[/actors]");
/*actor_t actor;
actor.asset = asset;
actor.renderer = renderer;
do do
{ {
@@ -118,15 +150,15 @@ bool Map::load(std::string file_path)
// Encuentra la posición del caracter '=' // Encuentra la posición del caracter '='
int pos = line.find("="); int pos = line.find("=");
// Procesa las dos subcadenas // Procesa las dos subcadenas
if (!setEnemy(&enemy, line.substr(0, pos), line.substr(pos + 1, line.length()))) if (!setActor(&actor, line.substr(0, pos), line.substr(pos + 1, line.length())))
{ {
printf("Warning: file %s\n, unknown parameter \"%s\"\n", filename.c_str(), line.substr(0, pos).c_str()); printf("Warning: file %s\n, unknown parameter \"%s\"\n", filename.c_str(), line.substr(0, pos).c_str());
success = false; success = false;
} }
} while (line != "[/enemy]"); } while (line != "[/actor]");
// Añade el enemigo al vector de enemigos // Añade el enemigo al vector de enemigos
enemy_list.push_back(new Enemy(enemy)); actors.push_back(new ActorMovingPlatform(actor));*/
} }
// En caso contrario se parsea el fichero para buscar las variables y los valores // En caso contrario se parsea el fichero para buscar las variables y los valores
@@ -219,60 +251,60 @@ bool Map::setVars(std::string var, std::string value)
} }
// Asigna variables a una estructura enemy_t // Asigna variables a una estructura enemy_t
bool Map::setEnemy(enemy_t *enemy, std::string var, std::string value) bool Map::setActor(actor_t *actor, SDL_Point *p1, SDL_Point *p2, std::string var, std::string value)
{ {
// Indicador de éxito en la asignación // Indicador de éxito en la asignación
bool success = true; bool success = true;
if (var == "tileset") if (var == "tileset")
{ {
enemy->tileset = value; actor->tileset = value;
} }
else if (var == "animation") else if (var == "animation")
{ {
enemy->animation = value; actor->animation = value;
} }
else if (var == "width") else if (var == "width")
{ {
enemy->w = std::stof(value); actor->w = std::stof(value);
} }
else if (var == "height") else if (var == "height")
{ {
enemy->h = std::stof(value); actor->h = std::stof(value);
} }
else if (var == "x") else if (var == "x")
{ {
enemy->x = std::stof(value) * tile_size; actor->x = std::stof(value) * tile_size;
} }
else if (var == "y") else if (var == "y")
{ {
enemy->y = std::stof(value) * tile_size; actor->y = std::stof(value) * tile_size;
} }
else if (var == "vx") else if (var == "vx")
{ {
enemy->vx = std::stof(value); actor->vx = std::stof(value);
} }
else if (var == "vy") else if (var == "vy")
{ {
enemy->vy = std::stof(value); actor->vy = std::stof(value);
} }
else if (var == "x1") else if (var == "x1")
{ {
enemy->p1.x = std::stoi(value) * tile_size; p1->x = std::stoi(value) * tile_size;
} }
else if (var == "x2") else if (var == "x2")
{ {
enemy->p2.x = std::stoi(value) * tile_size; p2->x = std::stoi(value) * tile_size;
} }
else if (var == "y1") else if (var == "y1")
{ {
enemy->p1.y = std::stoi(value) * tile_size; p1->y = std::stoi(value) * tile_size;
} }
else if (var == "y2") else if (var == "y2")
{ {
enemy->p2.y = std::stoi(value) * tile_size; p2->y = std::stoi(value) * tile_size;
} }
else if (var == "[/enemy]") else if (var == "[/moving platform]")
{ {
} }
else else
@@ -343,18 +375,18 @@ void Map::render()
SDL_Rect rect = {0, 0, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT}; SDL_Rect rect = {0, 0, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT};
SDL_RenderCopy(renderer, map_texture, &rect, NULL); SDL_RenderCopy(renderer, map_texture, &rect, NULL);
for (auto enemy : enemy_list) for (auto actor : actors)
{ {
enemy->render(); actor->render();
} }
} }
// Actualiza todas las variables // Actualiza todas las variables
void Map::update() void Map::update()
{ {
for (auto enemy : enemy_list) for (auto actor : actors)
{ {
enemy->update(); actor->update();
} }
} }

View File

@@ -4,7 +4,7 @@
#include "utils.h" #include "utils.h"
#include "asset.h" #include "asset.h"
#include "const.h" #include "const.h"
#include "enemy.h" #include "actor_moving_platform.h"
#include <string> #include <string>
#include <vector> #include <vector>
#include <sstream> #include <sstream>
@@ -33,19 +33,19 @@ enum e_border
class Map class Map
{ {
private: private:
Asset *asset; // Objeto con la ruta a todos los ficheros de recursos Asset *asset; // Objeto con la ruta a todos los ficheros de recursos
SDL_Renderer *renderer; // El renderizador de la ventana SDL_Renderer *renderer; // El renderizador de la ventana
std::string room_up; // Identificador de la habitación que se encuentra arriba std::string room_up; // Identificador de la habitación que se encuentra arriba
std::string room_down; // Identificador de la habitación que se encuentra abajp std::string room_down; // Identificador de la habitación que se encuentra abajp
std::string room_left; // Identificador de la habitación que se encuentra a la izquierda std::string room_left; // Identificador de la habitación que se encuentra a la izquierda
std::string room_right; // Identificador de la habitación que se encuentra a la derecha std::string room_right; // Identificador de la habitación que se encuentra a la derecha
std::string tileset_img; // Imagen con los graficos para la habitación std::string tileset_img; // Imagen con los graficos para la habitación
std::vector<int> tilemap; // Indice de los tiles a dibujar en la habitación std::vector<int> tilemap; // Indice de los tiles a dibujar en la habitación
LTexture *texture_tile; // Textura con los graficos de los tiles habitación LTexture *texture_tile; // Textura con los graficos de los tiles habitación
SDL_Texture *map_texture; // Textura para dibujar el mapa de la habitación SDL_Texture *map_texture; // Textura para dibujar el mapa de la habitación
std::vector<Enemy *> enemy_list; // Listado con los enemigos de la habitación std::vector<Actor *> actors; // Listado con los actores de la habitación
color_t bgColor1; // Color superior del degradado de fondo color_t bgColor1; // Color superior del degradado de fondo
color_t bgColor2; // Color inferior del degradado de fondo color_t bgColor2; // Color inferior del degradado de fondo
int tile_size; // Ancho del tile en pixels int tile_size; // Ancho del tile en pixels
int map_width; // Ancho del mapa en tiles int map_width; // Ancho del mapa en tiles
@@ -58,8 +58,8 @@ private:
// Asigna variables a partir de dos cadenas // Asigna variables a partir de dos cadenas
bool setVars(std::string var, std::string value); bool setVars(std::string var, std::string value);
// Asigna variables a una estructura enemy_t // Asigna variables a una estructura actor_t
bool setEnemy(enemy_t *enemy, std::string var, std::string value); bool setActor(actor_t *actor, SDL_Point *p1, SDL_Point *p2, std::string var, std::string value);
// Pinta el mapa de la habitación en la textura // Pinta el mapa de la habitación en la textura
void fillMapTexture(); void fillMapTexture();

View File

@@ -187,6 +187,10 @@ bool Prog::setFileList()
asset->add("/data/actors/enemies/flying_eye_horn.png", bitmap); asset->add("/data/actors/enemies/flying_eye_horn.png", bitmap);
asset->add("/data/actors/enemies/flying_eye_horn.ani", data); asset->add("/data/actors/enemies/flying_eye_horn.ani", data);
// Ficheros de actores
asset->add("/data/actors/moving_platform.png", bitmap);
asset->add("/data/actors/moving_platform.ani", data);
// Ficheros del logo // Ficheros del logo
asset->add("/data/logo/logo.png", bitmap); asset->add("/data/logo/logo.png", bitmap);