ja renderitza a la resolució de la finestra

This commit is contained in:
2025-12-03 08:23:42 +01:00
parent 69fb5f3cc1
commit aa66dd41c1
5 changed files with 55 additions and 10 deletions

View File

@@ -8,6 +8,7 @@
#include <iostream>
#include "core/defaults.hpp"
#include "core/rendering/coordinate_transform.hpp"
#include "core/rendering/line_renderer.hpp"
#include "game/options.hpp"
#include "project.h"
@@ -228,6 +229,9 @@ void SDLManager::applyZoom(float new_zoom) {
// Apply to window (centers via applyWindowSize)
applyWindowSize(new_width, new_height);
// Update viewport for new zoom
updateViewport();
// Update windowed size cache
windowed_width_ = new_width;
windowed_height_ = new_height;
@@ -242,14 +246,38 @@ void SDLManager::applyZoom(float new_zoom) {
}
void SDLManager::updateLogicalPresentation() {
// AIXÒ ÉS LA MÀGIA: El joc SEMPRE dibuixa en 640x480,
// SDL escala automàticament a la mida física de la finestra
SDL_SetRenderLogicalPresentation(
renderer_,
Defaults::Game::WIDTH, // 640 (lògic)
Defaults::Game::HEIGHT, // 480 (lògic)
SDL_LOGICAL_PRESENTATION_LETTERBOX // Mantenir aspect ratio 4:3
);
// CANVIAT: Ja no usem SDL_SetRenderLogicalPresentation
// Ara renderitzem directament a resolució física per evitar pixelació irregular
// El viewport amb letterbox es configura a updateViewport()
updateViewport();
}
void SDLManager::updateViewport() {
// Calcular dimensions físiques basades en el zoom
float scale = zoom_factor_;
int scaled_width = static_cast<int>(std::round(Defaults::Game::WIDTH * scale));
int scaled_height = static_cast<int>(std::round(Defaults::Game::HEIGHT * scale));
// Càlcul de letterbox (centrar l'àrea escalada)
int offset_x = (current_width_ - scaled_width) / 2;
int offset_y = (current_height_ - scaled_height) / 2;
// Evitar offsets negatius
offset_x = std::max(offset_x, 0);
offset_y = std::max(offset_y, 0);
// Configurar viewport per al renderitzat
SDL_Rect viewport = {offset_x, offset_y, scaled_width, scaled_height};
SDL_SetRenderViewport(renderer_, &viewport);
std::cout << "Viewport: " << scaled_width << "x" << scaled_height
<< " @ (" << offset_x << "," << offset_y << ") [scale=" << scale << "]"
<< std::endl;
}
void SDLManager::updateRenderingContext() {
// Actualitzar el factor d'escala global per a totes les funcions de renderitzat
Rendering::g_current_scale_factor = zoom_factor_;
}
void SDLManager::increaseWindowSize() {
@@ -300,8 +328,8 @@ void SDLManager::applyWindowSize(int new_width, int new_height) {
SDL_SetWindowPosition(finestra_, new_x, new_y);
// NO cal actualitzar el logical presentation aquí,
// SDL ho maneja automàticament
// Actualitzar viewport després del resize
updateViewport();
}
void SDLManager::toggleFullscreen() {
@@ -345,6 +373,9 @@ bool SDLManager::handleWindowEvent(const SDL_Event& event) {
windowed_height_ = current_height_;
}
// Actualitzar viewport després del resize manual
updateViewport();
std::cout << "Finestra redimensionada: " << current_width_
<< "x" << current_height_ << " (zoom ≈" << zoom_factor_ << "x)"
<< std::endl;

View File

@@ -42,10 +42,14 @@ class SDLManager {
// Getters
SDL_Renderer* obte_renderer() { return renderer_; }
float getScaleFactor() const { return zoom_factor_; }
// [NUEVO] Actualitzar títol de la finestra
void setWindowTitle(const std::string& title);
// [NUEVO] Actualitzar context de renderitzat (factor d'escala global)
void updateRenderingContext();
private:
SDL_Window* finestra_;
SDL_Renderer* renderer_;
@@ -74,6 +78,7 @@ class SDLManager {
void applyZoom(float new_zoom); // Apply zoom and resize window
void applyWindowSize(int width, int height); // Canviar mida + centrar
void updateLogicalPresentation(); // Actualitzar viewport
void updateViewport(); // Configurar viewport amb letterbox
// [NUEVO] Oscil·lador de colors
Rendering::ColorOscillator color_oscillator_;

View File

@@ -83,6 +83,9 @@ void EscenaJoc::executar() {
// Netejar pantalla (usa color oscil·lat)
sdl_.neteja(0, 0, 0);
// Actualitzar context de renderitzat (factor d'escala global)
sdl_.updateRenderingContext();
// Dibuixar joc
dibuixar();

View File

@@ -89,6 +89,9 @@ void EscenaLogo::executar() {
// Actualitzar colors oscil·lats (efecte verd global)
sdl_.updateColors(delta_time);
// Actualitzar context de renderitzat (factor d'escala global)
sdl_.updateRenderingContext();
// Dibuixar
dibuixar();
}

View File

@@ -82,6 +82,9 @@ void EscenaTitol::executar() {
// Netejar pantalla
sdl_.neteja(0, 0, 0);
// Actualitzar context de renderitzat (factor d'escala global)
sdl_.updateRenderingContext();
// Dibuixar
dibuixar();