diff --git a/data/config/param_320x240.txt b/data/config/param_320x240.txt index 1fc4cba..a6d7fdf 100644 --- a/data/config/param_320x240.txt +++ b/data/config/param_320x240.txt @@ -1,7 +1,5 @@ ## --- GAME --- game.item_size 20 # Tamaño de los items del juego (en píxeles) -game.coffee_machine_w 32 # Ancho de la máquina de café (en píxeles) -game.coffee_machine_h 39 # Alto de la máquina de café (en píxeles) game.width 320 # Ancho de la resolución nativa del juego (en píxeles) game.height 240 # Alto de la resolución nativa del juego (en píxeles) game.play_area.rect.x 0 # Posición X de la zona jugable diff --git a/data/config/param_320x256.txt b/data/config/param_320x256.txt index c39a178..8cfac1e 100644 --- a/data/config/param_320x256.txt +++ b/data/config/param_320x256.txt @@ -1,7 +1,5 @@ ## --- GAME --- game.item_size 20 # Tamaño de los items del juego (en píxeles) -game.coffee_machine_w 32 # Ancho de la máquina de café (en píxeles) -game.coffee_machine_h 39 # Alto de la máquina de café (en píxeles) game.width 320 # Ancho de la resolución nativa del juego (en píxeles) game.height 256 # Alto de la resolución nativa del juego (en píxeles) game.play_area.rect.x 0 # Posición X de la zona jugable diff --git a/source/item.cpp b/source/item.cpp index a24ac89..7d342c6 100644 --- a/source/item.cpp +++ b/source/item.cpp @@ -14,11 +14,11 @@ Item::Item(ItemType type, float x, float y, SDL_FRect &play_area, std::shared_pt { case ItemType::COFFEE_MACHINE: { - width_ = param.game.coffee_machine_w; - height_ = param.game.coffee_machine_h; - pos_x_ = (static_cast(x + (play_area.w / 2)) % static_cast(play_area.w - width_ - 5)) + 2; + width_ = COFFEE_MACHINE_WIDTH; + height_ = COFFEE_MACHINE_HEIGHT; + pos_x_ = getCoffeeMachineSpawn(x, width_, play_area_.w); pos_y_ = y; - vel_x_ = 0.0f; + vel_x_ = ((rand() % 3) - 1) * 0.5f; vel_y_ = -0.1f; accel_y_ = 0.1f; collider_.r = 10; @@ -86,12 +86,12 @@ void Item::move() vel_y_ += accel_y_; // Comprueba los laterales de la zona de juego - const float min_x = param.game.play_area.rect.x; - const float max_x = play_area_.w - width_; - pos_x_ = std::clamp(pos_x_, min_x, max_x); + const float MIN_X = param.game.play_area.rect.x; + const float MAX_X = play_area_.w - width_; + pos_x_ = std::clamp(pos_x_, MIN_X, MAX_X); // Si toca el borde lateral, invierte la velocidad horizontal - if (pos_x_ == min_x || pos_x_ == max_x) + if (pos_x_ == MIN_X || pos_x_ == MAX_X) { vel_x_ = -vel_x_; } @@ -112,14 +112,24 @@ void Item::move() // Corrige la posición pos_y_ = play_area_.h - height_; - if (type_ == ItemType::COFFEE_MACHINE) + switch (type_) { - // Si es una máquina de café, detiene el objeto - vel_y_ = vel_x_ = accel_x_ = accel_y_ = 0; + case ItemType::COFFEE_MACHINE: + // La máquina de café es mas pesada y tiene una fisica diferente, ademas hace ruido floor_collision_ = true; - } - else - { + if (vel_y_ < 1.0f) + { + // Si la velocidad vertical es baja, detiene el objeto + vel_y_ = vel_x_ = accel_x_ = accel_y_ = 0; + } + else + { + // Si la velocidad vertical es alta, el objeto rebota y pierde velocidad + vel_y_ *= -0.20f; + vel_x_ *= 0.75f; + } + break; + default: // Si no es una máquina de café if (vel_y_ < 1.0f) { @@ -132,6 +142,7 @@ void Item::move() vel_y_ *= -0.5f; vel_x_ *= 0.75f; } + break; } } @@ -172,3 +183,64 @@ void Item::shiftSprite() sprite_->setPosX(pos_x_); sprite_->setPosY(pos_y_); } + +// Calcula la zona de aparición de la máquina de café +int Item::getCoffeeMachineSpawn(int player_x, int item_width, int area_width, int margin) +{ + // Distancia mínima del jugador (ajusta según necesites) + const int MIN_DISTANCE_FROM_PLAYER = area_width / 2; + + const int LEFT_BOUND = margin; + const int RIGHT_BOUND = area_width - item_width - margin; + + // Calcular zona de exclusión alrededor del jugador + int exclude_left = player_x - MIN_DISTANCE_FROM_PLAYER; + int exclude_right = player_x + MIN_DISTANCE_FROM_PLAYER; + + // Verificar si hay espacio suficiente a la izquierda + bool can_spawn_left = (exclude_left > LEFT_BOUND) && (exclude_left - LEFT_BOUND > item_width); + + // Verificar si hay espacio suficiente a la derecha + bool can_spawn_right = (exclude_right < RIGHT_BOUND) && (RIGHT_BOUND - exclude_right > item_width); + + if (can_spawn_left && can_spawn_right) + { + // Ambos lados disponibles, elegir aleatoriamente + if (rand() % 2 == 0) + { + // Lado izquierdo + return rand() % (exclude_left - LEFT_BOUND) + LEFT_BOUND; + } + else + { + // Lado derecho + return rand() % (RIGHT_BOUND - exclude_right) + exclude_right; + } + } + else if (can_spawn_left) + { + // Solo lado izquierdo disponible + return rand() % (exclude_left - LEFT_BOUND) + LEFT_BOUND; + } + else if (can_spawn_right) + { + // Solo lado derecho disponible + return rand() % (RIGHT_BOUND - exclude_right) + exclude_right; + } + else + { + // No hay espacio suficiente lejos del jugador + // Por ahora, intentar spawn en el extremo más lejano posible + int distance_to_left = abs(player_x - LEFT_BOUND); + int distance_to_right = abs(RIGHT_BOUND - player_x); + + if (distance_to_left > distance_to_right) + { + return LEFT_BOUND; + } + else + { + return RIGHT_BOUND - item_width; + } + } +} diff --git a/source/item.h b/source/item.h index 80e96cc..890119b 100644 --- a/source/item.h +++ b/source/item.h @@ -29,6 +29,10 @@ enum class ItemType : int class Item { public: + // Constantes + static constexpr int COFFEE_MACHINE_WIDTH = 30; + static constexpr int COFFEE_MACHINE_HEIGHT = 39; + // Constructor. Inicializa un objeto Item con el tipo, posición, área de juego, textura y animación. Item(ItemType type, float x, float y, SDL_FRect &play_area, std::shared_ptr texture, const std::vector &animation); @@ -95,4 +99,7 @@ private: // Actualiza el contador de tiempo de vida del objeto. // Si el tiempo de vida es mayor a 0, lo decrementa. Si llega a 0, desactiva el objeto. void updateTimeToLive(); + + // Calcula la zona de aparición de la máquina de café + int getCoffeeMachineSpawn(int player_x, int item_width, int area_width, int margin = 2); }; diff --git a/source/param.cpp b/source/param.cpp index 6cb5c09..c8a4d9c 100644 --- a/source/param.cpp +++ b/source/param.cpp @@ -21,8 +21,6 @@ void initParam() param.game.width = 320; param.game.height = 256; param.game.item_size = 20; - param.game.coffee_machine_w = 28; - param.game.coffee_machine_h = 37; param.game.game_area.rect = {0, 0, param.game.width, param.game.height}; param.game.play_area.rect = {0, 0, param.game.width, 216}; param.game.enter_name_seconds = 30; @@ -137,16 +135,6 @@ bool setParams(const std::string &var, const std::string &value) param.game.item_size = std::stoi(value); } - else if (var == "game.coffee_machine_w") - { - param.game.coffee_machine_w = std::stoi(value); - } - - else if (var == "game.coffee_machine_h") - { - param.game.coffee_machine_h = std::stoi(value); - } - else if (var == "game.play_area.rect.x") { param.game.play_area.rect.x = std::stoi(value); diff --git a/source/param.h b/source/param.h index e2763d6..10dbcf4 100644 --- a/source/param.h +++ b/source/param.h @@ -12,8 +12,6 @@ struct ParamGame float width; // Ancho de la resolución nativa del juego float height; // Alto de la resolución nativa del juego float item_size; // Tamaño de los ítems del juego - float coffee_machine_w; // Ancho de la máquina de café - float coffee_machine_h; // Alto de la máquina de café Zone play_area; // Rectángulo con la posición de la zona de juego Zone game_area; // Rectángulo con las dimensiones del juego int enter_name_seconds; // Duración en segundos para introducir el nombre al finalizar la partida diff --git a/source/sections/game.cpp b/source/sections/game.cpp index 2e5d770..4433412 100644 --- a/source/sections/game.cpp +++ b/source/sections/game.cpp @@ -598,7 +598,7 @@ void Game::checkBulletCollision() } else { - createItem(dropped_item, player->getPosX(), param.game.game_area.rect.y - param.game.coffee_machine_h); + createItem(dropped_item, player->getPosX(), param.game.game_area.rect.y - Item::COFFEE_MACHINE_HEIGHT); coffee_machine_enabled_ = true; } } @@ -2026,7 +2026,7 @@ void Game::checkDebugEvents(const SDL_Event &event) { if (player->isPlaying()) { - createItem(ItemType::COFFEE_MACHINE, player->getPosX(), param.game.game_area.rect.y - param.game.coffee_machine_h); + createItem(ItemType::COFFEE_MACHINE, player->getPosX(), param.game.game_area.rect.y - Item::COFFEE_MACHINE_HEIGHT); break; } }