Item: nou spawn de la máquina de café

This commit is contained in:
2025-06-29 18:50:43 +02:00
parent e058b12f07
commit b71e923975
7 changed files with 95 additions and 34 deletions

View File

@@ -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<int>(x + (play_area.w / 2)) % static_cast<int>(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;
}
}
}