diff --git a/source/game.cpp b/source/game.cpp index 47b86ce..d51e623 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -62,20 +62,15 @@ Game::Game(int numPlayers, int currentStage, SDL_Renderer *renderer, Screen *scr mTexturePlayer2Body = new LTexture(mRenderer); mTexturePlayer2Death = new LTexture(mRenderer); mTexturePlayer2Legs = new LTexture(mRenderer); - mTextureText = new LTexture(mRenderer); - mTextureTextScoreBoard = new LTexture(mRenderer); - mTextureTextBig = new LTexture(mRenderer); - mTextureTextNokia2 = new LTexture(mRenderer); - mTextureTextNokiaBig2 = new LTexture(mRenderer); - mText = new Text(mAsset->get("smb2.txt"), mTextureText, mRenderer); - mTextScoreBoard = new Text(mAsset->get("8bithud.txt"), mTextureTextScoreBoard, mRenderer); - mTextBig = new Text(mAsset->get("smb2_big.txt"), mTextureTextBig, mRenderer); - mTextNokia2 = new Text(mAsset->get("nokia2.txt"), mTextureTextNokia2, mRenderer); - mTextNokiaBig2 = new Text(mAsset->get("nokia_big2.txt"), mTextureTextNokiaBig2, mRenderer); + mText = new Text(mAsset->get("smb2.png"),mAsset->get("smb2.txt"), mRenderer); + mTextScoreBoard = new Text(mAsset->get("8bithud.png"),mAsset->get("8bithud.txt"), mRenderer); + mTextBig = new Text(mAsset->get("smb2_big.png"),mAsset->get("smb2_big.txt"), mRenderer); + mTextNokia2 = new Text(mAsset->get("nokia2.png"),mAsset->get("nokia2.txt"), mRenderer); + mTextNokiaBig2 = new Text(mAsset->get("nokia_big2.png"),mAsset->get("nokia_big2.txt"), mRenderer); - mMenuGameOver = new Menu(mRenderer, mText, mInput, mAsset); - mMenuPause = new Menu(mRenderer, mText, mInput, mAsset); + mMenuGameOver = new Menu(mRenderer, mAsset, mInput); + mMenuPause = new Menu(mRenderer, mAsset, mInput); mFade = new Fade(mRenderer); mEventHandler = new SDL_Event(); @@ -113,21 +108,25 @@ Game::~Game() delete mPlayer[i]; mPlayer[i] = nullptr; } + for (int i = 0; i < MAX_BALLOONS; i++) { delete mBalloon[i]; mBalloon[i] = nullptr; } + for (int i = 0; i < MAX_BULLETS; i++) { delete mBullet[i]; mBullet[i] = nullptr; } + for (int i = 0; i < MAX_ITEMS; i++) { delete mItem[i]; mItem[i] = nullptr; } + for (int i = 0; i < MAX_SMART_SPRITES; i++) { delete mSmartSprite[i]; @@ -186,26 +185,6 @@ Game::~Game() delete mTexturePlayer2Legs; mTexturePlayer2Legs = nullptr; - mTextureText->unload(); - delete mTextureText; - mTextureText = nullptr; - - mTextureTextScoreBoard->unload(); - delete mTextureTextScoreBoard; - mTextureTextScoreBoard = nullptr; - - mTextureTextBig->unload(); - delete mTextureTextBig; - mTextureTextBig = nullptr; - - mTextureTextNokia2->unload(); - delete mTextureTextNokia2; - mTextureTextNokia2 = nullptr; - - mTextureTextNokiaBig2->unload(); - delete mTextureTextNokiaBig2; - mTextureTextNokiaBig2 = nullptr; - delete mText; mText = nullptr; @@ -413,9 +392,9 @@ void Game::init() mMenuPause->addItem(mLang->getText(46), 2); mMenuPause->addItem(mLang->getText(47), 0); mMenuPause->setDefaultActionWhenCancel(0); - mMenuPause->setBackgroundColor(0x29, 0x39, 0x41, 240); - mMenuPause->setSelectorColor(0xFF, 0x7A, 0x00, 255); - mMenuPause->setSelectorTextColor(0xFF, 0xFF, 0xFF); + mMenuPause->setBackgroundColor({0x29, 0x39, 0x41}, 240); + mMenuPause->setSelectorColor({0xFF, 0x7A, 0x00}, 255); + mMenuPause->setSelectorTextColor({0xFF, 0xFF, 0xFF}); mMenuPause->centerMenuOnX(SCREEN_CENTER_X); mMenuPause->centerMenuElementsOnX(); @@ -425,11 +404,11 @@ void Game::init() mMenuGameOver->addItem(mLang->getText(49)); mMenuGameOver->setDefaultActionWhenCancel(1); mMenuGameOver->setBackgroundColor(0, 0, 0, 255); - mMenuGameOver->setSelectorColor(0x54, 0x6e, 0x7a, 255); - mMenuGameOver->setSelectorColor(0x54, 0x6e, 0x7a, 0); - mMenuGameOver->setSelectorTextColor(0xFF, 0xFF, 0xFF); - mMenuGameOver->setSelectorTextColor(0xFF, 0xF1, 0x76); - mMenuGameOver->setSelectorTextColor(0xFF, 0x7A, 0x00); + mMenuGameOver->setSelectorColor({0x54, 0x6e, 0x7a}, 255); + mMenuGameOver->setSelectorColor({0x54, 0x6e, 0x7a}, 0); + mMenuGameOver->setSelectorTextColor({0xFF, 0xFF, 0xFF}); + mMenuGameOver->setSelectorTextColor({0xFF, 0xF1, 0x76}); + mMenuGameOver->setSelectorTextColor({0xFF, 0x7A, 0x00}); mMenuGameOver->centerMenuOnX(SCREEN_CENTER_X); mMenuGameOver->centerMenuElementsOnX(); diff --git a/source/game.h b/source/game.h index 86deb78..436ad6e 100644 --- a/source/game.h +++ b/source/game.h @@ -155,11 +155,6 @@ private: LTexture *mTexturePlayer2Body; // Textura para el cuerpo del jugador2 LTexture *mTexturePlayer2Death; // Textura para la animación de muerte del jugador2 LTexture *mTexturePlayer2Legs; // Textura para las piernas del jugador - LTexture *mTextureText; // Textura para el texto del juego - LTexture *mTextureTextScoreBoard; // Textura para el texto del marcador - LTexture *mTextureTextBig; // Textura para el texto grande - LTexture *mTextureTextNokia2; // Textura para la fuente de texto Nokia - LTexture *mTextureTextNokiaBig2; // Textura para la fuente de texto Nokia grande Text *mText; // Fuente para los textos del juego Text *mTextBig; // Fuente de texto grande diff --git a/source/menu.h b/source/menu.h index 09a001c..1b916cf 100644 --- a/source/menu.h +++ b/source/menu.h @@ -208,6 +208,7 @@ public: // Establece el estado de enlace de un item void setLinkedDown(int index, bool value); + // hacer procedimientos para establecer el titulo, la x, la y, la tipografia y el tipo de fondo }; diff --git a/source/text.cpp b/source/text.cpp index 211d50c..653a156 100644 --- a/source/text.cpp +++ b/source/text.cpp @@ -1,15 +1,16 @@ -#include "const.h" + #include "text.h" #include #include // Constructor -Text::Text(std::string file, LTexture *texture, SDL_Renderer *renderer) +Text::Text(std::string bitmapFile, std::string textFile, SDL_Renderer *renderer) { - mSprite = new Sprite(); - mSprite->setTexture(texture); - mSprite->setRenderer(renderer); - mFile = file; + texture = new LTexture(renderer, bitmapFile); + sprite = new Sprite({0, 0, 0, 0}, texture, renderer); + sprite->setTexture(texture); + sprite->setRenderer(renderer); + file = textFile; init(); } @@ -17,71 +18,71 @@ Text::Text(std::string file, LTexture *texture, SDL_Renderer *renderer) // Destructor Text::~Text() { - delete mSprite; - mSprite = nullptr; + delete texture; + delete sprite; } // Inicializador void Text::init() { // Inicializa a cero el vector con las coordenadas - for (int i = 0; i < 128; i++) + for (int i = 0; i < 128; ++i) { - mOffset[i].x = 0; - mOffset[i].y = 0; - mOffset[i].w = 0; + offset[i].x = 0; + offset[i].y = 0; + offset[i].w = 0; } // Carga los offsets desde el fichero initOffsetFromFile(); // Inicia los valores del sprite que dibuja las letras - mSprite->setWidth(mBoxWidth); - mSprite->setHeight(mBoxHeight); - mSprite->setPosX(0); - mSprite->setPosY(0); - mSprite->setSpriteClip(0, 0, mSprite->getWidth(), mSprite->getHeight()); + sprite->setWidth(boxWidth); + sprite->setHeight(boxHeight); + sprite->setPosX(0); + sprite->setPosY(0); + sprite->setSpriteClip(0, 0, sprite->getWidth(), sprite->getHeight()); // Establece las coordenadas para cada caracter ascii de la cadena y su ancho - for (int i = 32; i < 128; i++) + for (int i = 32; i < 128; ++i) { - mOffset[i].x = ((i - 32) % 15) * mBoxWidth; - mOffset[i].y = ((i - 32) / 15) * mBoxHeight; + offset[i].x = ((i - 32) % 15) * boxWidth; + offset[i].y = ((i - 32) / 15) * boxHeight; } } // Escribe texto en pantalla void Text::write(int x, int y, std::string text, int kerning, int lenght) { - Uint16 shift = 0; + int shift = 0; if (lenght == -1) lenght = text.length(); for (int i = 0; i < lenght; ++i) { - mSprite->setSpriteClip(mOffset[int(text[i])].x, mOffset[int(text[i])].y, mSprite->getWidth(), mSprite->getHeight()); - mSprite->setPosX(x + shift); - mSprite->setPosY(y); - mSprite->render(); - shift += (mOffset[int(text[i])].w + kerning); + sprite->setSpriteClip(offset[int(text[i])].x, offset[int(text[i])].y, sprite->getWidth(), sprite->getHeight()); + sprite->setPosX(x + shift); + sprite->setPosY(y); + sprite->render(); + shift += (offset[int(text[i])].w + kerning); } } // Escribe el texto con colores void Text::writeColored(int x, int y, std::string text, color_t color, int kerning, int lenght) { - mSprite->getTexture()->setColor(color.r, color.g, color.b); + sprite->getTexture()->setColor(color.r, color.g, color.b); write(x, y, text, kerning, lenght); - mSprite->getTexture()->setColor(255, 255, 255); + sprite->getTexture()->setColor(255, 255, 255); } // Escribe el texto con sombra void Text::writeShadowed(int x, int y, std::string text, color_t color, Uint8 shadowDistance, int kerning, int lenght) { - mSprite->getTexture()->setColor(color.r, color.g, color.b); + sprite->getTexture()->setColor(color.r, color.g, color.b); write(x + shadowDistance, y + shadowDistance, text, kerning, lenght); - mSprite->getTexture()->setColor(255, 255, 255); + sprite->getTexture()->setColor(255, 255, 255); write(x, y, text, kerning, lenght); } @@ -112,7 +113,7 @@ void Text::writeDX(Uint8 flags, int x, int y, std::string text, int kerning, col writeColored(x - shadowDistance, y + shadowDistance, text, shadowColor, kerning, lenght); writeColored(x + shadowDistance, y - shadowDistance, text, shadowColor, kerning, lenght); writeColored(x - shadowDistance, y - shadowDistance, text, shadowColor, kerning, lenght); - + writeColored(x, y + shadowDistance, text, shadowColor, kerning, lenght); writeColored(x, y - shadowDistance, text, shadowColor, kerning, lenght); writeColored(x + shadowDistance, y, text, shadowColor, kerning, lenght); @@ -126,33 +127,35 @@ void Text::writeDX(Uint8 flags, int x, int y, std::string text, int kerning, col } // Obtiene la longitud en pixels de una cadena -Uint16 Text::lenght(std::string text, int kerning) +int Text::lenght(std::string text, int kerning) { - Uint16 shift = 0; + int shift = 0; for (int i = 0; i < (int)text.length(); ++i) - shift += (mOffset[int(text[i])].w + kerning); + shift += (offset[int(text[i])].w + kerning); - return shift; + // Descuenta el kerning del último caracter + return shift - kerning; } // Inicializa el vector de offsets desde un fichero void Text::initOffsetFromFile() { - std::ifstream rfile(mFile); + std::ifstream rfile(file); + printf("Reading file %s\n", file.c_str()); + if (rfile.is_open() && rfile.good()) { std::string buffer; - //printf("Reading %s file\n", mFile.c_str()); // Lee los dos primeros valores del fichero std::getline(rfile, buffer); std::getline(rfile, buffer); - mBoxWidth = std::stoi(buffer); + boxWidth = std::stoi(buffer); std::getline(rfile, buffer); std::getline(rfile, buffer); - mBoxHeight = std::stoi(buffer); + boxHeight = std::stoi(buffer); // lee el resto de datos del fichero int index = 32; @@ -161,17 +164,33 @@ void Text::initOffsetFromFile() { // Almacena solo las lineas impares if (line_read % 2 == 1) - mOffset[index++].w = std::stoi(buffer); - + offset[index++].w = std::stoi(buffer); + // Limpia el buffer buffer.clear(); line_read++; }; + + // Cierra el fichero + printf("Closing file %s\n\n", file.c_str()); + rfile.close(); + } + + // El fichero no se puede abrir + else + { + printf("Warning: Unable to open %s file\n", file.c_str()); } } // Devuelve el valor de la variable -Uint8 Text::getCharacterWidth() +int Text::getCharacterSize() { - return mBoxWidth; + return boxWidth; +} + +// Recarga la textura +void Text::reLoadTexture() +{ + texture->reLoad(); } \ No newline at end of file diff --git a/source/text.h b/source/text.h index f7ebfae..fc32787 100644 --- a/source/text.h +++ b/source/text.h @@ -1,6 +1,5 @@ #pragma once -#include #include "sprite.h" #include "utils.h" @@ -12,37 +11,38 @@ #define TXT_CENTER 4 #define TXT_STROKE 8 -// Clase Text. Pinta texto en pantalla a partir de una cadena y un bitmap +// Clase texto. Pinta texto en pantalla a partir de un bitmap class Text { private: - Sprite *mSprite; // Objeto con los graficos para el texto + Sprite *sprite; // Objeto con los graficos para el texto struct Offset { - int x; // Posición en el eje X dentro del bitmap - int y; // Posición en el eje Y dentro del bitmap - Uint8 w; // Ancho en pixeles de la letra + int x; + int y; + int w; }; - Offset mOffset[128]; // Vector con las posiciones y ancho de cada letra + Offset offset[128]; // Vector con las posiciones y ancho de cada letra - Uint8 mBoxWidth; // Anchura de la caja de cada caracter en el png - Uint8 mBoxHeight; // Altura de la caja de cada caracter en el png - std::string mFile; // Fichero con los descriptores de la fuente + int boxWidth; // Anchura de la caja de cada caracter en el png + int boxHeight; // Altura de la caja de cada caracter en el png + std::string file; // Fichero con los descriptores de la fuente + LTexture *texture; // Textura con los bitmaps del texto + + // Inicializador + void init(); // Inicializa el vector de offsets desde un fichero void initOffsetFromFile(); public: // Constructor - Text(std::string file, LTexture *texture, SDL_Renderer *renderer); + Text(std::string bitmapFile, std::string textFile, SDL_Renderer *renderer); // Destructor ~Text(); - // Inicializador - void init(); - // Escribe el texto en pantalla void write(int x, int y, std::string text, int kerning = 1, int lenght = -1); @@ -52,17 +52,20 @@ public: // Escribe el texto con sombra void writeShadowed(int x, int y, std::string text, color_t color, Uint8 shadowDistance = 1, int kerning = 1, int lenght = -1); - // Escribe el texto centrado en un punto x y con kerning + // Escribe el texto centrado en un punto x void writeCentered(int x, int y, std::string text, int kerning = 1, int lenght = -1); // Escribe texto con extras void writeDX(Uint8 flags, int x, int y, std::string text, int kerning = 1, color_t textColor = {255, 255, 255}, Uint8 shadowDistance = 1, color_t shadowColor = {0, 0, 0}, int lenght = -1); // Obtiene la longitud en pixels de una cadena - Uint16 lenght(std::string text, int kerning = 1); + int lenght(std::string text, int kerning = 1); // Devuelve el valor de la variable - Uint8 getCharacterWidth(); + int getCharacterSize(); + + // Recarga la textura + void reLoadTexture(); }; #endif