diff --git a/source/on_screen_help.cpp b/source/on_screen_help.cpp index 2798144..cadcdff 100644 --- a/source/on_screen_help.cpp +++ b/source/on_screen_help.cpp @@ -2,10 +2,11 @@ #include "screen.h" #include "asset.h" #include "input.h" -#include "text.h" #include "sprite.h" #include "texture.h" #include "lang.h" +#include "param.h" +#include // Para std::unique_ptr // [SINGLETON] Hay que definir las variables estáticas, desde el .h sólo la hemos declarado OnScreenHelp *OnScreenHelp::onScreenHelp = nullptr; @@ -50,7 +51,7 @@ OnScreenHelp *OnScreenHelp::get() } // Constructor -OnScreenHelp::OnScreenHelp() : state(OnScreenHelpStatus::showing) +OnScreenHelp::OnScreenHelp() : state(OnScreenHelpStatus::hidden) { setSize(); @@ -69,6 +70,8 @@ OnScreenHelp::~OnScreenHelp() // Actualiza la lógica interna void OnScreenHelp::update() { + // Actualiza la posición + updatePosition(); } // Muestra el objeto en pantalla @@ -88,13 +91,13 @@ void OnScreenHelp::fillTexture() SDL_SetRenderTarget(Screen::get()->getRenderer(), texture); // Crea el objeto para el texto - Text *text = new Text(Asset::get()->get("8bithud.png"), Asset::get()->get("8bithud.txt"), Screen::get()->getRenderer()); + std::unique_ptr text(new Text(Asset::get()->get("8bithud.png"), Asset::get()->get("8bithud.txt"), Screen::get()->getRenderer())); // Crea la textura con los gráficos - Texture *controllersTexture = new Texture(Screen::get()->getRenderer(), Asset::get()->get("controllers.png")); + std::unique_ptr controllersTexture(new Texture(Screen::get()->getRenderer(), Asset::get()->get("controllers.png"))); // Crea el sprite para dibujar los gráficos - Sprite *sprite = new Sprite({0, 0, 16, 16}, controllersTexture); + std::unique_ptr sprite(new Sprite({0, 0, 16, 16}, controllersTexture.get())); // Borra la textura SDL_SetRenderDrawColor(Screen::get()->getRenderer(), 0, 0, 0, 0); @@ -115,70 +118,55 @@ void OnScreenHelp::fillTexture() rect = {0, 4, dest.w, dest.h - (4 * 2)}; SDL_RenderFillRect(Screen::get()->getRenderer(), &rect); - // Dibuja los iconos y el texto - sprite->setSpriteClip(CONTROLLER_UP); - sprite->setPos(CONTROLLER_UP_POS); - sprite->render(); - text->write(CONTROLLER_UP_POS.x + DESP.x, CONTROLLER_UP_POS.y + DESP.y, lang::getText(107)); + rect = {0, 0, dest.w / 2, dest.h}; + SDL_RenderFillRect(Screen::get()->getRenderer(), &rect); - sprite->setSpriteClip(CONTROLLER_DOWN); - sprite->setPos(CONTROLLER_DOWN_POS); - sprite->render(); - text->write(CONTROLLER_DOWN_POS.x + DESP.x, CONTROLLER_DOWN_POS.y + DESP.y, lang::getText(108)); - - sprite->setSpriteClip(CONTROLLER_LEFT); - sprite->setPos(CONTROLLER_LEFT_POS); - sprite->render(); - text->write(CONTROLLER_LEFT_POS.x + DESP.x, CONTROLLER_LEFT_POS.y + DESP.y, lang::getText(109)); - - sprite->setSpriteClip(LEFT_BUTTON); - sprite->setPos(LEFT_BUTTON_POS); - sprite->render(); - text->write(LEFT_BUTTON_POS.x + DESP.x, LEFT_BUTTON_POS.y + DESP.y, lang::getText(110)); - - sprite->setSpriteClip(TOP_BUTTON); - sprite->setPos(TOP_BUTTON_POS); - sprite->render(); - text->write(TOP_BUTTON_POS.x + DESP.x, TOP_BUTTON_POS.y + DESP.y, lang::getText(111)); - - sprite->setSpriteClip(RIGHT_BUTTON); - sprite->setPos(RIGHT_BUTTON_POS); - sprite->render(); - text->write(RIGHT_BUTTON_POS.x + DESP.x, RIGHT_BUTTON_POS.y + DESP.y, lang::getText(112)); - - sprite->setSpriteClip(START_BUTTON); - sprite->setPos(START_BUTTON_POS); - sprite->render(); - text->write(START_BUTTON_POS.x + DESP.x, START_BUTTON_POS.y + DESP.y, lang::getText(113)); - - // text->write(0, 0, "hola"); + // Renderiza los botones y el texto + renderButton(sprite.get(), text.get(), CONTROLLER_UP, CONTROLLER_UP_POS, 107); + renderButton(sprite.get(), text.get(), CONTROLLER_DOWN, CONTROLLER_DOWN_POS, 108); + renderButton(sprite.get(), text.get(), CONTROLLER_LEFT, CONTROLLER_LEFT_POS, 109); + renderButton(sprite.get(), text.get(), LEFT_BUTTON, LEFT_BUTTON_POS, 110); + renderButton(sprite.get(), text.get(), TOP_BUTTON, TOP_BUTTON_POS, 111); + renderButton(sprite.get(), text.get(), RIGHT_BUTTON, RIGHT_BUTTON_POS, 112); + renderButton(sprite.get(), text.get(), START_BUTTON, START_BUTTON_POS, 113); // Restaura el destino de renderizado SDL_SetRenderTarget(Screen::get()->getRenderer(), temp); - - // Elimina los objetos - delete text; - delete controllersTexture; - delete sprite; } // Define el ancho y alto de la textura void OnScreenHelp::setSize() { const int textSize = getLargestStringSize(); - dest = (SDL_Rect){8, 8, PADDING.x + DESP.x + textSize + PADDING.x, PADDING.y + (7 * 18) + PADDING.y}; + const int width = PADDING.x + DESP.x + textSize + PADDING.x; + const int height = PADDING.y + (7 * 18) + PADDING.y; + const int x = 0; + const int y = (param.game.height - height) / 2; + + dest = (SDL_Rect){x, y, width, height}; + + hiddenPos = -width; + showingPos = 0; } // Activa o desactiva el objeto void OnScreenHelp::toggleState() { - state = state == OnScreenHelpStatus::showing ? OnScreenHelpStatus::hidden : OnScreenHelpStatus::showing; + if (state == OnScreenHelpStatus::showing || state == OnScreenHelpStatus::entering) + { + state = OnScreenHelpStatus::exitting; + } + + if (state == OnScreenHelpStatus::hidden || state == OnScreenHelpStatus::exitting) + { + state = OnScreenHelpStatus::entering; + } } // Calcula la longitud en pixels del texto más largo int OnScreenHelp::getLargestStringSize() const { - Text *text = new Text(Asset::get()->get("8bithud.png"), Asset::get()->get("8bithud.txt"), Screen::get()->getRenderer()); + std::unique_ptr text(new Text(Asset::get()->get("8bithud.png"), Asset::get()->get("8bithud.txt"), Screen::get()->getRenderer())); int size = 0; for (int i = 107; i <= 113; ++i) @@ -187,6 +175,57 @@ int OnScreenHelp::getLargestStringSize() const size = textSize > size ? textSize : size; } - delete text; return size; +} + +// Renderizara el boton y el texto +void OnScreenHelp::renderButton(Sprite *sprite, Text *text, const SDL_Rect &buttonClip, const SDL_Rect &buttonPos, int textId) +{ + sprite->setSpriteClip(buttonClip); + sprite->setPos(buttonPos); + sprite->render(); + text->write(buttonPos.x + DESP.x, buttonPos.y + DESP.y, lang::getText(textId)); +} + +// Actualiza la posición +void OnScreenHelp::updatePosition() +{ + switch (state) + { + case OnScreenHelpStatus::hidden: + dest.x = hiddenPos; + break; + + case OnScreenHelpStatus::showing: + dest.x = showingPos; + break; + + case OnScreenHelpStatus::exitting: + if (dest.x > hiddenPos) + { + dest.x -= 8; + } + else + { + state = OnScreenHelpStatus::hidden; + } + break; + + case OnScreenHelpStatus::entering: + if (dest.x < showingPos) + { + dest.x += 8; + } + else + { + state = OnScreenHelpStatus::showing; + } + break; + + default: + break; + } + + dest.x = std::max(hiddenPos, dest.x); + dest.x = std::min(showingPos, dest.x); } \ No newline at end of file diff --git a/source/on_screen_help.h b/source/on_screen_help.h index a272d2f..2ce1773 100644 --- a/source/on_screen_help.h +++ b/source/on_screen_help.h @@ -1,6 +1,7 @@ #pragma once #include +#include "text.h" class Screen; class Asset; class Input; @@ -22,12 +23,9 @@ private: // [SINGLETON] Objeto screen privado para Don Melitón static OnScreenHelp *onScreenHelp; - Screen *screen; // Objeto encargado de dibujar en pantalla - Asset *asset; // Objeto con los ficheros de recursos - Input *input; // Objeto pata gestionar la entrada - - SDL_Texture *texture; // Textura donde dibujar - SDL_Rect dest; // Posición donde dibujar la textura; + SDL_Texture *texture; // Textura donde dibujar + SDL_Rect dest; // Posición donde dibujar la textura; + int hiddenPos, showingPos; // Las dos posiciones donde colocar la textura OnScreenHelpStatus state; // Estado del objeto @@ -48,6 +46,12 @@ private: // Calcula la longitud en pixels del texto más largo int getLargestStringSize() const; + // Renderizara el boton y el texto + void renderButton(Sprite *sprite, Text *text, const SDL_Rect &buttonClip, const SDL_Rect &buttonPos, int textId); + + // Actualiza la posición + void updatePosition(); + public: // [SINGLETON] Crearemos el objeto screen con esta función estática static void init(); diff --git a/source/screen.cpp b/source/screen.cpp index 5403277..cda6272 100644 --- a/source/screen.cpp +++ b/source/screen.cpp @@ -344,6 +344,7 @@ void Screen::update() updateShake(); notify->update(); updateFPS(); + OnScreenHelp::get()->update(); } // Comprueba las entradas