diff --git a/source/game.cpp b/source/game.cpp index c14fe35..bcbbe30 100644 --- a/source/game.cpp +++ b/source/game.cpp @@ -47,24 +47,24 @@ Game::Game(int numPlayers, SDL_Renderer *renderer, Screen *screen, std::string * mSmartSprite[i] = new SmartSprite(); } - mTextureBalloon = new LTexture(); - mTextureBullet = new LTexture(); - mTextureGameBG = new LTexture(); - mTextureGameText = new LTexture(); - mTextureItems = new LTexture(); - mTexturePlayer1Head = new LTexture(); - mTexturePlayer1Body = new LTexture(); - mTexturePlayer1Death = new LTexture(); - mTexturePlayer1Legs = new LTexture(); - mTexturePlayer2Head = new LTexture(); - mTexturePlayer2Body = new LTexture(); - mTexturePlayer2Death = new LTexture(); - mTexturePlayer2Legs = new LTexture(); - mTextureText = new LTexture(); - mTextureTextScoreBoard = new LTexture(); - mTextureTextBig = new LTexture(); - mTextureTextNokia2 = new LTexture(); - mTextureTextNokiaBig2 = new LTexture(); + mTextureBalloon = new LTexture(mRenderer); + mTextureBullet = new LTexture(mRenderer); + mTextureGameBG = new LTexture(mRenderer); + mTextureGameText = new LTexture(mRenderer); + mTextureItems = new LTexture(mRenderer); + mTexturePlayer1Head = new LTexture(mRenderer); + mTexturePlayer1Body = new LTexture(mRenderer); + mTexturePlayer1Death = new LTexture(mRenderer); + mTexturePlayer1Legs = new LTexture(mRenderer); + mTexturePlayer2Head = new LTexture(mRenderer); + 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(mFileList[48], mTextureText, mRenderer); mTextScoreBoard = new Text(mFileList[46], mTextureTextScoreBoard, mRenderer); @@ -449,8 +449,11 @@ void Game::init() // Vector de jugadores if (mNumPlayers == 1) + { mPlayer[0]->init(PLAY_AREA_CENTER_X - 11, PLAY_AREA_BOTTOM - 24, mTexturePlayer1Legs, mTexturePlayer1Body, mTexturePlayer1Head, mTexturePlayer1Death, mRenderer); - if (mNumPlayers == 2) + } + + else if (mNumPlayers == 2) { mPlayer[0]->init((PLAY_AREA_CENTER_FIRST_QUARTER_X * ((0 * 2) + 1)) - 11, PLAY_AREA_BOTTOM - 24, mTexturePlayer1Legs, mTexturePlayer1Body, mTexturePlayer1Head, mTexturePlayer1Death, mRenderer); mPlayer[1]->init((PLAY_AREA_CENTER_FIRST_QUARTER_X * ((1 * 2) + 1)) - 11, PLAY_AREA_BOTTOM - 24, mTexturePlayer2Legs, mTexturePlayer2Body, mTexturePlayer2Head, mTexturePlayer2Death, mRenderer); @@ -3531,10 +3534,12 @@ void Game::initPaths() { mStageBitmapPath[i] = (mSin[(int)((i * 1.8f) + 90)] * (distance) + centerPoint); } + else if (i < secondPart) { mStageBitmapPath[i] = (int)centerPoint; } + else { mStageBitmapPath[i] = (mSin[(int)(((i - 149) * 1.8f) + 90)] * (centerPoint + 17) - 17); diff --git a/source/instructions.cpp b/source/instructions.cpp index 795db90..22b8600 100644 --- a/source/instructions.cpp +++ b/source/instructions.cpp @@ -13,8 +13,8 @@ Instructions::Instructions(SDL_Renderer *renderer, Screen *screen, std::string * // Reserva memoria para los punteros mEventHandler = new SDL_Event(); - mItemTexture = new LTexture(); - mTextTexture = new LTexture(); + mItemTexture = new LTexture(mRenderer); + mTextTexture = new LTexture(mRenderer); mSprite = new Sprite(); mText = new Text(mFileList[48], mTextTexture, mRenderer); diff --git a/source/intro.cpp b/source/intro.cpp index 4a525fa..04b6201 100644 --- a/source/intro.cpp +++ b/source/intro.cpp @@ -11,8 +11,8 @@ Intro::Intro(SDL_Renderer *renderer, Screen *screen, std::string *fileList, Lang // Reserva memoria para los punteros mEventHandler = new SDL_Event(); - mBitmapTexture = new LTexture(); - mTextTexture = new LTexture(); + mBitmapTexture = new LTexture(mRenderer); + mTextTexture = new LTexture(mRenderer); mText = new Text(mFileList[52], mTextTexture, mRenderer); for (int i = 0; i < INTRO_TOTAL_BITMAPS; i++) diff --git a/source/logo.cpp b/source/logo.cpp index b4dbd2d..bde9f60 100644 --- a/source/logo.cpp +++ b/source/logo.cpp @@ -13,7 +13,7 @@ Logo::Logo(SDL_Renderer *renderer, Screen *screen, std::string *fileList) // Reserva memoria para los punteros mEventHandler = new SDL_Event(); - mTexture = new LTexture(); + mTexture = new LTexture(mRenderer); mSprite = new Sprite(); // Crea un backbuffer para el renderizador diff --git a/source/ltexture.cpp b/source/ltexture.cpp index 0e6fd17..f6afbbb 100644 --- a/source/ltexture.cpp +++ b/source/ltexture.cpp @@ -1,28 +1,41 @@ -#include "const.h" + #include "ltexture.h" #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" -LTexture::LTexture() +// Constructor +LTexture::LTexture(SDL_Renderer *renderer, std::string path) { - // Initialize - mTexture = NULL; - mWidth = 0; - mHeight = 0; + // Copia punteros + this->renderer = renderer; + this->path = path; + + // Inicializa + texture = nullptr; + width = 0; + height = 0; + + // Carga el fichero en la textura + if (path != "") + { + loadFromFile(path, renderer); + } } +// Destructor LTexture::~LTexture() { - // Deallocate + // Libera memoria unload(); } +// Carga una imagen desde un fichero bool LTexture::loadFromFile(std::string path, SDL_Renderer *renderer) { int req_format = STBI_rgb_alpha; int width, height, orig_format; unsigned char *data = stbi_load(path.c_str(), &width, &height, &orig_format, req_format); - if (data == NULL) + if (data == nullptr) { SDL_Log("Loading image failed: %s", stbi_failure_reason()); exit(1); @@ -33,7 +46,7 @@ bool LTexture::loadFromFile(std::string path, SDL_Renderer *renderer) if (req_format == STBI_rgb) { depth = 24; - pitch = 3 * width; // 3 bytes per pixel * pixels per row + pitch = 3 * width; // 3 bytes por pixel * pixels per linea pixel_format = SDL_PIXELFORMAT_RGB24; } else @@ -43,100 +56,99 @@ bool LTexture::loadFromFile(std::string path, SDL_Renderer *renderer) pixel_format = SDL_PIXELFORMAT_RGBA32; } - // Get rid of preexisting texture + // Limpia unload(); - // The final texture - SDL_Texture *newTexture = NULL; + // La textura final + SDL_Texture *newTexture = nullptr; - // Load image at specified path - //SDL_Surface *loadedSurface = IMG_Load(path.c_str()); + // Carga la imagen desde una ruta específica SDL_Surface *loadedSurface = SDL_CreateRGBSurfaceWithFormatFrom((void *)data, width, height, depth, pitch, pixel_format); - if (loadedSurface == NULL) + if (loadedSurface == nullptr) { printf("Unable to load image %s!\n", path.c_str()); } else { - // Color key image - //SDL_SetColorKey(loadedSurface, SDL_TRUE, SDL_MapRGB(loadedSurface->format, COLOR_KEY_R, COLOR_KEY_G, COLOR_KEY_B)); - - // Create texture from surface pixels + // Crea la textura desde los pixels de la surface newTexture = SDL_CreateTextureFromSurface(renderer, loadedSurface); - if (newTexture == NULL) + if (newTexture == nullptr) { printf("Unable to create texture from %s! SDL Error: %s\n", path.c_str(), SDL_GetError()); } else { - // Get image dimensions - mWidth = loadedSurface->w; - mHeight = loadedSurface->h; + // Obtiene las dimensiones de la imagen + this->width = loadedSurface->w; + this->height = loadedSurface->h; } - // Get rid of old loaded surface + // Elimina la textura cargada SDL_FreeSurface(loadedSurface); } // Return success - mTexture = newTexture; - return mTexture != NULL; + texture = newTexture; + return texture != nullptr; } +// Crea una textura en blanco bool LTexture::createBlank(SDL_Renderer *renderer, int width, int height, SDL_TextureAccess access) { - // Create uninitialized texture - mTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, access, width, height); - if (mTexture == NULL) + // Crea una textura sin inicializar + texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, access, width, height); + if (texture == nullptr) { printf("Unable to create blank texture! SDL Error: %s\n", SDL_GetError()); } else { - mWidth = width; - mHeight = height; + this->width = width; + this->height = height; } - return mTexture != NULL; + return texture != nullptr; } +// Libera la memoria de la textura void LTexture::unload() { - // Free texture if it exists - if (mTexture != NULL) + // Libera la textura si existe + if (texture != nullptr) { - SDL_DestroyTexture(mTexture); - mTexture = NULL; - mWidth = 0; - mHeight = 0; + SDL_DestroyTexture(texture); + texture = nullptr; + width = 0; + height = 0; } } +// Establece el color para la modulacion void LTexture::setColor(Uint8 red, Uint8 green, Uint8 blue) { - // Modulate texture rgb - SDL_SetTextureColorMod(mTexture, red, green, blue); + SDL_SetTextureColorMod(texture, red, green, blue); } +// Establece el blending void LTexture::setBlendMode(SDL_BlendMode blending) { - // Set blending function - SDL_SetTextureBlendMode(mTexture, blending); + SDL_SetTextureBlendMode(texture, blending); } +// Establece el alpha para la modulación void LTexture::setAlpha(Uint8 alpha) { - // Modulate texture alpha - SDL_SetTextureAlphaMod(mTexture, alpha); + SDL_SetTextureAlphaMod(texture, alpha); } +// Renderiza la textura en un punto específico void LTexture::render(SDL_Renderer *renderer, int x, int y, SDL_Rect *clip, float zoomW, float zoomH, double angle, SDL_Point *center, SDL_RendererFlip flip) { - // Set rendering space and render to screen - SDL_Rect renderQuad = {x, y, mWidth, mHeight}; + // Establece el destini de renderizado en la pantalla + SDL_Rect renderQuad = {x, y, width, height}; - // Set clip rendering dimensions - if (clip != NULL) + // Obtiene las dimesiones del clip de renderizado + if (clip != nullptr) { renderQuad.w = clip->w; renderQuad.h = clip->h; @@ -145,22 +157,30 @@ void LTexture::render(SDL_Renderer *renderer, int x, int y, SDL_Rect *clip, floa renderQuad.w = renderQuad.w * zoomW; renderQuad.h = renderQuad.h * zoomH; - // Render to screen - SDL_RenderCopyEx(renderer, mTexture, clip, &renderQuad, angle, center, flip); + // Renderiza a pantalla + SDL_RenderCopyEx(renderer, texture, clip, &renderQuad, angle, center, flip); } +// Establece la textura como objetivo de renderizado void LTexture::setAsRenderTarget(SDL_Renderer *renderer) { - // Make self render target - SDL_SetRenderTarget(renderer, mTexture); + SDL_SetRenderTarget(renderer, texture); } +// Obtiene el ancho de la imagen int LTexture::getWidth() { - return mWidth; + return width; } +// Obtiene el alto de la imagen int LTexture::getHeight() { - return mHeight; + return height; } + +// Recarga la textura +bool LTexture::reLoad() +{ + return loadFromFile(path, renderer); +} \ No newline at end of file diff --git a/source/ltexture.h b/source/ltexture.h index c03a3aa..2272f94 100644 --- a/source/ltexture.h +++ b/source/ltexture.h @@ -7,61 +7,55 @@ #ifndef LTEXTURE_H #define LTEXTURE_H -// Texture wrapper class +// Clase LTexture class LTexture { -public: - // Initializes variables - LTexture(); +private: + SDL_Texture *texture; // La textura + SDL_Renderer *renderer; // Renderizador donde dibujar la textura + int width; // Ancho de la imagen + int height; // Alto de la imagen + std::string path; // Ruta de la imagen de la textura - // Deallocates memory +public: + // Constructor + LTexture(SDL_Renderer *renderer, std::string path = ""); + + // Destructor ~LTexture(); - // Loads image at specified path + // Carga una imagen desde un fichero bool loadFromFile(std::string path, SDL_Renderer *renderer); - // Creates blank texture + // Crea una textura en blanco bool createBlank(SDL_Renderer *renderer, int width, int height, SDL_TextureAccess = SDL_TEXTUREACCESS_STREAMING); - // Deallocates texture + // Libera la memoria de la textura void unload(); - // Set color modulation + // Establece el color para la modulacion void setColor(Uint8 red, Uint8 green, Uint8 blue); - // Set blending + // Establece el blending void setBlendMode(SDL_BlendMode blending); - // Set alpha modulation + // Establece el alpha para la modulación void setAlpha(Uint8 alpha); - // Renders texture at given point - void render(SDL_Renderer *renderer, int x, int y, SDL_Rect *clip = NULL, float zoomW = 1, float zoomH = 1, double angle = 0.0, SDL_Point *center = NULL, SDL_RendererFlip flip = SDL_FLIP_NONE); + // Renderiza la textura en un punto específico + void render(SDL_Renderer *renderer, int x, int y, SDL_Rect *clip = nullptr, float zoomW = 1, float zoomH = 1, double angle = 0.0, SDL_Point *center = nullptr, SDL_RendererFlip flip = SDL_FLIP_NONE); - // Set self as render target + // Establece la textura como objetivo de renderizado void setAsRenderTarget(SDL_Renderer *renderer); - // Gets image dimensions + // Obtiene el ancho de la imagen int getWidth(); + + // Obtiene el alto de la imagen int getHeight(); - // Pixel manipulators - bool lockTexture(); - bool unlockTexture(); - void *getPixels(); - void copyPixels(void *pixels); - int getPitch(); - Uint32 getPixel32(unsigned int x, unsigned int y); - -private: - // The actual hardware texture - SDL_Texture *mTexture; - void *mPixels; - int mPitch; - - // Image dimensions - int mWidth; - int mHeight; + // Recarga la textura + bool reLoad(); }; #endif diff --git a/source/title.cpp b/source/title.cpp index 6d37852..6fe592b 100644 --- a/source/title.cpp +++ b/source/title.cpp @@ -15,10 +15,10 @@ Title::Title(SDL_Window *window, SDL_Renderer *renderer, Screen *screen, Input * // Reserva memoria para los punteros propios mEventHandler = new SDL_Event(); mFade = new Fade(renderer); - mTitleTexture = new LTexture(); - mItemsTexture = new LTexture(); - mTextTexture = new LTexture(); - mTextTexture2 = new LTexture(); + mTitleTexture = new LTexture(mRenderer); + mItemsTexture = new LTexture(mRenderer); + mTextTexture = new LTexture(mRenderer); + mTextTexture2 = new LTexture(mRenderer); mCoffeeBitmap = new SmartSprite(); mCrisisBitmap = new SmartSprite(); mDustBitmapL = new AnimatedSprite();