From a4000d25dbae1fa6cfe24c94f680fd01d410f32c Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 26 Aug 2022 13:36:31 +0200 Subject: [PATCH] Empezando con los actores y polimorfismo. Ya pinta la plataforma movil --- data/actors/moving_platform.ani | 10 ++++ data/actors/moving_platform.png | Bin 0 -> 151 bytes data/map/01.map | 37 +++++-------- data/map/02.map | 32 +---------- source/actor.cpp | 6 ++- source/actor.h | 5 +- source/actor_moving_platform.cpp | 8 +-- source/actor_moving_platform.h | 2 +- source/animatedsprite.h | 2 +- source/map.cpp | 90 +++++++++++++++++++++---------- source/map.h | 32 +++++------ source/prog.cpp | 4 ++ 12 files changed, 120 insertions(+), 108 deletions(-) create mode 100644 data/actors/moving_platform.ani create mode 100644 data/actors/moving_platform.png diff --git a/data/actors/moving_platform.ani b/data/actors/moving_platform.ani new file mode 100644 index 0000000..e70220c --- /dev/null +++ b/data/actors/moving_platform.ani @@ -0,0 +1,10 @@ +frames_per_row=1 +frame_width=16 +frame_height=8 + +[animation] +name=default +speed=8 +loop=0 +frames=0 +[/animation] \ No newline at end of file diff --git a/data/actors/moving_platform.png b/data/actors/moving_platform.png new file mode 100644 index 0000000000000000000000000000000000000000..02893aac3be9df60479c72eda736dc782277754d GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~c!3HEhl+{lMQjEnx?oJHr&dIz4asoYF978lF zCZ{AMBy{j_|2pr$7O^i&R@plx;=+IP>2ZcR)?c~x9;O~+OMfiR|LeRAdsk`fx-ZVcQ%ty=Ut-h=@SXYh3Ob6Mw<&;$UNRxp #include +// Constructor +Actor::Actor() +{ +} + // Constructor Actor::Actor(actor_t actor) { @@ -23,7 +28,6 @@ Actor::Actor(actor_t actor) // Inicializa el sprite con el resto de parametros comunes sprite->setWidth(actor.w); sprite->setHeight(actor.h); - sprite->setCurrentAnimation("walk"); sprite->setFlip(actor.vx>0?SDL_FLIP_NONE:SDL_FLIP_HORIZONTAL); } diff --git a/source/actor.h b/source/actor.h index b474f7c..d599fa7 100644 --- a/source/actor.h +++ b/source/actor.h @@ -36,16 +36,17 @@ protected: public: // Constructor + Actor(); Actor(actor_t actor); // Destructor - ~Actor(); + virtual ~Actor(); // Pinta el enemigo en pantalla void render(); // Actualiza las variables del objeto - void update(); + virtual void update(); // Obtiene el rectangulo de colision del enemigo SDL_Rect &getCollider(); diff --git a/source/actor_moving_platform.cpp b/source/actor_moving_platform.cpp index dd9358e..f22522e 100644 --- a/source/actor_moving_platform.cpp +++ b/source/actor_moving_platform.cpp @@ -3,8 +3,10 @@ #include // Constructor -ActorMovingPlatform::ActorMovingPlatform() +ActorMovingPlatform::ActorMovingPlatform(actor_t actor, SDL_Point p1, SDL_Point p2) : Actor(actor) { + this->p1 = p1; + this->p2 = p2; } // Destructor @@ -19,14 +21,14 @@ void ActorMovingPlatform::checkPath() if (sprite->getPosX() > p2.x || sprite->getPosX() < p1.x) { sprite->setVelX(sprite->getVelX() * (-1)); - sprite->flip(); + //sprite->flip(); } // Comprueba los límites verticales if (sprite->getPosY() > p2.y || sprite->getPosY() < p1.y) { sprite->setVelY(sprite->getVelY() * (-1)); - sprite->flip(); + //sprite->flip(); } } diff --git a/source/actor_moving_platform.h b/source/actor_moving_platform.h index 997f68b..fe334eb 100644 --- a/source/actor_moving_platform.h +++ b/source/actor_moving_platform.h @@ -19,7 +19,7 @@ private: public: // Constructor - ActorMovingPlatform(); + ActorMovingPlatform(actor_t actor, SDL_Point p1, SDL_Point p2); // Destructor ~ActorMovingPlatform(); diff --git a/source/animatedsprite.h b/source/animatedsprite.h index e0d997c..b4eb517 100644 --- a/source/animatedsprite.h +++ b/source/animatedsprite.h @@ -65,7 +65,7 @@ public: bool load(std::string filePath); // Establece la animacion actual - void setCurrentAnimation(std::string name); + void setCurrentAnimation(std::string name = "default"); // Actualiza las variables del objeto void update(); diff --git a/source/map.cpp b/source/map.cpp index 4e83fe0..c4a2015 100644 --- a/source/map.cpp +++ b/source/map.cpp @@ -36,11 +36,11 @@ Map::~Map() 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 @@ -104,12 +104,44 @@ bool Map::load(std::string file_path) } while (line != "[/tilemap]"); } - // Si la linea contiene el texto [enemy] se realiza el proceso de carga de un enemigo - else if (line == "[enemy]") + // Si la linea contiene el texto [actor] se realiza el proceso de carga de los actores + else if (line == "[actors]") { - enemy_t enemy; - enemy.asset = asset; - enemy.renderer = renderer; + do + { + 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 { @@ -118,15 +150,15 @@ bool Map::load(std::string file_path) // Encuentra la posición del caracter '=' int pos = line.find("="); // 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()); success = false; } - } while (line != "[/enemy]"); + } while (line != "[/actor]"); // 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 @@ -219,60 +251,60 @@ bool Map::setVars(std::string var, std::string value) } // 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 bool success = true; if (var == "tileset") { - enemy->tileset = value; + actor->tileset = value; } else if (var == "animation") { - enemy->animation = value; + actor->animation = value; } else if (var == "width") { - enemy->w = std::stof(value); + actor->w = std::stof(value); } else if (var == "height") { - enemy->h = std::stof(value); + actor->h = std::stof(value); } else if (var == "x") { - enemy->x = std::stof(value) * tile_size; + actor->x = std::stof(value) * tile_size; } else if (var == "y") { - enemy->y = std::stof(value) * tile_size; + actor->y = std::stof(value) * tile_size; } else if (var == "vx") { - enemy->vx = std::stof(value); + actor->vx = std::stof(value); } else if (var == "vy") { - enemy->vy = std::stof(value); + actor->vy = std::stof(value); } else if (var == "x1") { - enemy->p1.x = std::stoi(value) * tile_size; + p1->x = std::stoi(value) * tile_size; } else if (var == "x2") { - enemy->p2.x = std::stoi(value) * tile_size; + p2->x = std::stoi(value) * tile_size; } else if (var == "y1") { - enemy->p1.y = std::stoi(value) * tile_size; + p1->y = std::stoi(value) * tile_size; } 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 @@ -343,18 +375,18 @@ void Map::render() SDL_Rect rect = {0, 0, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT}; SDL_RenderCopy(renderer, map_texture, &rect, NULL); - for (auto enemy : enemy_list) + for (auto actor : actors) { - enemy->render(); + actor->render(); } } // Actualiza todas las variables void Map::update() { - for (auto enemy : enemy_list) + for (auto actor : actors) { - enemy->update(); + actor->update(); } } diff --git a/source/map.h b/source/map.h index 841ca2c..d7f746c 100644 --- a/source/map.h +++ b/source/map.h @@ -4,7 +4,7 @@ #include "utils.h" #include "asset.h" #include "const.h" -#include "enemy.h" +#include "actor_moving_platform.h" #include #include #include @@ -33,19 +33,19 @@ enum e_border class Map { private: - Asset *asset; // Objeto con la ruta a todos los ficheros de recursos - SDL_Renderer *renderer; // El renderizador de la ventana - 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_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 tileset_img; // Imagen con los graficos para la habitación - std::vector tilemap; // Indice de los tiles a dibujar en la 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 - std::vector enemy_list; // Listado con los enemigos de la habitación - color_t bgColor1; // Color superior del degradado de fondo - color_t bgColor2; // Color inferior del degradado de fondo + Asset *asset; // Objeto con la ruta a todos los ficheros de recursos + SDL_Renderer *renderer; // El renderizador de la ventana + 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_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 tileset_img; // Imagen con los graficos para la habitación + std::vector tilemap; // Indice de los tiles a dibujar en la 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 + std::vector actors; // Listado con los actores de la habitación + color_t bgColor1; // Color superior del degradado de fondo + color_t bgColor2; // Color inferior del degradado de fondo int tile_size; // Ancho del tile en pixels int map_width; // Ancho del mapa en tiles @@ -58,8 +58,8 @@ private: // Asigna variables a partir de dos cadenas bool setVars(std::string var, std::string value); - // Asigna variables a una estructura enemy_t - bool setEnemy(enemy_t *enemy, std::string var, std::string value); + // Asigna variables a una estructura actor_t + 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 void fillMapTexture(); diff --git a/source/prog.cpp b/source/prog.cpp index 9176fe6..ee71493 100644 --- a/source/prog.cpp +++ b/source/prog.cpp @@ -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.ani", data); + // Ficheros de actores + asset->add("/data/actors/moving_platform.png", bitmap); + asset->add("/data/actors/moving_platform.ani", data); + // Ficheros del logo asset->add("/data/logo/logo.png", bitmap);