Separados los elementos de la pantalla en diferentes texturas

This commit is contained in:
2022-09-22 12:42:37 +02:00
parent 5806f7352f
commit c97063e728
11 changed files with 339 additions and 27 deletions

View File

@@ -20,6 +20,12 @@ Game::Game(SDL_Renderer *renderer, Screen *screen, Asset *asset, Input *input, D
enemyEngine = new EnemyEngine(renderer, asset, player, map, asset->get(map->getEnemyFile()));
music = JA_LoadMusic(asset->get("music_surface.ogg").c_str());
// Crea la textura para dibujar los sprites
spriteLayer = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, PLAY_AREA_WIDTH, PLAY_AREA_HEIGHT);
if (spriteLayer == nullptr)
printf("Error: map_layer0 could not be created!\nSDL Error: %s\n", SDL_GetError());
SDL_SetTextureBlendMode(spriteLayer, SDL_BLENDMODE_BLEND);
// Inicializa variables
ticks = 0;
ticksSpeed = 15;
@@ -36,6 +42,8 @@ Game::Game(SDL_Renderer *renderer, Screen *screen, Asset *asset, Input *input, D
// Destructor
Game::~Game()
{
SDL_DestroyTexture(spriteLayer);
delete scoreboard;
delete eventHandler;
delete itemTracker;
@@ -96,21 +104,58 @@ void Game::update()
// Pinta los objetos en pantalla
void Game::render()
{
// Rellena las texturas
fillSpriteTexture();
scoreboard->fillTexture();
// Prepara para dibujar el frame
screen->start();
screen->clean();
// Dibuja los objetos
map->render();
enemyEngine->render();
player->render();
// Dibuja la capa 0
map->renderLayer0();
// Dibuja la capa 1
map->renderLayer1();
// Dibuja la capa de sprites
renderSprites();
// Dibuja el marcador
scoreboard->render();
// Dibuja la información de debug
renderDebugInfo();
// Actualiza la pantalla
screen->blit();
}
// Dibuja los sprites en la textura
void Game::fillSpriteTexture()
{
// Cambia el puntero del renderizador a la textura y la limpia
SDL_SetRenderTarget(renderer, spriteLayer);
SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00);
SDL_RenderClear(renderer);
// Dibuja los sprites en la textura
map->renderActors();
enemyEngine->render();
player->render();
// Vuelve a colocar el renderizador apuntando a la pantalla
SDL_SetRenderTarget(renderer, nullptr);
}
// Dibuja los sprites
void Game::renderSprites()
{
// Copia la textura al renderizador
SDL_Rect rect = {PLAY_AREA_X, PLAY_AREA_Y, PLAY_AREA_WIDTH, PLAY_AREA_HEIGHT};
SDL_RenderCopy(renderer, spriteLayer, NULL, &rect);
}
// Comprueba los eventos de la cola
void Game::checkEventHandler()
{
@@ -218,12 +263,13 @@ void Game::renderDebugInfo()
}
// Pinta mascaras
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 128);
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 192);
SDL_Rect rect = player->sprite->getRect();
rect.y += SCOREBOARD_HEIGHT;
SDL_RenderFillRect(renderer, &rect);
// Pinta el texto
debug->setPos({1, PLAY_AREA_TOP});
debug->setPos({1, 1 + SCOREBOARD_HEIGHT});
debug->render();
}