From eac0236c601d4ab2aa1034387e855ab77aa6eac7 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 23 Sep 2022 17:32:09 +0200 Subject: [PATCH] Capa de fondo con posibilidad de scroll --- data/config/config.txt | 2 +- data/map/01.map | 1 + data/map/02.map | 1 + data/map/04.map | 1 + data/map/05.map | 1 + source/game.cpp | 2 +- source/map.cpp | 50 ++++++++++++++++++++++++++++++++++++++++-- source/map.h | 2 ++ source/scoreboard.cpp | 21 +++++------------- source/scoreboard.h | 1 - 10 files changed, 62 insertions(+), 20 deletions(-) diff --git a/data/config/config.txt b/data/config/config.txt index 8074f6a..56c3ec4 100644 --- a/data/config/config.txt +++ b/data/config/config.txt @@ -1,5 +1,5 @@ fullScreenMode=0 -windowSize=2 +windowSize=3 filter=FILTER_NEAREST vSync=true integerScale=true diff --git a/data/map/01.map b/data/map/01.map index 785b6b5..e02e15b 100644 --- a/data/map/01.map +++ b/data/map/01.map @@ -2,6 +2,7 @@ tileset_img=surface.png enemy_file=01.ene bgColor1=0,171,159 bgColor2=144,225,231 +bgScroll=true room_up=0 room_down=0 diff --git a/data/map/02.map b/data/map/02.map index 1de4dad..b30d70c 100644 --- a/data/map/02.map +++ b/data/map/02.map @@ -2,6 +2,7 @@ tileset_img=surface.png enemy_file=02.ene bgColor1=0,171,159 bgColor2=144,225,231 +bgScroll=true room_up=0 room_down=03.map diff --git a/data/map/04.map b/data/map/04.map index ff6a40a..9f2b5d6 100644 --- a/data/map/04.map +++ b/data/map/04.map @@ -1,6 +1,7 @@ tileset_img=surface.png bgColor1=255,90,100 bgColor2=255,255,100 +bgScroll=true room_up=0 room_down=04.map diff --git a/data/map/05.map b/data/map/05.map index 9250780..be5028b 100644 --- a/data/map/05.map +++ b/data/map/05.map @@ -1,6 +1,7 @@ tileset_img=surface.png bgColor1=0,171,159 bgColor2=144,225,231 +bgScroll=true room_up=0 room_down=06.map diff --git a/source/game.cpp b/source/game.cpp index 248ed9f..9733705 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -9,7 +9,7 @@ Game::Game(SDL_Renderer *renderer, Screen *screen, Asset *asset, Input *input, D this->screen = screen; this->input = input; this->debug = debug; - this->debug->setEnabled(true); + //this->debug->setEnabled(true); // Reserva memoria para los objetos scoreboard = new ScoreBoard(renderer, asset, &board); diff --git a/source/map.cpp b/source/map.cpp index d9272fc..a6cd24e 100644 --- a/source/map.cpp +++ b/source/map.cpp @@ -10,6 +10,8 @@ Map::Map(std::string file, SDL_Renderer *renderer, Asset *asset, ItemTracker *it name = file.substr(file.find_last_of("\\/") + 1); enemy_file = ""; bgColor1 = bgColor2 = {0, 0, 0}; + bgScroll = false; + counter = 0; // Copia los punteros a objetos this->asset = asset; @@ -273,6 +275,7 @@ bool Map::setVars(std::string var, std::string value) { tileset_img = value; } + else if (var == "bgColor1") { // Se introducen los valores separados por comas en un vector @@ -285,6 +288,7 @@ bool Map::setVars(std::string var, std::string value) getline(ss, tmp, ','); bgColor1.b = std::stoi(tmp); } + else if (var == "bgColor2") { // Se introducen los valores separados por comas en un vector @@ -297,29 +301,41 @@ bool Map::setVars(std::string var, std::string value) getline(ss, tmp, ','); bgColor2.b = std::stoi(tmp); } + + else if (var == "bgScroll") + { + bgScroll = stringToBool(value); + } + else if (var == "room_up") { room_up = value; } + else if (var == "room_down") { room_down = value; } + else if (var == "room_left") { room_left = value; } + else if (var == "room_right") { room_right = value; } + else if (var == "enemy_file") { enemy_file = value; } + else if (var == "") { } + else { success = false; @@ -338,53 +354,66 @@ bool Map::setActor(actor_t *actor, SDL_Point *p1, SDL_Point *p2, std::string var { actor->tileset = value; } + else if (var == "animation") { actor->animation = value; } + else if (var == "width") { actor->w = std::stoi(value); } + else if (var == "height") { actor->h = std::stoi(value); } + else if (var == "x") { actor->x = std::stof(value) * tile_size; } + else if (var == "y") { actor->y = std::stof(value) * tile_size; } + else if (var == "vx") { actor->vx = std::stof(value); } + else if (var == "vy") { actor->vy = std::stof(value); } + else if (var == "x1") { p1->x = std::stoi(value) * tile_size; } + else if (var == "x2") { p2->x = std::stoi(value) * tile_size; } + else if (var == "y1") { p1->y = std::stoi(value) * tile_size; } + else if (var == "y2") { p2->y = std::stoi(value) * tile_size; } + else if ((var == "[/moving platform]") || (var == "[/diamond]")) { } + else { success = false; @@ -468,8 +497,23 @@ void Map::render() void Map::renderLayer0() { // Dibuja la textura con el mapa en pantalla - SDL_Rect rect = {PLAY_AREA_X, PLAY_AREA_Y, PLAY_AREA_WIDTH, PLAY_AREA_HEIGHT}; - SDL_RenderCopy(renderer, map_layer0, NULL, &rect); + if (bgScroll) + { + const int offset = PLAY_AREA_WIDTH - ((counter / 20) % PLAY_AREA_WIDTH); + SDL_Rect src1 = {PLAY_AREA_X, PLAY_AREA_Y, offset, PLAY_AREA_HEIGHT}; + SDL_Rect dst1 = {PLAY_AREA_X + PLAY_AREA_WIDTH - offset, PLAY_AREA_Y, offset, PLAY_AREA_HEIGHT}; + + SDL_Rect src2 = {PLAY_AREA_X + offset, PLAY_AREA_Y, PLAY_AREA_WIDTH - offset, PLAY_AREA_HEIGHT}; + SDL_Rect dst2 = {PLAY_AREA_X, PLAY_AREA_Y, PLAY_AREA_WIDTH - offset, PLAY_AREA_HEIGHT}; + + SDL_RenderCopy(renderer, map_layer0, &src1, &dst1); + SDL_RenderCopy(renderer, map_layer0, &src2, &dst2); + } + else + { + SDL_Rect rect = {PLAY_AREA_X, PLAY_AREA_Y, PLAY_AREA_WIDTH, PLAY_AREA_HEIGHT}; + SDL_RenderCopy(renderer, map_layer0, nullptr, nullptr); + } } // Dibuja la capa 1 @@ -492,6 +536,8 @@ void Map::renderActors() // Actualiza todas las variables void Map::update() { + counter++; + for (auto actor : actors) { actor->update(); diff --git a/source/map.h b/source/map.h index b39ae84..1aa1cda 100644 --- a/source/map.h +++ b/source/map.h @@ -53,7 +53,9 @@ private: 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 + bool bgScroll; // Indica si la capa de fondo se mueve ItemTracker *itemTracker; // Objeto que gestiona los items que ya se han recogido + int counter; // Contador para lo que se necesite int tile_size; // Ancho del tile en pixels int map_width; // Ancho del mapa en tiles diff --git a/source/scoreboard.cpp b/source/scoreboard.cpp index d41ab9f..fc5555d 100644 --- a/source/scoreboard.cpp +++ b/source/scoreboard.cpp @@ -24,7 +24,6 @@ ScoreBoard::ScoreBoard(SDL_Renderer *renderer, Asset *asset, board_t *board) // Inicializa las variables rect = {SCOREBOARD_X, SCOREBOARD_Y, SCOREBOARD_WIDTH, SCOREBOARD_HEIGHT}; counter = 0; - movingCounter = 0; fadingCounter = 0; state = sb_hide; } @@ -101,16 +100,12 @@ void ScoreBoard::update() else if (state == sb_showing) { - movingCounter++; fadingCounter++; - // float step = ((float)fadingCounter / (float)SCOREBOARD_HEIGHT); - auto easingFunction = getEasingFunction(EaseOutSine); - auto step = easingFunction(((float)fadingCounter / (float)SCOREBOARD_HEIGHT)); - int alpha = 0 + ((255 - 0) * step); - int pos = -32 + ((0 + 32) * step); + const float step = ((float)fadingCounter / (float)SCOREBOARD_HEIGHT); + const int alpha = 255 * step; - rect.y = pos; + rect.y++; SDL_SetTextureAlphaMod(layer, alpha); if (rect.y == SCOREBOARD_Y) @@ -122,22 +117,18 @@ void ScoreBoard::update() else if (state == sb_hiding) { - movingCounter--; fadingCounter--; - auto easingFunction = getEasingFunction(EaseOutSine); - auto step = easingFunction(((float)fadingCounter / (float)SCOREBOARD_HEIGHT)); - int alpha = 0 + ((255 - 0) * step); - int pos = -32 + ((0 + 32) * step); + const float step = ((float)fadingCounter / (float)SCOREBOARD_HEIGHT); + const int alpha = 255 * step; - rect.y = pos; + rect.y--; SDL_SetTextureAlphaMod(layer, alpha); if (rect.y == SCOREBOARD_Y - SCOREBOARD_HEIGHT) { state = sb_hide; counter = 0; - movingCounter = 0; fadingCounter = 0; SDL_SetTextureAlphaMod(layer, 255); } diff --git a/source/scoreboard.h b/source/scoreboard.h index 3027934..cbc560e 100644 --- a/source/scoreboard.h +++ b/source/scoreboard.h @@ -37,7 +37,6 @@ private: Asset *asset; // Objeto con la ruta a todos los ficheros de recursos Text *text; // Objeto para escribir texto int counter; // Contador interno - int movingCounter; // Contador para el movimiento del marcador int fadingCounter; // Contador para el desvanecimiento del marcador board_t *board; // Contiene las variables a mostrar en el marcador sb_state_e state; // Estado en el que se encuentra el marcador