afegida funció per a escalar surfaces
This commit is contained in:
@@ -19,6 +19,7 @@ void Logo::init()
|
||||
{
|
||||
Screen::get()->init();
|
||||
logo_surface = std::make_shared<Surface>("jailgames.gif");
|
||||
logo_surface->scale(5);
|
||||
logo_sprite = std::make_unique<SSprite>(logo_surface);
|
||||
logo_sprite->setPosition(
|
||||
(options.game.width - logo_sprite->getWidth()) / 2,
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#include <SDL3/SDL.h>
|
||||
#include <array> // Para array
|
||||
#include <memory> // Para default_delete, shared_ptr, __shared_pt...
|
||||
#include <numeric> // Para iota
|
||||
#include <string> // Para string
|
||||
#include <utility> // Para move
|
||||
#include "utils.h" // Para PaletteColor
|
||||
#include <array> // Para array
|
||||
#include <memory> // Para default_delete, shared_ptr, __shared_pt...
|
||||
#include <numeric> // Para iota
|
||||
#include <string> // Para string
|
||||
#include <utility> // Para move
|
||||
#include "utils.h" // Para PaletteColor
|
||||
|
||||
// Alias
|
||||
using Palette = std::array<Uint32, 256>;
|
||||
@@ -44,6 +44,44 @@ struct SurfaceData
|
||||
// Evita copias accidentales
|
||||
SurfaceData(const SurfaceData &) = delete;
|
||||
SurfaceData &operator=(const SurfaceData &) = delete;
|
||||
|
||||
// Escala la superficie por un factor entero
|
||||
void scale(int factor)
|
||||
{
|
||||
if (factor <= 1)
|
||||
{
|
||||
throw std::invalid_argument("El factor debe ser mayor a 1.");
|
||||
}
|
||||
|
||||
// Calcular nuevas dimensiones
|
||||
Uint16 newWidth = width * factor;
|
||||
Uint16 newHeight = height * factor;
|
||||
|
||||
// Crear un nuevo buffer para los datos redimensionados
|
||||
auto newData = std::shared_ptr<Uint8[]>(new Uint8[newWidth * newHeight](), std::default_delete<Uint8[]>());
|
||||
|
||||
// Rellenar los datos del nuevo buffer replicando los píxeles
|
||||
for (Uint16 y = 0; y < height; ++y)
|
||||
{
|
||||
for (Uint16 x = 0; x < width; ++x)
|
||||
{
|
||||
Uint8 value = data[y * width + x]; // Obtener el valor del píxel original
|
||||
// Copiar el píxel a la región escalada
|
||||
for (int dy = 0; dy < factor; ++dy)
|
||||
{
|
||||
for (int dx = 0; dx < factor; ++dx)
|
||||
{
|
||||
newData[(y * factor + dy) * newWidth + (x * factor + dx)] = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Actualizar los datos de la superficie
|
||||
data = std::move(newData);
|
||||
width = newWidth;
|
||||
height = newHeight;
|
||||
}
|
||||
};
|
||||
|
||||
class Surface
|
||||
@@ -123,4 +161,7 @@ public:
|
||||
|
||||
// Inicializa la sub paleta
|
||||
void initializeSubPalette(SubPalette &palette) { std::iota(palette.begin(), palette.end(), 0); }
|
||||
|
||||
// Escala el tamaño de la Surface
|
||||
void scale(int factor) { surface_data_->scale(factor); }
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user