Commitet pa gastar el Cppcheck

This commit is contained in:
2024-10-08 20:32:24 +02:00
parent c00f4326ae
commit 3e3d764b25
12 changed files with 241 additions and 405 deletions

View File

@@ -117,11 +117,11 @@ Director::~Director()
Asset::destroy();
Input::destroy();
//Screen::destroy();
Screen::destroy();
OnScreenHelp::destroy();
deleteSounds();
deleteMusics();
sounds.clear();
musics.clear();
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
@@ -593,30 +593,10 @@ void Director::loadMusics()
}
}
// Libera la memoria usada por los sonidos del juego
void Director::deleteSounds()
{
for (auto s : sounds)
{
JA_DeleteSound(s.file);
}
sounds.clear();
}
// Libera la memoria usada por las músicas del juego
void Director::deleteMusics()
{
for (auto m : musics)
{
JA_DeleteMusic(m.file);
}
musics.clear();
}
// Ejecuta la sección con el logo
void Director::runLogo()
{
Logo *logo = new Logo();
auto *logo = new Logo();
logo->run();
delete logo;
}
@@ -624,7 +604,7 @@ void Director::runLogo()
// Ejecuta la sección con la secuencia de introducción
void Director::runIntro()
{
Intro *intro = new Intro(getMusic(musics, "intro.ogg"));
auto *intro = new Intro(getMusic(musics, "intro.ogg"));
intro->run();
delete intro;
}
@@ -632,7 +612,7 @@ void Director::runIntro()
// Ejecuta la sección con el titulo del juego
void Director::runTitle()
{
Title *title = new Title(getMusic(musics, "title.ogg"));
auto *title = new Title(getMusic(musics, "title.ogg"));
title->run();
delete title;
}
@@ -640,9 +620,9 @@ void Director::runTitle()
// Ejecuta la sección donde se juega al juego
void Director::runGame()
{
const int playerID = section::options == section::OPTIONS_GAME_PLAY_1P ? 1 : 2;
const int currentStage = 0;
Game *game = new Game(playerID, currentStage, GAME_MODE_DEMO_OFF, getMusic(musics, "playing.ogg"));
const auto playerID = section::options == section::OPTIONS_GAME_PLAY_1P ? 1 : 2;
constexpr auto currentStage = 0;
auto *game = new Game(playerID, currentStage, GAME_MODE_DEMO_OFF, getMusic(musics, "playing.ogg"));
game->run();
delete game;
}
@@ -650,7 +630,7 @@ void Director::runGame()
// Ejecuta la sección donde se muestran las instrucciones
void Director::runInstructions()
{
Instructions *instructions = new Instructions(getMusic(musics, "title.ogg"));
auto *instructions = new Instructions(getMusic(musics, "title.ogg"));
instructions->run();
delete instructions;
}
@@ -658,7 +638,7 @@ void Director::runInstructions()
// Ejecuta la sección donde se muestra la tabla de puntuaciones
void Director::runHiScoreTable()
{
HiScoreTable *hiScoreTable = new HiScoreTable(getMusic(musics, "title.ogg"));
auto *hiScoreTable = new HiScoreTable(getMusic(musics, "title.ogg"));
hiScoreTable->run();
delete hiScoreTable;
}
@@ -666,9 +646,9 @@ void Director::runHiScoreTable()
// Ejecuta el juego en modo demo
void Director::runDemoGame()
{
const int playerID = (rand() % 2) + 1;
const int currentStage = 0;
Game *game = new Game(playerID, currentStage, GAME_MODE_DEMO_ON, nullptr);
const auto playerID = (rand() % 2) + 1;
constexpr auto currentStage = 0;
auto *game = new Game(playerID, currentStage, GAME_MODE_DEMO_ON, nullptr);
game->run();
delete game;
}

View File

@@ -45,12 +45,6 @@ private:
// Carga las musicas del juego
void loadMusics();
// Libera la memoria usada por los sonidos del juego
void deleteSounds();
// Libera la memoria usada por las músicas del juego
void deleteMusics();
// Comprueba los parametros del programa
void checkProgramArguments(int argc, char *argv[]);

View File

@@ -1,40 +1,36 @@
#include "game_logo.h"
#include <algorithm> // for max
#include <string> // for basic_string
#include "animated_sprite.h" // for AnimatedSprite
#include "animated_sprite.h" // for AnimatedSprite
#include "asset.h" // for Asset
#include "jail_audio.h" // for JA_DeleteSound, JA_LoadSound, JA_PlaySound
#include "param.h" // for param
#include "screen.h" // for Screen
#include "smart_sprite.h" // for SmartSprite
#include "smart_sprite.h" // for SmartSprite
#include "sprite.h" // for Sprite
#include "texture.h" // for Texture
#include "utils.h" // for param_t, paramGame_t, paramTitle_t
// Constructor
GameLogo::GameLogo(int x, int y)
: x(x), y(y)
{
// Copia los punteros
screen = Screen::get();
renderer = screen->getRenderer();
asset = Asset::get();
this->x = x;
this->y = y;
// Crea los objetos
dustTexture = new Texture(renderer, asset->get("title_dust.png"));
coffeeTexture = new Texture(renderer, asset->get("title_coffee.png"));
crisisTexture = new Texture(renderer, asset->get("title_crisis.png"));
arcadeEditionTexture = new Texture(renderer, asset->get("title_arcade_edition.png"));
dustTexture = std::make_unique<Texture>(Screen::get()->getRenderer(), Asset::get()->get("title_dust.png"));
coffeeTexture = std::make_unique<Texture>(Screen::get()->getRenderer(), Asset::get()->get("title_coffee.png"));
crisisTexture = std::make_unique<Texture>(Screen::get()->getRenderer(), Asset::get()->get("title_crisis.png"));
arcadeEditionTexture = std::make_unique<Texture>(Screen::get()->getRenderer(), Asset::get()->get("title_arcade_edition.png"));
coffeeBitmap = new SmartSprite(coffeeTexture);
crisisBitmap = new SmartSprite(crisisTexture);
arcadeEditionBitmap = new Sprite((param.game.width - arcadeEditionTexture->getWidth()) / 2, param.title.arcadeEditionPosition, arcadeEditionTexture->getWidth(), arcadeEditionTexture->getHeight(), arcadeEditionTexture);
dustBitmapL = new AnimatedSprite(dustTexture, asset->get("title_dust.ani"));
dustBitmapR = new AnimatedSprite(dustTexture, asset->get("title_dust.ani"));
coffeeSprite = std::make_unique<SmartSprite>(coffeeTexture.get());
crisisSprite = std::make_unique<SmartSprite>(crisisTexture.get());
arcadeEditionSprite = std::make_unique<Sprite>((param.game.width - arcadeEditionTexture->getWidth()) / 2, param.title.arcadeEditionPosition, arcadeEditionTexture->getWidth(), arcadeEditionTexture->getHeight(), arcadeEditionTexture.get());
dustLSprite = std::make_unique<AnimatedSprite>(dustTexture.get(), Asset::get()->get("title_dust.ani"));
dustRSprite = std::make_unique<AnimatedSprite>(dustTexture.get(), Asset::get()->get("title_dust.ani"));
// Sonidos
crashSound = JA_LoadSound(asset->get("title.wav").c_str());
crashSound = JA_LoadSound(Asset::get()->get("title.wav").c_str());
// Inicializa las variables
init();
@@ -43,28 +39,17 @@ GameLogo::GameLogo(int x, int y)
// Destructor
GameLogo::~GameLogo()
{
delete dustTexture;
delete coffeeTexture;
delete crisisTexture;
delete arcadeEditionTexture;
delete coffeeBitmap;
delete crisisBitmap;
delete arcadeEditionBitmap;
delete dustBitmapL;
delete dustBitmapR;
JA_DeleteSound(crashSound);
}
// Inicializa las variables
void GameLogo::init()
{
const int xp = x - coffeeBitmap->getWidth() / 2;
const int desp = getInitialVerticalDesp();
const auto xp = x - coffeeSprite->getWidth() / 2;
const auto desp = getInitialVerticalDesp();
// Variables
status = disabled;
status = Status::DISABLED;
shake.desp = 1;
shake.delay = 2;
shake.lenght = 8;
@@ -73,90 +58,89 @@ void GameLogo::init()
shake.origin = xp;
// Inicializa el bitmap de 'Coffee'
coffeeBitmap->init();
coffeeBitmap->setPosX(xp);
coffeeBitmap->setPosY(y - coffeeTexture->getHeight() - desp);
coffeeBitmap->setWidth(coffeeTexture->getWidth());
coffeeBitmap->setHeight(coffeeTexture->getHeight());
coffeeBitmap->setVelX(0.0f);
coffeeBitmap->setVelY(2.5f);
coffeeBitmap->setAccelX(0.0f);
coffeeBitmap->setAccelY(0.1f);
coffeeBitmap->setSpriteClip(0, 0, coffeeTexture->getWidth(), coffeeTexture->getHeight());
coffeeBitmap->setEnabled(true);
coffeeBitmap->setEnabledCounter(0);
coffeeBitmap->setDestX(xp);
coffeeBitmap->setDestY(y - coffeeTexture->getHeight());
coffeeSprite->init();
coffeeSprite->setPosX(xp);
coffeeSprite->setPosY(y - coffeeTexture->getHeight() - desp);
coffeeSprite->setWidth(coffeeTexture->getWidth());
coffeeSprite->setHeight(coffeeTexture->getHeight());
coffeeSprite->setVelX(0.0f);
coffeeSprite->setVelY(2.5f);
coffeeSprite->setAccelX(0.0f);
coffeeSprite->setAccelY(0.1f);
coffeeSprite->setSpriteClip(0, 0, coffeeTexture->getWidth(), coffeeTexture->getHeight());
coffeeSprite->setEnabled(true);
coffeeSprite->setEnabledCounter(0);
coffeeSprite->setDestX(xp);
coffeeSprite->setDestY(y - coffeeTexture->getHeight());
// Inicializa el bitmap de 'Crisis'
crisisBitmap->init();
crisisBitmap->setPosX(xp + 15);
crisisBitmap->setPosY(y + desp);
crisisBitmap->setWidth(crisisTexture->getWidth());
crisisBitmap->setHeight(crisisTexture->getHeight());
crisisBitmap->setVelX(0.0f);
crisisBitmap->setVelY(-2.5f);
crisisBitmap->setAccelX(0.0f);
crisisBitmap->setAccelY(-0.1f);
crisisBitmap->setSpriteClip(0, 0, crisisTexture->getWidth(), crisisTexture->getHeight());
crisisBitmap->setEnabled(true);
crisisBitmap->setEnabledCounter(0);
crisisBitmap->setDestX(xp + 15);
crisisBitmap->setDestY(y);
crisisSprite->init();
crisisSprite->setPosX(xp + 15);
crisisSprite->setPosY(y + desp);
crisisSprite->setWidth(crisisTexture->getWidth());
crisisSprite->setHeight(crisisTexture->getHeight());
crisisSprite->setVelX(0.0f);
crisisSprite->setVelY(-2.5f);
crisisSprite->setAccelX(0.0f);
crisisSprite->setAccelY(-0.1f);
crisisSprite->setSpriteClip(0, 0, crisisTexture->getWidth(), crisisTexture->getHeight());
crisisSprite->setEnabled(true);
crisisSprite->setEnabledCounter(0);
crisisSprite->setDestX(xp + 15);
crisisSprite->setDestY(y);
// Inicializa el bitmap de 'DustRight'
dustBitmapR->resetAnimation();
dustBitmapR->setPosX(coffeeBitmap->getPosX() + coffeeBitmap->getWidth());
dustBitmapR->setPosY(y);
dustBitmapR->setWidth(16);
dustBitmapR->setHeight(16);
dustBitmapR->setFlip(SDL_FLIP_HORIZONTAL);
dustRSprite->resetAnimation();
dustRSprite->setPosX(coffeeSprite->getPosX() + coffeeSprite->getWidth());
dustRSprite->setPosY(y);
dustRSprite->setWidth(16);
dustRSprite->setHeight(16);
dustRSprite->setFlip(SDL_FLIP_HORIZONTAL);
// Inicializa el bitmap de 'DustLeft'
dustBitmapL->resetAnimation();
dustBitmapL->setPosX(coffeeBitmap->getPosX() - 16);
dustBitmapL->setPosY(y);
dustBitmapL->setWidth(16);
dustBitmapL->setHeight(16);
dustLSprite->resetAnimation();
dustLSprite->setPosX(coffeeSprite->getPosX() - 16);
dustLSprite->setPosY(y);
dustLSprite->setWidth(16);
dustLSprite->setHeight(16);
}
// Pinta la clase en pantalla
void GameLogo::render()
{
// Dibuja el logo
coffeeBitmap->render();
crisisBitmap->render();
coffeeSprite->render();
crisisSprite->render();
if (status == finished)
arcadeEditionBitmap->render();
if (status == Status::FINISHED)
{
arcadeEditionSprite->render();
}
// Dibuja el polvillo del logo
dustBitmapR->render();
dustBitmapL->render();
dustRSprite->render();
dustLSprite->render();
}
// Actualiza la lógica de la clase
void GameLogo::update()
{
if (status == moving)
if (status == Status::MOVING)
{
coffeeBitmap->update();
crisisBitmap->update();
coffeeSprite->update();
crisisSprite->update();
// Si los objetos han llegado a su destino, cambiamos de Sección
if (coffeeBitmap->hasFinished() && crisisBitmap->hasFinished())
if (coffeeSprite->hasFinished() && crisisSprite->hasFinished())
{
status = shaking;
// Pantallazo blanco
//screen->flash(flashColor, 10);
status = Status::SHAKING;
// Reproduce el efecto sonoro
JA_PlaySound(crashSound);
}
}
else if (status == shaking)
else if (status == Status::SHAKING)
{
// Agita el logo
if (shake.remaining > 0)
@@ -168,27 +152,27 @@ void GameLogo::update()
else
{
shake.counter = shake.delay;
const int desp = shake.remaining % 2 == 0 ? shake.desp * (-1) : shake.desp;
coffeeBitmap->setPosX(shake.origin + desp);
crisisBitmap->setPosX(shake.origin + desp + 15);
const auto desp = shake.remaining % 2 == 0 ? shake.desp * (-1) : shake.desp;
coffeeSprite->setPosX(shake.origin + desp);
crisisSprite->setPosX(shake.origin + desp + 15);
shake.remaining--;
}
}
else
{
coffeeBitmap->setPosX(shake.origin);
crisisBitmap->setPosX(shake.origin + 15);
status = finished;
coffeeSprite->setPosX(shake.origin);
crisisSprite->setPosX(shake.origin + 15);
status = Status::FINISHED;
}
dustBitmapR->update();
dustBitmapL->update();
dustRSprite->update();
dustLSprite->update();
}
else if (status == finished)
else if (status == Status::FINISHED)
{
dustBitmapR->update();
dustBitmapL->update();
dustRSprite->update();
dustLSprite->update();
}
}
@@ -196,13 +180,13 @@ void GameLogo::update()
void GameLogo::enable()
{
init();
status = moving;
status = Status::MOVING;
}
// Indica si ha terminado la animación
bool GameLogo::hasFinished()
bool GameLogo::hasFinished() const
{
return (status == finished);
return status == Status::FINISHED;
}
// Recarga las texturas
@@ -216,8 +200,8 @@ void GameLogo::reLoad()
// Calcula el desplazamiento vertical inicial
int GameLogo::getInitialVerticalDesp()
{
int despUp = y;
int despDown = param.game.height - y;
auto despUp = y;
auto despDown = param.game.height - y;
return std::max(despUp, despDown);
}

View File

@@ -1,12 +1,13 @@
#pragma once
#include <SDL2/SDL_render.h> // for SDL_Renderer
class AnimatedSprite;
class Asset;
class Screen;
class SmartSprite;
class Sprite;
class Texture;
#include <SDL2/SDL_render.h> // for SDL_Renderer
#include <memory>
#include "texture.h"
#include "animated_sprite.h"
#include "smart_sprite.h"
#include "sprite.h"
struct JA_Sound_t;
// Clase GameLogo
@@ -14,22 +15,18 @@ class GameLogo
{
private:
// Objetos y punteros
SDL_Renderer *renderer; // El renderizador de la ventana
Screen *screen; // Objeto encargado de dibujar en pantalla
Asset *asset; // Objeto que gestiona todos los ficheros de recursos
std::unique_ptr<Texture> dustTexture; // Textura con los graficos del polvo
std::unique_ptr<Texture> coffeeTexture; // Textura con los graficos de la palabra "COFFEE"
std::unique_ptr<Texture> crisisTexture; // Textura con los graficos de la plabra "CRISIS"
std::unique_ptr<Texture> arcadeEditionTexture; // Textura con los graficos de "Arcade Edition"
Texture *dustTexture; // Textura con los graficos del polvo
Texture *coffeeTexture; // Textura con los graficos de la palabra "COFFEE"
Texture *crisisTexture; // Textura con los graficos de la plabra "CRISIS"
Texture *arcadeEditionTexture; // Textura con los graficos de "Arcade Edition"
std::unique_ptr<AnimatedSprite> dustLSprite; // Sprite con la el polvo que aparece al colisionar el texto de la pantalla de titulo
std::unique_ptr<AnimatedSprite> dustRSprite; // Sprite con la el polvo que aparece al colisionar el texto de la pantalla de titulo
AnimatedSprite *dustBitmapL; // Sprite con la el polvo que aparece al colisionar el texto de la pantalla de titulo
AnimatedSprite *dustBitmapR; // Sprite con la el polvo que aparece al colisionar el texto de la pantalla de titulo
std::unique_ptr<SmartSprite> coffeeSprite; // Sprite con la palabra "COFFEE" para la pantalla de titulo
std::unique_ptr<SmartSprite> crisisSprite; // Sprite con la palabra "CRISIS" para la pantalla de titulo
SmartSprite *coffeeBitmap; // Sprite con la palabra "COFFEE" para la pantalla de titulo
SmartSprite *crisisBitmap; // Sprite con la palabra "CRISIS" para la pantalla de titulo
Sprite *arcadeEditionBitmap; // Sprite con los graficos de "Arcade Edition"
std::unique_ptr<Sprite> arcadeEditionSprite; // Sprite con los graficos de "Arcade Edition"
JA_Sound_t *crashSound; // Sonido con el impacto del título
@@ -37,15 +34,15 @@ private:
int x; // Posición donde dibujar el logo
int y; // Posición donde dibujar el logo
enum status_e
enum class Status
{
disabled,
moving,
shaking,
finished
DISABLED,
MOVING,
SHAKING,
FINISHED,
} status; // Estado en el que se encuentra la clase
struct shake_t
struct Shake
{
int desp; // Pixels de desplazamiento para agitar la pantalla en el eje x
int delay; // Retraso entre cada desplazamiento de la pantalla al agitarse
@@ -78,7 +75,7 @@ public:
void enable();
// Indica si ha terminado la animación
bool hasFinished();
bool hasFinished() const;
// Recarga las texturas
void reLoad();

View File

@@ -17,7 +17,7 @@ namespace globalInputs
// Inicializa variables
void init()
{
const int numInputs = Input::get()->getNumControllers() + 1;
const auto numInputs = Input::get()->getNumControllers() + 1;
servicePressedCounter.reserve(numInputs);
for (int i = 0; i < numInputs; ++i)
{

View File

@@ -5,20 +5,21 @@
#include <SDL2/SDL_video.h> // for SDL_WINDOWEVENT_SIZE_CHANGED
#include <algorithm> // for max
#include <vector> // for vector
#include "asset.h" // for Asset
#include "background.h" // for Background
#include "global_inputs.h" // for globalInputs::check
#include "input.h" // for Input
#include "jail_audio.h" // for JA_GetMusicState, JA_Music_state
#include "lang.h" // for getText
#include "options.h" // for options
#include "param.h" // for param
#include "screen.h" // for Screen
#include "text.h" // for Text, TXT_CENTER, TXT_SHADOW, TXT_COLOR
#include "utils.h" // for param_t, paramGame_t, hiScoreEntry_t
#include "asset.h" // for Asset
#include "background.h" // for Background
#include "global_inputs.h" // for globalInputs::check
#include "input.h" // for Input
#include "jail_audio.h" // for JA_GetMusicState, JA_Music_state
#include "lang.h" // for getText
#include "options.h" // for options
#include "param.h" // for param
#include "screen.h" // for Screen
#include "text.h" // for Text, TXT_CENTER, TXT_SHADOW, TXT_COLOR
#include "utils.h" // for param_t, paramGame_t, hiScoreEntry_t
// Constructor
HiScoreTable::HiScoreTable(JA_Music_t *music) : music(music)
HiScoreTable::HiScoreTable(JA_Music_t *music)
: music(music)
{
// Copia punteros
renderer = Screen::get()->getRenderer();
@@ -74,7 +75,9 @@ void HiScoreTable::update()
// Mantiene la música sonando
if ((JA_GetMusicState() == JA_MUSIC_INVALID) || (JA_GetMusicState() == JA_MUSIC_STOPPED))
{
JA_PlayMusic(music);
}
// Actualiza el objeto screen
Screen::get()->update();
@@ -105,14 +108,14 @@ void HiScoreTable::update()
void HiScoreTable::fillTexture()
{
// hay 27 letras - 7 de puntos quedan 20 caracteres 20 - nameLenght 0 numDots
const int maxNames = 10;
const int spaceBetweenHeader = 32;
const int spaceBetweenLines = text->getCharacterSize() * 2.0f;
const int size = spaceBetweenHeader + spaceBetweenLines * (maxNames - 1) + text->getCharacterSize();
const int firstLine = (param.game.height - size) / 2;
constexpr auto maxNames = 10;
constexpr auto spaceBetweenHeader = 32;
const auto spaceBetweenLines = text->getCharacterSize() * 2.0f;
const auto size = spaceBetweenHeader + spaceBetweenLines * (maxNames - 1) + text->getCharacterSize();
const auto firstLine = (param.game.height - size) / 2;
// Pinta en el backbuffer el texto y los sprites
SDL_Texture *temp = SDL_GetRenderTarget(renderer);
auto *temp = SDL_GetRenderTarget(renderer);
SDL_SetRenderTarget(renderer, backbuffer);
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
SDL_RenderClear(renderer);
@@ -123,16 +126,16 @@ void HiScoreTable::fillTexture()
// Escribe los nombres de la tabla de puntuaciones
for (int i = 0; i < maxNames; ++i)
{
const int nameLenght = options.game.hiScoreTable[i].name.length();
const std::string score = format(options.game.hiScoreTable[i].score);
const int scoreLenght = score.size();
const int numDots = 25 - nameLenght - scoreLenght;
const auto nameLenght = options.game.hiScoreTable[i].name.length();
const auto score = format(options.game.hiScoreTable[i].score);
const auto scoreLenght = score.size();
const auto numDots = 25 - nameLenght - scoreLenght;
std::string dots = "";
for (int j = 0; j < numDots; ++j)
for (int j = 0; j < (int)numDots; ++j)
{
dots = dots + ".";
}
const std::string line = options.game.hiScoreTable[i].name + dots + score;
const auto line = options.game.hiScoreTable[i].name + dots + score;
text->writeDX(TXT_CENTER | TXT_SHADOW, param.game.gameArea.centerX, (i * spaceBetweenLines) + firstLine + spaceBetweenHeader, line, 1, orangeColor, 1, shdwTxtColor);
}
@@ -158,6 +161,7 @@ void HiScoreTable::render()
// Copia el backbuffer al renderizador
SDL_RenderCopy(renderer, backbuffer, nullptr, &viewArea);
// Renderiza el fade
fade->render();
// Vuelca el contenido del renderizador en pantalla
@@ -226,47 +230,6 @@ void HiScoreTable::run()
}
}
// Transforma un valor numérico en una cadena de 6 cifras
std::string HiScoreTable::scoreToString(int num)
{
if ((num >= 0) && (num <= 9))
{
return ("000000" + std::to_string(num));
}
if ((num >= 10) && (num <= 99))
{
return ("00000" + std::to_string(num));
}
if ((num >= 100) && (num <= 999))
{
return ("0000" + std::to_string(num));
}
if ((num >= 1000) && (num <= 9999))
{
return ("000" + std::to_string(num));
}
if ((num >= 010000) && (num <= 99999))
{
return ("00" + std::to_string(num));
}
if ((num >= 100000) && (num <= 999999))
{
return ("0" + std::to_string(num));
}
if ((num >= 1000000) && (num <= 9999999))
{
return (std::to_string(num));
}
return (std::to_string(num));
}
// Gestiona el fade
void HiScoreTable::updateFade()
{
@@ -291,9 +254,9 @@ std::string HiScoreTable::format(int number)
const std::string separator = ".";
const std::string score = std::to_string(number);
int index = (int)score.size() - 1;
auto index = (int)score.size() - 1;
std::string result = "";
int i = 0;
auto i = 0;
while (index >= 0)
{
result = score.at(index) + result;

View File

@@ -60,9 +60,6 @@ private:
// Convierte un entero a un string con separadores de miles
std::string format(int number);
// Transforma un valor numérico en una cadena de 6 cifras
std::string scoreToString(int num);
// Crea el contenido de la textura con la lista de puntuaciones
void fillTexture();
@@ -72,9 +69,6 @@ private:
// Gestiona el fade
void updateFade();
// Termina
void quit(section::options_e code);
public:
// Constructor
HiScoreTable(JA_Music_t *music);

View File

@@ -19,12 +19,12 @@ int main(int argc, char *argv[])
Director *director = new Director(argc, argv);
// Bucle principal
const int exit = director->run();
const auto exit = director->run();
// Destruye el objeto Director
delete director;
const std::string endType = exit == 0 ? "keyboard" : "controller";
const auto endType = exit == 0 ? "keyboard" : "controller";
std::cout << "\nGame end with " << endType << std::endl;
return exit;

View File

@@ -54,7 +54,7 @@ void Notify::update()
// Si la notificación anterior está "saliendo", no hagas nada
if (i > 0)
{
if (notifications[i - 1].state == ns_rising)
if (notifications[i - 1].status == NotificationStatus::RISING)
{
break;
}
@@ -67,7 +67,7 @@ void Notify::update()
{
if (options.notification.sound)
{
if (notifications[i].state == ns_rising)
if (notifications[i].status == NotificationStatus::RISING)
{ // Reproduce el sonido de la notificación
JA_PlaySound(sound);
}
@@ -75,7 +75,7 @@ void Notify::update()
}
// Comprueba los estados
if (notifications[i].state == ns_rising)
if (notifications[i].status == NotificationStatus::RISING)
{
const float step = ((float)notifications[i].counter / notifications[i].travelDist);
const int alpha = 255 * step;
@@ -92,21 +92,21 @@ void Notify::update()
if (notifications[i].rect.y == notifications[i].y)
{
notifications[i].state = ns_stay;
notifications[i].status = NotificationStatus::STAY;
notifications[i].texture->setAlpha(255);
notifications[i].counter = 0;
}
}
else if (notifications[i].state == ns_stay)
else if (notifications[i].status == NotificationStatus::STAY)
{
if (notifications[i].counter == waitTime)
{
notifications[i].state = ns_vanishing;
notifications[i].status = NotificationStatus::VANISHING;
notifications[i].counter = 0;
}
}
else if (notifications[i].state == ns_vanishing)
else if (notifications[i].status == NotificationStatus::VANISHING)
{
const float step = (notifications[i].counter / (float)notifications[i].travelDist);
@@ -124,7 +124,7 @@ void Notify::update()
if (notifications[i].rect.y == notifications[i].y - notifications[i].travelDist)
{
notifications[i].state = ns_finished;
notifications[i].status = NotificationStatus::FINISHED;
}
}
@@ -139,7 +139,7 @@ void Notify::clearFinishedNotifications()
{
for (int i = (int)notifications.size() - 1; i >= 0; --i)
{
if (notifications[i].state == ns_finished)
if (notifications[i].status == NotificationStatus::FINISHED)
{
notifications.erase(notifications.begin() + i);
}
@@ -150,15 +150,7 @@ void Notify::clearFinishedNotifications()
void Notify::showText(std::string text1, std::string text2, int icon)
{
// Cuenta el número de textos a mostrar
int numTexts = 0;
if (text1 != "")
{
numTexts++;
}
if (text2 != "")
{
numTexts++;
}
const int numTexts = (text1 != "") + (text2 != "");
// Si no hay texto, acaba
if (numTexts == 0)
@@ -179,17 +171,17 @@ void Notify::showText(std::string text1, std::string text2, int icon)
}
// Inicializa variables
constexpr int iconSize = 16;
constexpr int paddingOut = 1;
const int paddingIn = text->getCharacterSize() / 2;
const int iconSpace = icon >= 0 ? iconSize + paddingIn : 0;
constexpr auto iconSize = 16;
constexpr auto paddingOut = 1;
const auto paddingIn = text->getCharacterSize() / 2;
const auto iconSpace = icon >= 0 ? iconSize + paddingIn : 0;
const std::string txt = text1.length() > text2.length() ? text1 : text2;
const int width = text->lenght(txt) + (paddingIn * 2) + iconSpace;
const int height = (text->getCharacterSize() * numTexts) + (paddingIn * 2);
const notification_shape_t shape = notification_shape_squared;
const auto width = text->lenght(txt) + (paddingIn * 2) + iconSpace;
const auto height = (text->getCharacterSize() * numTexts) + (paddingIn * 2);
const auto shape = NotificationShape::SQUARED;
// Posición horizontal
int despH = 0;
auto despH = 0;
if (options.notification.posH == pos_left)
{
despH = paddingOut;
@@ -204,20 +196,11 @@ void Notify::showText(std::string text1, std::string text2, int icon)
}
// Posición vertical
int despV = 0;
if (options.notification.posV == pos_top)
{
despV = paddingOut;
}
else
{
despV = param.game.height - height - paddingOut;
}
const int travelDist = height + paddingOut;
const int despV = (options.notification.posV == pos_top) ? paddingOut : (param.game.height - height - paddingOut);
// Offset
int offset = 0;
const auto travelDist = height + paddingOut;
auto offset = 0;
if (options.notification.posV == pos_top)
{
offset = (int)notifications.size() > 0 ? notifications.back().y + travelDist : despV;
@@ -227,18 +210,32 @@ void Notify::showText(std::string text1, std::string text2, int icon)
offset = (int)notifications.size() > 0 ? notifications.back().y - travelDist : despV;
}
// Crea la textura de fondo de la notificación
auto texture = std::make_unique<Texture>(renderer);
texture->createBlank(width, height, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET);
texture->setBlendMode(SDL_BLENDMODE_BLEND);
// Crea la notificacion
Notification n;
// Inicializa variables
n.y = offset;
n.travelDist = travelDist;
n.counter = 0;
n.status = NotificationStatus::RISING;
n.text1 = text1;
n.text2 = text2;
n.shape = shape;
auto yPos = offset + (options.notification.posV == pos_top ? -travelDist : travelDist);
n.rect = {despH, yPos, width, height};
// Crea la textura
n.texture = new Texture(renderer);
n.texture->createBlank(width, height, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET);
n.texture->setBlendMode(SDL_BLENDMODE_BLEND);
// Prepara para dibujar en la textura
texture->setAsRenderTarget(renderer);
n.texture->setAsRenderTarget(renderer);
// Dibuja fondo de la notificación sobre la textura
// Dibuja el fondo de la notificación
SDL_SetRenderDrawColor(renderer, bgColor.r, bgColor.g, bgColor.b, 255);
SDL_Rect rect;
if (shape == notification_shape_rounded)
if (shape == NotificationShape::ROUNDED)
{
rect = {4, 0, width - (4 * 2), height};
SDL_RenderFillRect(renderer, &rect);
@@ -253,7 +250,7 @@ void Notify::showText(std::string text1, std::string text2, int icon)
SDL_RenderFillRect(renderer, &rect);
}
else if (shape == notification_shape_squared)
else if (shape == NotificationShape::SQUARED)
{
SDL_RenderClear(renderer);
}
@@ -283,28 +280,13 @@ void Notify::showText(std::string text1, std::string text2, int icon)
SDL_SetRenderTarget(renderer, nullptr);
// Crea el sprite de la notificación
auto sprite = std::make_unique<Sprite>((SDL_Rect){despH, 50, width, height}, texture.get());
// Crea la notificacion
notification_t n(std::move(texture), std::move(sprite));
// Inicializa variables
n.y = offset;
n.travelDist = travelDist;
n.counter = 0;
n.state = ns_rising;
n.text1 = text1;
n.text2 = text2;
n.shape = shape;
const int yPos = offset + (options.notification.posV == pos_top ? -travelDist : travelDist);
n.rect = {despH, yPos, width, height};
n.sprite->setPos(n.rect);
n.sprite = new Sprite(n.rect, n.texture);
// Deja la notificación invisible
n.texture->setAlpha(0);
// Añade la notificación a la lista
notifications.push_back(std::move(n));
notifications.push_back(n);
}
// Indica si hay notificaciones activas
@@ -323,7 +305,7 @@ void Notify::clearNotifications()
{
for (int i = 0; i < (int)notifications.size(); ++i)
{
notifications[i].state = ns_finished;
notifications[i].status = NotificationStatus::FINISHED;
}
clearFinishedNotifications();

View File

@@ -14,72 +14,45 @@ struct JA_Sound_t;
class Notify
{
private:
enum notification_state_e
enum class NotificationStatus
{
ns_rising,
ns_stay,
ns_vanishing,
ns_finished
RISING,
STAY,
VANISHING,
FINISHED,
};
enum notification_position_e
enum class NotificationPosition
{
upperLeft,
upperCenter,
upperRight,
middleLeft,
middleRight,
bottomLeft,
bottomCenter,
bottomRight
UPPERLEFT,
UPPERCENTER,
UPPERRIGHT,
MIDDLELEFT,
MIDDLERIGHT,
BOTTOMLEFT,
BOTTOMCENTER,
BOTTOMRIGHT,
};
enum notification_shape_t
enum class NotificationShape
{
notification_shape_rounded,
notification_shape_squared,
ROUNDED,
SQUARED,
};
struct notification_t
struct Notification
{
std::unique_ptr<Texture> texture;
std::unique_ptr<Sprite> sprite;
Texture *texture;
Sprite *sprite;
std::string text1;
std::string text2;
int counter;
notification_state_e state;
notification_position_e position;
NotificationStatus status;
NotificationPosition position;
NotificationShape shape;
SDL_Rect rect;
int y;
int travelDist;
notification_shape_t shape;
// Constructor
notification_t(std::unique_ptr<Texture> texture, std::unique_ptr<Sprite> sprite)
: texture(std::move(texture)), sprite(std::move(sprite)) {}
// Constructor de movimiento
notification_t(notification_t &&other) noexcept
: texture(std::move(other.texture)), sprite(std::move(other.sprite))
{
// Mover otros miembros si es necesario
}
// Operador de asignación por movimiento
notification_t &operator=(notification_t &&other) noexcept
{
if (this != &other)
{
texture = std::move(other.texture);
sprite = std::move(other.sprite);
// Mover otros miembros si es necesario
}
return *this;
}
// Deshabilitar el constructor de copia y operador de asignación por copia
notification_t(const notification_t &) = delete;
notification_t &operator=(const notification_t &) = delete;
};
// Objetos y punteros
@@ -89,12 +62,12 @@ private:
std::unique_ptr<Text> text; // Objeto para dibujar texto
// Variables
color_t bgColor; // Color de fondo de las notificaciones
int waitTime; // Tiempo que se ve la notificación
std::vector<notification_t> notifications; // La lista de notificaciones activas
JA_Sound_t *sound; // Sonido a reproducir cuando suena la notificación
bool stack; // Indica si las notificaciones se apilan
bool hasIcons; // Indica si el notificador tiene textura para iconos
color_t bgColor; // Color de fondo de las notificaciones
int waitTime; // Tiempo que se ve la notificación
std::vector<Notification> notifications; // La lista de notificaciones activas
JA_Sound_t *sound; // Sonido a reproducir cuando suena la notificación
bool stack; // Indica si las notificaciones se apilan
bool hasIcons; // Indica si el notificador tiene textura para iconos
// Elimina las notificaciones finalizadas
void clearFinishedNotifications();

View File

@@ -3,6 +3,8 @@
#include <SDL2/SDL_pixels.h> // for SDL_PIXELFORMAT_RGBA8888
#include <SDL2/SDL_timer.h> // for SDL_GetTicks
#include <math.h> // for roundf
#include <iomanip>
#include <sstream>
#include "asset.h" // for Asset
#include "lang.h" // for getText
#include "sprite.h" // for Sprite
@@ -96,44 +98,11 @@ Scoreboard::~Scoreboard()
}
// Transforma un valor numérico en una cadena de 6 cifras
std::string Scoreboard::updateScoreText(Uint32 num)
std::string Scoreboard::updateScoreText(int num)
{
if ((num >= 0) && (num <= 9))
{
return ("000000" + std::to_string(num));
}
if ((num >= 10) && (num <= 99))
{
return ("00000" + std::to_string(num));
}
if ((num >= 100) && (num <= 999))
{
return ("0000" + std::to_string(num));
}
if ((num >= 1000) && (num <= 9999))
{
return ("000" + std::to_string(num));
}
if ((num >= 010000) && (num <= 99999))
{
return ("00" + std::to_string(num));
}
if ((num >= 100000) && (num <= 999999))
{
return ("0" + std::to_string(num));
}
if ((num >= 1000000) && (num <= 9999999))
{
return (std::to_string(num));
}
return (std::to_string(num));
std::ostringstream oss;
oss << std::setw(8) << std::setfill('0') << num;
return oss.str();
}
// Actualiza el contador

View File

@@ -80,7 +80,7 @@ private:
void recalculateAnchors();
// Transforma un valor numérico en una cadena de 6 cifras
std::string updateScoreText(Uint32 num);
std::string updateScoreText(int num);
// Crea la textura de fondo
void createBackgroundTexture();