ja renderitza a la resolució de la finestra
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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_;
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user