From d84137daa78ddef5d11a87f1f66f61c4c3f701d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Valor=20Mart=C3=ADnez?= Date: Sun, 4 Apr 2021 12:31:48 +0200 Subject: [PATCH] Throw coffe with rotation and time stop with clock sound --- .gitignore | 1 + media/.DS_Store | Bin 10244 -> 10244 bytes media/sound/clock.wav | Bin 0 -> 56142 bytes media/sound/credits.txt | 6 +++- source/const.h | 3 +- source/gamedirector.cpp | 29 ++++++++++++++++--- source/movingsprite.cpp | 45 +++++++++++++++++++++++------ source/movingsprite.h | 14 +++++++++ source/smartsprite.cpp | 62 ++++++++++++++++++++++++++++++++++++---- source/smartsprite.h | 53 ++++++++++++++++++++-------------- 10 files changed, 172 insertions(+), 41 deletions(-) create mode 100644 media/sound/clock.wav diff --git a/.gitignore b/.gitignore index 93d1462..3212be4 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ data/config.bin data/score.bin *.opk coffee_crisis +.vscode \ No newline at end of file diff --git a/media/.DS_Store b/media/.DS_Store index 0df0db1d62d5c50a93d4a063671652462b36e25b..5c8baf3d18ae0eafa1db6b8dca4c669c215197bc 100644 GIT binary patch delta 70 zcmZn(XbIS$B*A!MGQW6(hInw+?<6GHH?u4JWd{Jcqza}0 diff --git a/media/sound/clock.wav b/media/sound/clock.wav new file mode 100644 index 0000000000000000000000000000000000000000..3e277c87a9f5d8bb32190ea7d371364a5334ef8a GIT binary patch literal 56142 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 <;qROcC>_5<< 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 literal 0 HcmV?d00001 diff --git a/media/sound/credits.txt b/media/sound/credits.txt index 1df8d70..067168a 100644 --- a/media/sound/credits.txt +++ b/media/sound/credits.txt @@ -56,4 +56,8 @@ bubble3.wav JailDoctor bubble4.wav -JailDoctor \ No newline at end of file +JailDoctor + +clock.wav +kenney_digitalaudio/switch2.ogg +www.kenney.nl \ No newline at end of file diff --git a/source/const.h b/source/const.h index 5c38e87..52e275d 100644 --- a/source/const.h +++ b/source/const.h @@ -38,8 +38,9 @@ #define SOUND_PLAYER_COLLISION 13 #define SOUND_STAGE_CHANGE 14 #define SOUND_TITLE 15 +#define SOUND_CLOCK 16 -#define TOTAL_SOUND 16 +#define TOTAL_SOUND 17 #define TEXTURE_BALLOON 0 #define TEXTURE_BULLET 1 diff --git a/source/gamedirector.cpp b/source/gamedirector.cpp index d31ba69..cb3871f 100644 --- a/source/gamedirector.cpp +++ b/source/gamedirector.cpp @@ -46,9 +46,13 @@ GameDirector::GameDirector(std::string path) initJailAudio(); #ifdef __MIPSEL__ - DIR* dir = opendir("/media/data/local/home/.coffee_crisis"); - if (dir) { closedir(dir); } - else if (ENOENT == errno) { + DIR *dir = opendir("/media/data/local/home/.coffee_crisis"); + if (dir) + { + closedir(dir); + } + else if (ENOENT == errno) + { int status = mkdir("/media/data/local/home/.coffee_crisis", 755); } #endif @@ -1041,6 +1045,7 @@ bool GameDirector::loadMediaGame() mSound[SOUND_BUBBLE2].sound = JA_LoadSound(mSound[SOUND_BUBBLE2].file.c_str()); mSound[SOUND_BUBBLE3].sound = JA_LoadSound(mSound[SOUND_BUBBLE3].file.c_str()); mSound[SOUND_BUBBLE4].sound = JA_LoadSound(mSound[SOUND_BUBBLE4].file.c_str()); + mSound[SOUND_CLOCK].sound = JA_LoadSound(mSound[SOUND_CLOCK].file.c_str()); // Musicas mMusic[MUSIC_PLAYING].music = JA_LoadMusic(mMusic[MUSIC_PLAYING].file.c_str()); @@ -1075,6 +1080,7 @@ void GameDirector::quitGame() JA_DeleteSound(mSound[SOUND_BUBBLE2].sound); JA_DeleteSound(mSound[SOUND_BUBBLE3].sound); JA_DeleteSound(mSound[SOUND_BUBBLE4].sound); + JA_DeleteSound(mSound[SOUND_CLOCK].sound); // Musicas JA_DeleteMusic(mMusic[MUSIC_PLAYING].music); @@ -1182,6 +1188,7 @@ void GameDirector::setFileList() mSound[SOUND_PLAYER_COLLISION].file = mProg.executablePath + "/" + "../media/sound/player_collision.wav"; mSound[SOUND_STAGE_CHANGE].file = mProg.executablePath + "/" + "../media/sound/stage_change.wav"; mSound[SOUND_TITLE].file = mProg.executablePath + "/" + "../media/sound/title.wav"; + mSound[SOUND_CLOCK].file = mProg.executablePath + "/" + "../media/sound/clock.wav"; // Texturas mTexture[TEXTURE_BALLOON].file = mProg.executablePath + "/" + "../media/gfx/balloon.png"; @@ -3043,7 +3050,7 @@ void GameDirector::resetItems() // Devuelve un item en función del azar Uint8 GameDirector::dropItem() { - //return ITEM_COFFEE; + return ITEM_COFFEE; Uint8 luckyNumber = rand() % 99; Uint8 item = rand() % 7; @@ -3151,6 +3158,9 @@ void GameDirector::throwCoffee(int x, int y) mGame.smartSprite[index]->setEnabled(true); mGame.smartSprite[index]->setEnabledTimer(1); mGame.smartSprite[index]->setSpriteClip(80, 16, 16, 16); + mGame.smartSprite[index]->setRotate(true); + mGame.smartSprite[index]->setRotateSpeed(1); + mGame.smartSprite[index]->setRotateAmount(5.0); } // Crea un SmartSprite para arrojar el item café al recibir un impacto @@ -4010,6 +4020,17 @@ void GameDirector::renderMessages() mText.black->writeCentered(PLAY_AREA_CENTER_X + 1, PLAY_AREA_FIRST_QUARTER_Y + 1, "Time Stopped: " + std::to_string(mGame.timeStoppedCounter / 10)); mText.white->writeCentered(PLAY_AREA_CENTER_X, PLAY_AREA_FIRST_QUARTER_Y, "Time Stopped: " + std::to_string(mGame.timeStoppedCounter / 10)); } + + if (mGame.timeStoppedCounter > 100) + { + if (mGame.timeStoppedCounter % 30 == 0) + JA_PlaySound(mSound[SOUND_CLOCK].sound, false); + } + else + { + if (mGame.timeStoppedCounter % 15 == 0) + JA_PlaySound(mSound[SOUND_CLOCK].sound, false); + } } // D E M O diff --git a/source/movingsprite.cpp b/source/movingsprite.cpp index 63ec6a5..45aa286 100644 --- a/source/movingsprite.cpp +++ b/source/movingsprite.cpp @@ -37,6 +37,9 @@ void MovingSprite::init(float x, float y, int w, int h, float velx, float vely, setZoomW(1); setZoomH(1); + // Establece el angulo con el que se dibujará + setAngle(0.0); + // Establece la textura donde están los gráficos para el sprite setTexture(texture); @@ -61,57 +64,63 @@ void MovingSprite::move() void MovingSprite::render() { //mTexture->render(mRenderer, (int)mPosX, (int)mPosY, &mSpriteClip); - mTexture->render(mRenderer, (int)mPosX, (int)mPosY, &mSpriteClip, mZoomW, mZoomH); + mTexture->render(mRenderer, (int)mPosX, (int)mPosY, &mSpriteClip, mZoomW, mZoomH, mAngle); } -// Establece el valor de la variable +// Obtiene el valor de la variable float MovingSprite::getPosX() { return mPosX; } -// Establece el valor de la variable +// Obtiene el valor de la variable float MovingSprite::getPosY() { return mPosY; } -// Establece el valor de la variable +// Obtiene el valor de la variable float MovingSprite::getVelX() { return mVelX; } -// Establece el valor de la variable +// Obtiene el valor de la variable float MovingSprite::getVelY() { return mVelY; } -// Establece el valor de la variable +// Obtiene el valor de la variable float MovingSprite::getAccelX() { return mAccelX; } -// Establece el valor de la variable +// Obtiene el valor de la variable float MovingSprite::getAccelY() { return mAccelY; } -// Establece el valor de la variable +// Obtiene el valor de la variable float MovingSprite::getZoomW() { return mZoomW; } -// Establece el valor de la variable +// Obtiene el valor de la variable float MovingSprite::getZoomH() { return mZoomH; } +// Obtiene el valor de la variable +double MovingSprite::getAngle() +{ + return mAngle; +} + // Establece el valor de la variable void MovingSprite::setPosX(float x) { @@ -158,4 +167,22 @@ void MovingSprite::setZoomW(float w) void MovingSprite::setZoomH(float h) { mZoomH = h; +} + +// Establece el valor de la variable +void MovingSprite::setAngle(double a) +{ + mAngle = a; +} + +// Incrementa el valor de la variable +void MovingSprite::incAngle(double inc) +{ + mAngle += inc; +} + +// Decrementa el valor de la variable +void MovingSprite::decAngle(double dec) +{ + mAngle -= dec; } \ No newline at end of file diff --git a/source/movingsprite.h b/source/movingsprite.h index d609fca..36e0299 100644 --- a/source/movingsprite.h +++ b/source/movingsprite.h @@ -21,6 +21,8 @@ private: float mZoomW; // Zoom aplicado a la anchura float mZoomH; // Zoom aplicado a la altura + double mAngle; // Angulo para dibujarlo + public: // Constructor MovingSprite(); @@ -61,6 +63,9 @@ public: // Obten el valor de la variable float getZoomH(); + // Obten el valor de la variable + double getAngle(); + // Establece el valor de la variable void setPosX(float x); @@ -84,6 +89,15 @@ public: // Establece el valor de la variable void setZoomH(float h); + + // Establece el valor de la variable + void setAngle(double a); + + // Incrementa el valor de la variable + void incAngle(double inc); + + // Decrementa el valor de la variable + void decAngle(double dec); }; #endif diff --git a/source/smartsprite.cpp b/source/smartsprite.cpp index 5b68a17..a5eb314 100644 --- a/source/smartsprite.cpp +++ b/source/smartsprite.cpp @@ -38,6 +38,12 @@ void SmartSprite::init(LTexture *texture, SDL_Renderer *renderer) mDestX = 0; mDestY = 0; + setRotate(false); + setRotateSpeed(0); + setRotateAmount(0.0); + + mCounter = 0; + // El Id siempre es >=0, por lo tanto si no se le asigna Id se queda en negativo mId = -1; @@ -65,13 +71,13 @@ void SmartSprite::setEnabled(bool state) // Obtiene el valor de la variable Uint16 SmartSprite::getEnabledTimer() { - return mEnabledTimer; + return mEnabledCounter; } // Establece el valor de la variable void SmartSprite::setEnabledTimer(Uint16 time) { - mEnabledTimer = time; + mEnabledCounter = time; } // Establece el valor de la variable @@ -86,6 +92,24 @@ void SmartSprite::setDestY(int value) mDestY = value; } +// Establece el valor de la variable +void SmartSprite::setRotate(bool value) +{ + mRotate = value; +} + +// Establece el valor de la variable +void SmartSprite::setRotateSpeed(Uint16 value) +{ + mRotateSpeed = value; +} + +// Establece el valor de la variable +void SmartSprite::setRotateAmount(double value) +{ + mRotateAmount = value; +} + // Obtiene el valor de la variable int SmartSprite::getDestX() { @@ -98,12 +122,37 @@ int SmartSprite::getDestY() return mDestY; } +// Obtiene el valor de la variable +bool SmartSprite::getRotate() +{ + return mRotate; +} + +// Obtiene el valor de la variable +Uint16 SmartSprite::getRotateSpeed() +{ + return mRotateSpeed; +} + +// Establece la rotacion +void SmartSprite::rotate() +{ + if (mRotate) + { + if (mCounter % mRotateSpeed == 0) + { + incAngle(mRotateAmount); + } + } +} + // Actualiza la posición y comprueba si ha llegado a su destino bool SmartSprite::update() { if (mEnabled) { move(); + rotate(); // Comprueba si se desplaza en el eje X hacia la derecha if ((getAccelX() > 0) || ((getAccelX() == 0) && (getVelX() > 0))) @@ -178,12 +227,12 @@ bool SmartSprite::update() if (mIsOnDestination) { // Si el contador es mayor que cero, lo decrementa - if (mEnabledTimer > 0) + if (mEnabledCounter > 0) { - --mEnabledTimer; + --mEnabledCounter; } // Si ha llegado a cero, deshabilita el objeto o manda el aviso en función de si tiene Id - else if (mEnabledTimer == 0) + else if (mEnabledCounter == 0) { if (mId < 0) { @@ -195,6 +244,9 @@ bool SmartSprite::update() } } } + + mCounter++; + mCounter %= 65000; } return mIsOnDestination; diff --git a/source/smartsprite.h b/source/smartsprite.h index 6fa1c20..c1ca798 100644 --- a/source/smartsprite.h +++ b/source/smartsprite.h @@ -8,6 +8,19 @@ // Clase SmartSprite class SmartSprite : public AnimatedSprite { +private: + bool mEnabled; // Indica si esta habilitado + bool mIsOnDestination; // Indica si está en el destino + bool mRotate; // Indica si ha de rotar + int mDestX; // Posicion de destino en el eje X + int mDestY; // Posicion de destino en el eje Y + int mId; // Identificador + Uint16 mCounter; // Contador interno + Uint16 mEnabledCounter; // Contador para deshabilitarlo + Uint16 mRotateSpeed; // Velocidad de giro + Uint8 *mIntroEvents; // Dirección del array de eventos donde notificar el estado + double mRotateAmount; // Cantidad de grados a girar en cada iteración + public: // Constructor SmartSprite(); @@ -39,15 +52,33 @@ public: // Establece el valor de la variable void setDestY(int value); + // Establece el valor de la variable + void setRotate(bool value); + + // Establece el valor de la variable + void setRotateSpeed(Uint16 value); + + // Establece el valor de la variable + void setRotateAmount(double value); + // Obtiene el valor de la variable int getDestX(); // Obtiene el valor de la variable int getDestY(); + // Obtiene el valor de la variable + bool getRotate(); + + // Obtiene el valor de la variable + Uint16 getRotateSpeed(); + + // Establece la rotacion + void rotate(); + // Actualiza la posición y comprueba si ha llegado a su destino bool update(); - + // Obtiene el valor de la variable bool isOnDestination(); @@ -59,26 +90,6 @@ public: // Establece el valor de la variable void setIntroEvents(Uint8 *value); - -private: - // Indica si esta habilitado - bool mEnabled; - - // Contador - Uint16 mEnabledTimer; - - // Indica si está en el destino - bool mIsOnDestination; - - // Posicion de destino - int mDestX; - int mDestY; - - // Identificador - int mId; - - // Dirección del array de eventos donde notificar el estado - Uint8 *mIntroEvents; }; #endif