#include "tiled_bg.h" #include // Para SDL_PIXELFORMAT_RGBA8888 #include // Para rand #include // Para sin #include // Para unique_ptr, make_unique #include "resource.h" // Para Resource #include "screen.h" // Para Screen #include "sprite.h" // Para Sprite // 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(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(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(); }