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 <iostream>
#include "core/defaults.hpp" #include "core/defaults.hpp"
#include "core/rendering/coordinate_transform.hpp"
#include "core/rendering/line_renderer.hpp" #include "core/rendering/line_renderer.hpp"
#include "game/options.hpp" #include "game/options.hpp"
#include "project.h" #include "project.h"
@@ -228,6 +229,9 @@ void SDLManager::applyZoom(float new_zoom) {
// Apply to window (centers via applyWindowSize) // Apply to window (centers via applyWindowSize)
applyWindowSize(new_width, new_height); applyWindowSize(new_width, new_height);
// Update viewport for new zoom
updateViewport();
// Update windowed size cache // Update windowed size cache
windowed_width_ = new_width; windowed_width_ = new_width;
windowed_height_ = new_height; windowed_height_ = new_height;
@@ -242,14 +246,38 @@ void SDLManager::applyZoom(float new_zoom) {
} }
void SDLManager::updateLogicalPresentation() { void SDLManager::updateLogicalPresentation() {
// AIXÒ ÉS LA MÀGIA: El joc SEMPRE dibuixa en 640x480, // CANVIAT: Ja no usem SDL_SetRenderLogicalPresentation
// SDL escala automàticament a la mida física de la finestra // Ara renderitzem directament a resolució física per evitar pixelació irregular
SDL_SetRenderLogicalPresentation( // El viewport amb letterbox es configura a updateViewport()
renderer_, updateViewport();
Defaults::Game::WIDTH, // 640 (lògic) }
Defaults::Game::HEIGHT, // 480 (lògic)
SDL_LOGICAL_PRESENTATION_LETTERBOX // Mantenir aspect ratio 4:3 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() { void SDLManager::increaseWindowSize() {
@@ -300,8 +328,8 @@ void SDLManager::applyWindowSize(int new_width, int new_height) {
SDL_SetWindowPosition(finestra_, new_x, new_y); SDL_SetWindowPosition(finestra_, new_x, new_y);
// NO cal actualitzar el logical presentation aquí, // Actualitzar viewport després del resize
// SDL ho maneja automàticament updateViewport();
} }
void SDLManager::toggleFullscreen() { void SDLManager::toggleFullscreen() {
@@ -345,6 +373,9 @@ bool SDLManager::handleWindowEvent(const SDL_Event& event) {
windowed_height_ = current_height_; windowed_height_ = current_height_;
} }
// Actualitzar viewport després del resize manual
updateViewport();
std::cout << "Finestra redimensionada: " << current_width_ std::cout << "Finestra redimensionada: " << current_width_
<< "x" << current_height_ << " (zoom ≈" << zoom_factor_ << "x)" << "x" << current_height_ << " (zoom ≈" << zoom_factor_ << "x)"
<< std::endl; << std::endl;

View File

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

View File

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

View File

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

View File

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