100 lines
2.9 KiB
C++
100 lines
2.9 KiB
C++
#include "tiled_bg.h"
|
|
#include <SDL2/SDL_pixels.h> // para SDL_PIXELFORMAT_RGBA8888
|
|
#include <stdlib.h> // para rand
|
|
#include <memory> // para unique_ptr, make_shared, make_unique
|
|
#include <cmath> // para sinf
|
|
#include "resource.h" // para Resource
|
|
#include "screen.h" // para Screen
|
|
#include "sprite.h" // para Sprite
|
|
#include "texture.h" // para Texture
|
|
|
|
// Constructor
|
|
TiledBG::TiledBG(SDL_Rect pos, TiledBGMode mode)
|
|
: renderer_(Screen::get()->getRenderer()),
|
|
pos_(pos),
|
|
// Coloca la ventana que recorre el mosaico de fondo de manera que coincida
|
|
// con el mosaico que hay pintado en el titulo al iniciar
|
|
window_({128, 96, pos_.w, pos_.h}),
|
|
mode_(mode == TiledBGMode::RANDOM ? static_cast<TiledBGMode>(rand() % 2) : mode)
|
|
{
|
|
// Crea la textura para el mosaico de fondo
|
|
canvas_ = SDL_CreateTexture(renderer_, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, pos_.w * 2, pos_.h * 2);
|
|
|
|
// Rellena la textura con el contenido
|
|
fillTexture();
|
|
|
|
// Inicializa los valores del vector con los valores del seno
|
|
for (int i = 0; i < 360; ++i)
|
|
{
|
|
sin_[i] = std::sin(i * 3.14159 / 180.0); // Convierte grados a radianes y calcula el seno
|
|
}
|
|
}
|
|
|
|
// Destructor
|
|
TiledBG::~TiledBG()
|
|
{
|
|
SDL_DestroyTexture(canvas_);
|
|
}
|
|
|
|
// Rellena la textura con el contenido
|
|
void TiledBG::fillTexture()
|
|
{
|
|
// Crea los objetos para pintar en la textura de fondo
|
|
auto tile = std::make_unique<Sprite>(Resource::get()->getTexture("title_bg_tile.png"), (SDL_Rect){0, 0, TILE_WIDTH_, TILE_HEIGHT_});
|
|
|
|
// Prepara para dibujar sobre la textura
|
|
auto temp = SDL_GetRenderTarget(renderer_);
|
|
SDL_SetRenderTarget(renderer_, canvas_);
|
|
|
|
// Rellena la textura con el tile
|
|
const auto i_max = pos_.w * 2 / TILE_WIDTH_;
|
|
const auto j_max = pos_.h * 2 / TILE_HEIGHT_;
|
|
tile->setSpriteClip(0, 0, TILE_WIDTH_, TILE_HEIGHT_);
|
|
for (int i = 0; i < i_max; ++i)
|
|
{
|
|
for (int j = 0; j < j_max; ++j)
|
|
{
|
|
tile->setX(i * TILE_WIDTH_);
|
|
tile->setY(j * TILE_HEIGHT_);
|
|
tile->render();
|
|
}
|
|
}
|
|
|
|
// Vuelve a colocar el renderizador como estaba
|
|
SDL_SetRenderTarget(renderer_, temp);
|
|
}
|
|
|
|
// Pinta la clase en pantalla
|
|
void TiledBG::render()
|
|
{
|
|
SDL_RenderCopy(renderer_, canvas_, &window_, &pos_);
|
|
}
|
|
|
|
// Actualiza la lógica de la clase
|
|
void TiledBG::update()
|
|
{
|
|
switch (mode_)
|
|
{
|
|
case TiledBGMode::DIAGONAL:
|
|
{ // El tileado de fondo se desplaza en diagonal
|
|
++window_.x %= TILE_WIDTH_;
|
|
++window_.y %= TILE_HEIGHT_;
|
|
break;
|
|
}
|
|
case TiledBGMode::CIRCLE:
|
|
{ // El tileado de fondo se desplaza en circulo
|
|
++counter_ %= 360;
|
|
window_.x = 128 + (int(sin_[(counter_ + 270) % 360] * 128));
|
|
window_.y = 96 + (int(sin_[(360 - counter_) % 360] * 96));
|
|
break;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
// Recarga las texturas
|
|
void TiledBG::reLoad()
|
|
{
|
|
fillTexture();
|
|
} |