afegida funció per a escalar surfaces
This commit is contained in:
@@ -19,6 +19,7 @@ void Logo::init()
|
|||||||
{
|
{
|
||||||
Screen::get()->init();
|
Screen::get()->init();
|
||||||
logo_surface = std::make_shared<Surface>("jailgames.gif");
|
logo_surface = std::make_shared<Surface>("jailgames.gif");
|
||||||
|
logo_surface->scale(5);
|
||||||
logo_sprite = std::make_unique<SSprite>(logo_surface);
|
logo_sprite = std::make_unique<SSprite>(logo_surface);
|
||||||
logo_sprite->setPosition(
|
logo_sprite->setPosition(
|
||||||
(options.game.width - logo_sprite->getWidth()) / 2,
|
(options.game.width - logo_sprite->getWidth()) / 2,
|
||||||
|
|||||||
@@ -44,6 +44,44 @@ struct SurfaceData
|
|||||||
// Evita copias accidentales
|
// Evita copias accidentales
|
||||||
SurfaceData(const SurfaceData &) = delete;
|
SurfaceData(const SurfaceData &) = delete;
|
||||||
SurfaceData &operator=(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
|
class Surface
|
||||||
@@ -123,4 +161,7 @@ public:
|
|||||||
|
|
||||||
// Inicializa la sub paleta
|
// Inicializa la sub paleta
|
||||||
void initializeSubPalette(SubPalette &palette) { std::iota(palette.begin(), palette.end(), 0); }
|
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