La tarjeta d'ajuda ix pero no s'amaga
This commit is contained in:
@@ -2,10 +2,11 @@
|
|||||||
#include "screen.h"
|
#include "screen.h"
|
||||||
#include "asset.h"
|
#include "asset.h"
|
||||||
#include "input.h"
|
#include "input.h"
|
||||||
#include "text.h"
|
|
||||||
#include "sprite.h"
|
#include "sprite.h"
|
||||||
#include "texture.h"
|
#include "texture.h"
|
||||||
#include "lang.h"
|
#include "lang.h"
|
||||||
|
#include "param.h"
|
||||||
|
#include <memory> // Para std::unique_ptr
|
||||||
|
|
||||||
// [SINGLETON] Hay que definir las variables estáticas, desde el .h sólo la hemos declarado
|
// [SINGLETON] Hay que definir las variables estáticas, desde el .h sólo la hemos declarado
|
||||||
OnScreenHelp *OnScreenHelp::onScreenHelp = nullptr;
|
OnScreenHelp *OnScreenHelp::onScreenHelp = nullptr;
|
||||||
@@ -50,7 +51,7 @@ OnScreenHelp *OnScreenHelp::get()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Constructor
|
// Constructor
|
||||||
OnScreenHelp::OnScreenHelp() : state(OnScreenHelpStatus::showing)
|
OnScreenHelp::OnScreenHelp() : state(OnScreenHelpStatus::hidden)
|
||||||
{
|
{
|
||||||
setSize();
|
setSize();
|
||||||
|
|
||||||
@@ -69,6 +70,8 @@ OnScreenHelp::~OnScreenHelp()
|
|||||||
// Actualiza la lógica interna
|
// Actualiza la lógica interna
|
||||||
void OnScreenHelp::update()
|
void OnScreenHelp::update()
|
||||||
{
|
{
|
||||||
|
// Actualiza la posición
|
||||||
|
updatePosition();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Muestra el objeto en pantalla
|
// Muestra el objeto en pantalla
|
||||||
@@ -88,13 +91,13 @@ void OnScreenHelp::fillTexture()
|
|||||||
SDL_SetRenderTarget(Screen::get()->getRenderer(), texture);
|
SDL_SetRenderTarget(Screen::get()->getRenderer(), texture);
|
||||||
|
|
||||||
// Crea el objeto para el texto
|
// 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> text(new Text(Asset::get()->get("8bithud.png"), Asset::get()->get("8bithud.txt"), Screen::get()->getRenderer()));
|
||||||
|
|
||||||
// Crea la textura con los gráficos
|
// Crea la textura con los gráficos
|
||||||
Texture *controllersTexture = new Texture(Screen::get()->getRenderer(), Asset::get()->get("controllers.png"));
|
std::unique_ptr<Texture> controllersTexture(new Texture(Screen::get()->getRenderer(), Asset::get()->get("controllers.png")));
|
||||||
|
|
||||||
// Crea el sprite para dibujar los gráficos
|
// Crea el sprite para dibujar los gráficos
|
||||||
Sprite *sprite = new Sprite({0, 0, 16, 16}, controllersTexture);
|
std::unique_ptr<Sprite> sprite(new Sprite({0, 0, 16, 16}, controllersTexture.get()));
|
||||||
|
|
||||||
// Borra la textura
|
// Borra la textura
|
||||||
SDL_SetRenderDrawColor(Screen::get()->getRenderer(), 0, 0, 0, 0);
|
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)};
|
rect = {0, 4, dest.w, dest.h - (4 * 2)};
|
||||||
SDL_RenderFillRect(Screen::get()->getRenderer(), &rect);
|
SDL_RenderFillRect(Screen::get()->getRenderer(), &rect);
|
||||||
|
|
||||||
// Dibuja los iconos y el texto
|
rect = {0, 0, dest.w / 2, dest.h};
|
||||||
sprite->setSpriteClip(CONTROLLER_UP);
|
SDL_RenderFillRect(Screen::get()->getRenderer(), &rect);
|
||||||
sprite->setPos(CONTROLLER_UP_POS);
|
|
||||||
sprite->render();
|
|
||||||
text->write(CONTROLLER_UP_POS.x + DESP.x, CONTROLLER_UP_POS.y + DESP.y, lang::getText(107));
|
|
||||||
|
|
||||||
sprite->setSpriteClip(CONTROLLER_DOWN);
|
// Renderiza los botones y el texto
|
||||||
sprite->setPos(CONTROLLER_DOWN_POS);
|
renderButton(sprite.get(), text.get(), CONTROLLER_UP, CONTROLLER_UP_POS, 107);
|
||||||
sprite->render();
|
renderButton(sprite.get(), text.get(), CONTROLLER_DOWN, CONTROLLER_DOWN_POS, 108);
|
||||||
text->write(CONTROLLER_DOWN_POS.x + DESP.x, CONTROLLER_DOWN_POS.y + DESP.y, lang::getText(108));
|
renderButton(sprite.get(), text.get(), CONTROLLER_LEFT, CONTROLLER_LEFT_POS, 109);
|
||||||
|
renderButton(sprite.get(), text.get(), LEFT_BUTTON, LEFT_BUTTON_POS, 110);
|
||||||
sprite->setSpriteClip(CONTROLLER_LEFT);
|
renderButton(sprite.get(), text.get(), TOP_BUTTON, TOP_BUTTON_POS, 111);
|
||||||
sprite->setPos(CONTROLLER_LEFT_POS);
|
renderButton(sprite.get(), text.get(), RIGHT_BUTTON, RIGHT_BUTTON_POS, 112);
|
||||||
sprite->render();
|
renderButton(sprite.get(), text.get(), START_BUTTON, START_BUTTON_POS, 113);
|
||||||
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");
|
|
||||||
|
|
||||||
// Restaura el destino de renderizado
|
// Restaura el destino de renderizado
|
||||||
SDL_SetRenderTarget(Screen::get()->getRenderer(), temp);
|
SDL_SetRenderTarget(Screen::get()->getRenderer(), temp);
|
||||||
|
|
||||||
// Elimina los objetos
|
|
||||||
delete text;
|
|
||||||
delete controllersTexture;
|
|
||||||
delete sprite;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Define el ancho y alto de la textura
|
// Define el ancho y alto de la textura
|
||||||
void OnScreenHelp::setSize()
|
void OnScreenHelp::setSize()
|
||||||
{
|
{
|
||||||
const int textSize = getLargestStringSize();
|
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
|
// Activa o desactiva el objeto
|
||||||
void OnScreenHelp::toggleState()
|
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
|
// Calcula la longitud en pixels del texto más largo
|
||||||
int OnScreenHelp::getLargestStringSize() const
|
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> text(new Text(Asset::get()->get("8bithud.png"), Asset::get()->get("8bithud.txt"), Screen::get()->getRenderer()));
|
||||||
int size = 0;
|
int size = 0;
|
||||||
|
|
||||||
for (int i = 107; i <= 113; ++i)
|
for (int i = 107; i <= 113; ++i)
|
||||||
@@ -187,6 +175,57 @@ int OnScreenHelp::getLargestStringSize() const
|
|||||||
size = textSize > size ? textSize : size;
|
size = textSize > size ? textSize : size;
|
||||||
}
|
}
|
||||||
|
|
||||||
delete text;
|
|
||||||
return size;
|
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);
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <SDL2/SDL.h>
|
#include <SDL2/SDL.h>
|
||||||
|
#include "text.h"
|
||||||
class Screen;
|
class Screen;
|
||||||
class Asset;
|
class Asset;
|
||||||
class Input;
|
class Input;
|
||||||
@@ -22,12 +23,9 @@ private:
|
|||||||
// [SINGLETON] Objeto screen privado para Don Melitón
|
// [SINGLETON] Objeto screen privado para Don Melitón
|
||||||
static OnScreenHelp *onScreenHelp;
|
static OnScreenHelp *onScreenHelp;
|
||||||
|
|
||||||
Screen *screen; // Objeto encargado de dibujar en pantalla
|
SDL_Texture *texture; // Textura donde dibujar
|
||||||
Asset *asset; // Objeto con los ficheros de recursos
|
SDL_Rect dest; // Posición donde dibujar la textura;
|
||||||
Input *input; // Objeto pata gestionar la entrada
|
int hiddenPos, showingPos; // Las dos posiciones donde colocar la textura
|
||||||
|
|
||||||
SDL_Texture *texture; // Textura donde dibujar
|
|
||||||
SDL_Rect dest; // Posición donde dibujar la textura;
|
|
||||||
|
|
||||||
OnScreenHelpStatus state; // Estado del objeto
|
OnScreenHelpStatus state; // Estado del objeto
|
||||||
|
|
||||||
@@ -48,6 +46,12 @@ private:
|
|||||||
// Calcula la longitud en pixels del texto más largo
|
// Calcula la longitud en pixels del texto más largo
|
||||||
int getLargestStringSize() const;
|
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:
|
public:
|
||||||
// [SINGLETON] Crearemos el objeto screen con esta función estática
|
// [SINGLETON] Crearemos el objeto screen con esta función estática
|
||||||
static void init();
|
static void init();
|
||||||
|
|||||||
@@ -344,6 +344,7 @@ void Screen::update()
|
|||||||
updateShake();
|
updateShake();
|
||||||
notify->update();
|
notify->update();
|
||||||
updateFPS();
|
updateFPS();
|
||||||
|
OnScreenHelp::get()->update();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Comprueba las entradas
|
// Comprueba las entradas
|
||||||
|
|||||||
Reference in New Issue
Block a user