reordenades les layers del overlay
consola ara tanca i obri per temps en lloc de velocitat
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
#include "core/rendering/text.hpp" // Para Text, Text::CENTER_FLAG, Text::COLOR_FLAG
|
||||
#include "core/resources/resource_cache.hpp" // Para Resource
|
||||
#include "game/options.hpp" // Para Options, options, NotificationPosition
|
||||
#include "game/ui/console.hpp" // Para Console
|
||||
#include "utils/delta_timer.hpp" // Para DeltaTimer
|
||||
#include "utils/utils.hpp" // Para PaletteColor
|
||||
|
||||
@@ -73,8 +74,11 @@ void Notifier::render() {
|
||||
|
||||
// Actualiza el estado de las notificaiones
|
||||
void Notifier::update(float delta_time) {
|
||||
// Base Y leída cada frame: cada notificación se dibuja en rect.y (relativo a BASE) + BASE
|
||||
const float BASE = static_cast<float>(getStackBaseY());
|
||||
|
||||
for (auto& notification : notifications_) {
|
||||
// Si la notificación anterior está "saliendo", no hagas nada
|
||||
// Si la notificación anterior está "entrando", no hagas nada (stall del resto)
|
||||
if (!notifications_.empty() && ¬ification != ¬ifications_.front()) {
|
||||
const auto& previous_notification = *(std::prev(¬ification));
|
||||
if (previous_notification.state == Status::RISING) {
|
||||
@@ -84,17 +88,17 @@ void Notifier::update(float delta_time) {
|
||||
|
||||
switch (notification.state) {
|
||||
case Status::RISING: {
|
||||
const float DISPLACEMENT = SLIDE_SPEED * delta_time;
|
||||
notification.rect.y += DISPLACEMENT;
|
||||
|
||||
if (notification.rect.y >= notification.y) {
|
||||
notification.rect.y = notification.y;
|
||||
const float TARGET = static_cast<float>(notification.y);
|
||||
notification.rect.y += SLIDE_SPEED * delta_time;
|
||||
if (notification.rect.y >= TARGET) {
|
||||
notification.rect.y = TARGET;
|
||||
notification.state = Status::STAY;
|
||||
notification.elapsed_time = 0.0F;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case Status::STAY: {
|
||||
notification.rect.y = static_cast<float>(notification.y);
|
||||
notification.elapsed_time += delta_time;
|
||||
if (notification.elapsed_time >= notification.display_duration) {
|
||||
notification.state = Status::VANISHING;
|
||||
@@ -103,10 +107,8 @@ void Notifier::update(float delta_time) {
|
||||
}
|
||||
|
||||
case Status::VANISHING: {
|
||||
const float DISPLACEMENT = SLIDE_SPEED * delta_time;
|
||||
notification.rect.y -= DISPLACEMENT;
|
||||
|
||||
const float TARGET_Y = notification.y - notification.travel_dist;
|
||||
const float TARGET_Y = static_cast<float>(notification.y - notification.travel_dist);
|
||||
notification.rect.y -= SLIDE_SPEED * delta_time;
|
||||
if (notification.rect.y <= TARGET_Y) {
|
||||
notification.rect.y = TARGET_Y;
|
||||
notification.state = Status::FINISHED;
|
||||
@@ -120,8 +122,13 @@ void Notifier::update(float delta_time) {
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
notification.sprite->setPosition(notification.rect);
|
||||
// Refrescar posiciones de sprite cada frame (convierte rect.y relativo a absoluto)
|
||||
for (auto& notification : notifications_) {
|
||||
SDL_FRect sprite_rect = notification.rect;
|
||||
sprite_rect.y += BASE;
|
||||
notification.sprite->setPosition(sprite_rect);
|
||||
}
|
||||
|
||||
clearFinishedNotifications();
|
||||
@@ -170,15 +177,13 @@ void Notifier::show(std::vector<std::string> texts, const Style& style, int icon
|
||||
|
||||
// Posición horizontal
|
||||
float desp_h = ((Options::game.width / 2) - (WIDTH / 2));
|
||||
;
|
||||
|
||||
// Posición vertical
|
||||
const int DESP_V = y_offset_;
|
||||
|
||||
// Offset
|
||||
// Offset vertical (relativo a la base de la pila, que se consulta cada frame)
|
||||
const auto TRAVEL_DIST = HEIGHT + PADDING_OUT;
|
||||
const int TRAVEL_MOD = 1;
|
||||
const int OFFSET = !notifications_.empty() ? notifications_.back().y + (TRAVEL_MOD * notifications_.back().travel_dist) : DESP_V;
|
||||
const int OFFSET = !notifications_.empty()
|
||||
? notifications_.back().y + (TRAVEL_MOD * notifications_.back().travel_dist)
|
||||
: 0;
|
||||
|
||||
// Crea la notificacion
|
||||
Notification n;
|
||||
@@ -191,8 +196,9 @@ void Notifier::show(std::vector<std::string> texts, const Style& style, int icon
|
||||
n.texts = texts;
|
||||
n.shape = SHAPE;
|
||||
n.display_duration = style.duration;
|
||||
const float Y_POS = OFFSET + -TRAVEL_DIST;
|
||||
n.rect = {.x = desp_h, .y = Y_POS, .w = WIDTH, .h = HEIGHT};
|
||||
// Posición inicial relativa a la base: arranca "travel_dist" por encima del target (=OFFSET)
|
||||
const float Y_POS_REL = static_cast<float>(OFFSET) - TRAVEL_DIST;
|
||||
n.rect = {.x = desp_h, .y = Y_POS_REL, .w = WIDTH, .h = HEIGHT};
|
||||
|
||||
// Crea la textura
|
||||
n.surface = std::make_shared<Surface>(WIDTH, HEIGHT);
|
||||
@@ -252,8 +258,10 @@ void Notifier::show(std::vector<std::string> texts, const Style& style, int icon
|
||||
// Deja de dibujar en la textura
|
||||
Screen::get()->setRendererSurface(previuos_renderer);
|
||||
|
||||
// Crea el sprite de la notificación
|
||||
n.sprite = std::make_shared<Sprite>(n.surface, n.rect);
|
||||
// Crea el sprite de la notificación (rect absoluto a partir del relativo + BASE)
|
||||
SDL_FRect initial_sprite_rect = n.rect;
|
||||
initial_sprite_rect.y += static_cast<float>(getStackBaseY());
|
||||
n.sprite = std::make_shared<Sprite>(n.surface, initial_sprite_rect);
|
||||
|
||||
// Añade la notificación a la lista
|
||||
notifications_.emplace_back(n);
|
||||
@@ -278,9 +286,21 @@ void Notifier::clearNotifications() {
|
||||
clearFinishedNotifications();
|
||||
}
|
||||
|
||||
// Ajusta el offset vertical base
|
||||
void Notifier::addYOffset(int px) { y_offset_ += px; }
|
||||
void Notifier::removeYOffset(int px) { y_offset_ -= px; }
|
||||
// Y absoluta de la base de la pila (justo debajo de Console, o 0 si no hay Console)
|
||||
auto Notifier::getStackBaseY() const -> int {
|
||||
return Console::get() != nullptr ? Console::get()->getVisibleHeight() : 0;
|
||||
}
|
||||
|
||||
// Altura animada ocupada por la pila (usa rect.y animado, no el target — para transiciones suaves)
|
||||
auto Notifier::getVisibleHeight() const -> int {
|
||||
int bottom = 0;
|
||||
for (const auto& n : notifications_) {
|
||||
if (n.state == Status::FINISHED) { continue; }
|
||||
const int N_BOTTOM = static_cast<int>(n.rect.y + n.rect.h);
|
||||
if (N_BOTTOM > bottom) { bottom = N_BOTTOM; }
|
||||
}
|
||||
return bottom;
|
||||
}
|
||||
|
||||
// Obtiene los códigos de las notificaciones
|
||||
auto Notifier::getCodes() -> std::vector<std::string> {
|
||||
|
||||
Reference in New Issue
Block a user