From 6851b76f6a733fed208bd88939bb8ea20eb80881 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Sat, 24 Aug 2024 19:05:29 -0500 Subject: [PATCH] Added menu transition and state system. --- assets/button.png | Bin 0 -> 797 bytes assets/hamsterplanet1.png | Bin 0 -> 1873 bytes assets/hamsterplanet2.png | Bin 0 -> 1992 bytes assets/hamsterplanet3.png | Bin 0 -> 1979 bytes assets/welcometo.png | Bin 0 -> 3466 bytes src/Hamster.cpp | 5 +- src/HamsterGame.cpp | 24 +++++- src/HamsterGame.h | 7 ++ src/Menu.cpp | 160 ++++++++++++++++++++++++++++++++++++++ src/Menu.h | 82 +++++++++++++++++++ src/TODO.txt | 3 +- 11 files changed, 274 insertions(+), 7 deletions(-) create mode 100644 assets/button.png create mode 100644 assets/hamsterplanet1.png create mode 100644 assets/hamsterplanet2.png create mode 100644 assets/hamsterplanet3.png create mode 100644 assets/welcometo.png create mode 100644 src/Menu.cpp create mode 100644 src/Menu.h diff --git a/assets/button.png b/assets/button.png new file mode 100644 index 0000000000000000000000000000000000000000..9973c05c16e57d8fb05334f69e9b322e3ce6f8f8 GIT binary patch literal 797 zcmV+&1LFLNP)EX>4Tx04R}tkv&MmKpe$iQ^lec2P=p;WT;Mdu_BJ8ibb$c+6t{Ym|Xe=O&XFE z7e~Rh;NZt%)xpJCR|i)?5c~jfc5qU3krMxx6k5c1aNLh~_a1le0HIlBs@W3*RLwHd ziMW`{uZn%I2w(&Qh$1L4Q%`0Vv+x{W_we!cF2b|C&;29%C|}6A ztZ?4qtXAu+eNXeSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{008w#L_t(o!(&uYv-;043dja5FvgC_i3}dO^BHzbPQ
a86 z8sf2wtB!M6FPY*cBZV|0qgiG&F%*;?ZAb$zcq>s^n)x&z=j_?{ocF`~JMZnB=lLo$ zm}q0Y&l&&ZH@H~@gW&54BWFq1)Q0CL44e)(MT_jJ|2vYw2Jhx z-vlyp(!=RoxQV~}!js%|RVibAKVt!?jZSP-I#@(}?=k$E$b)yLxI*yCzfvdAW-a? zhdP6kwtN6A-{q)WIh9cyh0ShL4K{xvcyjbfg8!&%+_RqM^vR!^$#0ukA=~}&J~2b- zcYZz&k2(!^D=rHoTAq(8{-Ke3(Iv>3VP~qE4&er(BQ3vi-YM|;a^~G*lZMfqbOf(Q zTTXi~e4Ubi7GR0In-V6bq+Mz}Xj3lXDVD~nB`VD94bEOq@b#|3uitXe3n2bU$(stC zWBI}NH0wc^MfRDgn^xD;3b#M)?q2f@K2U(o?!02*>`1xn+xr~2`y7T27Mk7cZ znK@|Z*TOZ+vg2YP(GS=J7(m(RvA6AJ0!t5w&H@13!4C<_ZScx5Ln}Hd$lvM>^pAU- z?Mx@p|1u*-x_=biH!US4F_jMZW+o=k6RAiBjs7YxLzHW zI)S&h3>CSz^RSpnZ!+KJxNL}Qs9^85EOMb?nP+Z)B!7P;x52giBF=vZ?`%Hse~G^y zKeK0Ld&7_+6Ek!3Jjt$88JE{TU*Ay0BVfFYY@s9s{LE9dOf=pafIck zCO3nGFPr$zWV*t}p6{Dh=%g);qnO6+IY+PU{GOda^K%Ha3ILI_h9UV>m1L{&1(QLm z=iFiqJnXkw3e$(wu=xO^FNzqntEN=cKQq>rs+(GXYcOG=$SIyfXP{HIN~eApCK`&F zsFjUCV{YJ6a|rbt6fl*>;}1|O=hSI#0R;A`%I9YU%lbMQ4g*JC>(S;ETGd8-f|4kwD%%KXpE3XhyMOv)6sAsk z_1dde0`Y|f9Er=TOp({Z(iQ5Vu&%!4TU(q(g+W*bP0wBLmz|AY0K^+4;vAu8n< zF2=+2((-755Zf?*ARcBPRS9`e2pJKJv2reO#I64gBeQHhg@<)P`c!F_+E50>$ zB(GDL=C9UDd60m8Vkm*UHUd4`A%r{&m$}$oI0*8f)+w1i)OKGm#2o}S>t_28-$jB% zN2wJUMzc6;j)@9(bjId2HR|8n@9WJ>nCvyLwyhseri)rKS)kwN%oVyW{Kxe%ekoU) zZ?;^LVtL#k>NNFgc`TK{KrEFj=V)N;E1FmKaPMj}9>&49>ZZ@|;M7 zt+gJF>ZG|(P!dzgxXtFgn4#=d|M?O>JwlW{+ZwjI6mb;-4Se@#ruEV0f%DxXm##|M zi+P`HAC^|HK4!!0HSvht=sn?S4eA613RJ!M(gs$x`c0m+Ykb}vjx2ycz1o^M5GWF) zz;NA-?^ZZM2oxQLl8Ebawvt#{2ART!Dc{`$CWI>h><21Qx!r!s4-6>-diZ`{{xX-y zz>?P)v?jf+Qw==c>6rJ*ovfRHjqP`i7U$;^_tluM!0aUuXxWRbg4n}GW;+rD4k(Ct zji}`UAe46<6^)Ts&oWTn2*-^-!S0vq)Zq)a=gc+W@L}>-nfDG~LOhV&tIT^^*?RYB zR^>4}(&Waekx9EEGHZTrD(6|MTwq9U)lP1CzRkA!eJcM?-S>Y?+Zio)`Sv=>>BAn9 Mf3V-Z)A2?B1^IOci~s-t literal 0 HcmV?d00001 diff --git a/assets/hamsterplanet2.png b/assets/hamsterplanet2.png new file mode 100644 index 0000000000000000000000000000000000000000..814daee63c5ecdffedb6b2ca85e092b078979222 GIT binary patch literal 1992 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 literal 0 HcmV?d00001 diff --git a/src/Hamster.cpp b/src/Hamster.cpp index d5f78ae..8f39ad2 100644 --- a/src/Hamster.cpp +++ b/src/Hamster.cpp @@ -871,7 +871,8 @@ void Hamster::HandleAIControls(){ if(aiNodeTime>GetAIAdjustNodeTime()){ geom2d::lineplayerToHamster{GetPlayer().GetPos(),GetPos()}; const float screenDistance{playerToHamster.length()*(1.325f/(HamsterGame::Game().GetCameraZ()))}; - if(screenDistance>226){ + const float playerScreenDistanceToNewNode{geom2d::line(GetPlayer().GetPos(),action.pos).length()*(1.325f/(HamsterGame::Game().GetCameraZ()))}; + if(screenDistance>226&&playerScreenDistanceToNewNode>226){ //Let's cheat, hehe. pos=action.pos; temporaryNode.reset(); @@ -980,7 +981,7 @@ const float Hamster::GetAILandingSpeed()const{ const float Hamster::GetAIAdjustNodeTime()const{ switch(ai.GetAIType()){ case HamsterAI::SMART:{ - return 0.5f; + return 1.f; }break; case HamsterAI::NORMAL:{ return 2.f; diff --git a/src/HamsterGame.cpp b/src/HamsterGame.cpp index 0279471..acd7c82 100644 --- a/src/HamsterGame.cpp +++ b/src/HamsterGame.cpp @@ -22,6 +22,8 @@ HamsterGame::HamsterGame(const std::string&appName){ } bool HamsterGame::OnUserCreate(){ + CreateLayer(); + EnableLayer(1U,true); LoadPBs(); audio.SetBackgroundPlay(true); olc::GFX3D::ConfigureDisplay(); @@ -102,6 +104,11 @@ void HamsterGame::LoadGraphics(){ _LoadImage("background4.png"); _LoadImage("background5.png"); _LoadImage("raceprogress.png"); + _LoadImage("welcometo.png"); + _LoadImage("hamsterplanet1.png"); + _LoadImage("hamsterplanet2.png"); + _LoadImage("hamsterplanet3.png"); + _LoadImage("button.png"); } void HamsterGame::LoadAnimations(){ @@ -387,12 +394,10 @@ bool HamsterGame::OnUserUpdate(float fElapsedTime){ net.SetName("OneLoneHamster"); net.SetColor(hamsterColorNames[0]); - SetupAndStartRace(); } runTime+=fElapsedTime; - UpdateGame(fElapsedTime); - DrawGame(); + menu.UpdateAndDraw(*this,fElapsedTime); return true; } @@ -690,6 +695,19 @@ const geom2d::rectHamsterGame::GetMapSpawnRect()const{ return currentMap.value().GetData().GetSpawnZone(); } +void HamsterGame::SetMapSetList(const std::queue&mapSet){ + while(mapSetList.size()>0)mapSetList.pop(); + mapSetList=mapSet; +} +const bool HamsterGame::HasMoreMapsToPlay()const{ + return mapSetList.size()>0; +} +const std::string HamsterGame::PopNextMap(){ + std::string frontMap{mapSetList.front()}; + mapSetList.pop(); + return frontMap; +} + int main() { HamsterGame game("Project Hamster"); diff --git a/src/HamsterGame.h b/src/HamsterGame.h index 39eda15..3c58a77 100644 --- a/src/HamsterGame.h +++ b/src/HamsterGame.h @@ -53,6 +53,7 @@ All rights reserved. #include "HamsterNet.h" #include "olcPGEX_SplashScreen.h" #include "HamsterLeaderboard.h" +#include "Menu.h" struct Letter{ vf2d pos; @@ -62,6 +63,7 @@ struct Letter{ class HamsterGame : public olc::PixelGameEngine { + friend class Menu; public: enum class GameMode{ GRAND_PRIX_1, @@ -105,6 +107,9 @@ public: const int GetRaceTime(); const bool RaceCountdownCompleted(); const geom2d::rectGetMapSpawnRect()const; + void SetMapSetList(const std::queue&mapSet); + const bool HasMoreMapsToPlay()const; + const std::string PopNextMap(); private: void UpdateGame(const float fElapsedTime); void DrawGame(); @@ -180,4 +185,6 @@ private: "Blue", }; HamsterLeaderboard leaderboard; + std::queuemapSetList{}; + Menu menu; }; \ No newline at end of file diff --git a/src/Menu.cpp b/src/Menu.cpp new file mode 100644 index 0000000..c3aafd8 --- /dev/null +++ b/src/Menu.cpp @@ -0,0 +1,160 @@ +#pragma region License +/* +License (OLC-3) +~~~~~~~~~~~~~~~ + +Copyright 2024 Joshua Sigona + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions or derivations of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions or derivative works in binary form must reproduce the above +copyright notice. This list of conditions and the following disclaimer must be +reproduced in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may +be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +Portions of this software are copyright © 2024 The FreeType +Project (www.freetype.org). Please see LICENSE_FT.txt for more information. +All rights reserved. +*/ +#pragma endregion + +#include "Menu.h" +#include "HamsterGame.h" +#include "util.h" + +void Menu::UpdateAndDraw(HamsterGame&game,const float fElapsedTime){ + menuTransitionRefreshTimer-=fElapsedTime; + if(menuTimer>0.f){ + menuTimer-=fElapsedTime; + if(menuTimer<=0.f){ + currentMenu=nextMenu; + } + } + + game.EnableLayer(0U,menuTimer>0.f); + + switch(currentMenu){ + case INITIALIZE:{ + Transition(FADE_OUT,TITLE_SCREEN,1.f); + }break; + case TITLE_SCREEN:{ + if(game.GetKey(SPACE).bPressed||game.GetMouse(Mouse::LEFT).bPressed){ + Transition(SHIFT_LEFT,MAIN_MENU,0.5f); + } + }break; + case MAIN_MENU:{ + if(game.GetKey(SPACE).bPressed||game.GetMouse(Mouse::LEFT).bPressed){ + game.SetupAndStartRace(); + } + }break; + case GAMEPLAY:{ + game.UpdateGame(fElapsedTime); + game.DrawGame(); + }break; + case GAMEPLAY_RESULTS:{ + game.DrawGame(); + }break; + } + + if(menuTimer>0.f){ + DrawTransition(game); + if(menuTransitionRefreshTimer<=0.f){ + menuTransitionRefreshTimer=MENU_TRANSITION_REFRESH_RATE; + } + }else Draw(game,currentMenu,game.SCREEN_FRAME.pos); +} +void Menu::Transition(const TransitionType type,const MenuType gotoMenu,const float transitionTime){ + if(menuTimer>0.f)return; + menuTimer=originalMenuTimer=transitionTime; + nextMenu=gotoMenu; + currentTransition=type; +} +void Menu::DrawTransition(HamsterGame&game){ + if(currentTransition==FADE_OUT){ + if(menuTimer>=originalMenuTimer/2){//Fading out from old scene. + game.SetDrawTarget(1U); + Draw(game,currentMenu,game.SCREEN_FRAME.pos); + game.SetDrawTarget(nullptr); + game.Clear(BLACK); + if(menuTransitionRefreshTimer<=0.f)game.SetLayerTint(0U,{255,255,255,uint8_t(util::lerp(255,0,(menuTimer-originalMenuTimer/2)/(originalMenuTimer/2)))}); + }else{//Fading into new scene. + game.SetDrawTarget(1U); + Draw(game,nextMenu,game.SCREEN_FRAME.pos); + game.SetDrawTarget(nullptr); + game.Clear(BLACK); + if(menuTransitionRefreshTimer<=0.f)game.SetLayerTint(0U,{255,255,255,uint8_t(util::lerp(0,255,menuTimer/(originalMenuTimer/2)))}); + } + }else{ + if(menuTransitionRefreshTimer<=0.f){ + switch(currentTransition){ + case SHIFT_LEFT:{ + oldLayerPos=vi2d{int(util::lerp(-game.SCREEN_FRAME.size.x,0,menuTimer/originalMenuTimer)),0}; + newLayerPos=vi2d{int(util::lerp(0,game.SCREEN_FRAME.size.x,menuTimer/originalMenuTimer)),0}; + }break; + case SHIFT_RIGHT:{ + oldLayerPos=vi2d{int(util::lerp(game.SCREEN_FRAME.size.x,0,menuTimer/originalMenuTimer)),0}; + newLayerPos=vi2d{int(util::lerp(0,-game.SCREEN_FRAME.size.x,menuTimer/originalMenuTimer)),0}; + }break; + case SHIFT_UP:{ + oldLayerPos=vi2d{0,int(util::lerp(-game.SCREEN_FRAME.size.y,0,menuTimer/originalMenuTimer))}; + newLayerPos=vi2d{0,int(util::lerp(0,game.SCREEN_FRAME.size.y,menuTimer/originalMenuTimer))}; + }break; + case SHIFT_DOWN:{ + oldLayerPos=vi2d{0,int(util::lerp(game.SCREEN_FRAME.size.y,0,menuTimer/originalMenuTimer))}; + newLayerPos=vi2d{0,int(util::lerp(0,-game.SCREEN_FRAME.size.y,menuTimer/originalMenuTimer))}; + }break; + } + } + game.SetDrawTarget(1U); + game.SetLayerOffset(1U,oldLayerPos+game.SCREEN_FRAME.pos); + Draw(game,currentMenu,oldLayerPos+game.SCREEN_FRAME.pos); + game.SetDrawTarget(nullptr); + game.SetLayerTint(0U,WHITE); + game.SetLayerOffset(0U,newLayerPos+game.SCREEN_FRAME.pos); + Draw(game,nextMenu,newLayerPos+game.SCREEN_FRAME.pos); + } + game.SetDrawTarget(nullptr); +} + +void Menu::Draw(HamsterGame&game,const MenuType menu,const vi2d pos){ + game.Clear(BLANK); + switch(menu){ + case TITLE_SCREEN:{ + game.FillRectDecal(pos,game.SCREEN_FRAME.size,{111,150,255}); + game.DrawDecal(pos,game.GetGFX("welcometo.png").Decal()); + if(menuTransitionRefreshTimer>0.f)game.DrawDecal(pos,game.GetGFX("hamsterplanet1.png").Decal()); + if(fmod(game.GetRuntime(),2.f)<1.f)game.DrawDecal(pos,game.GetGFX("hamsterplanet2.png").Decal()); + else game.DrawDecal(pos,game.GetGFX("hamsterplanet3.png").Decal()); + game.border.Draw(); + }break; + case MAIN_MENU:{ + game.FillRectDecal(pos,game.SCREEN_FRAME.size,{}); + game.DrawRotatedDecal(pos,game.GetGFX("button.png").Decal(),0.f,game.GetGFX("button.png").Sprite()->Size()/2); + game.border.Draw(); + }break; + case GAMEPLAY:{ + game.DrawGame(); + }break; + case GAMEPLAY_RESULTS:{ + game.DrawGame(); + }break; + } +} \ No newline at end of file diff --git a/src/Menu.h b/src/Menu.h new file mode 100644 index 0000000..7050db4 --- /dev/null +++ b/src/Menu.h @@ -0,0 +1,82 @@ +#pragma region License +/* +License (OLC-3) +~~~~~~~~~~~~~~~ + +Copyright 2024 Joshua Sigona + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistributions or derivations of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + +2. Redistributions or derivative works in binary form must reproduce the above +copyright notice. This list of conditions and the following disclaimer must be +reproduced in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may +be used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +Portions of this software are copyright © 2024 The FreeType +Project (www.freetype.org). Please see LICENSE_FT.txt for more information. +All rights reserved. +*/ +#pragma endregion +#pragma once + +#include "olcPixelGameEngine.h" + +class HamsterGame; +class Menu{ + enum MenuType{ + INITIALIZE, + TITLE_SCREEN, + MAIN_MENU, + GRAND_PRIX, + SINGLE_RACE, + OPTIONS, + GAMEPLAY, + GAMEPLAY_RESULTS, + AFTER_RACE_MENU, + PAUSE, + }; + enum TransitionType{ + SHIFT_LEFT, + SHIFT_RIGHT, + SHIFT_UP, + SHIFT_DOWN, + FADE_OUT, + }; + enum MenuState{ + NORMAL, + TRANSITIONING, + }; + MenuState currentState{NORMAL}; + TransitionType currentTransition{FADE_OUT}; + MenuType currentMenu{INITIALIZE}; + MenuType nextMenu{TITLE_SCREEN}; + float menuTimer{}; + const float MENU_TRANSITION_REFRESH_RATE{0.15f}; + float menuTransitionRefreshTimer{MENU_TRANSITION_REFRESH_RATE}; + float originalMenuTimer{}; + vi2d oldLayerPos{}; + vi2d newLayerPos{}; + void Transition(const TransitionType type,const MenuType gotoMenu,const float transitionTime); + void Draw(HamsterGame&game,const MenuType menu,const vi2d pos); + void DrawTransition(HamsterGame&game); +public: + void UpdateAndDraw(HamsterGame&game,const float fElapsedTime); +}; \ No newline at end of file diff --git a/src/TODO.txt b/src/TODO.txt index 9389dd3..db6741b 100644 --- a/src/TODO.txt +++ b/src/TODO.txt @@ -154,7 +154,6 @@ Stage 11: Boss Battle #3 Alternate - nene Stage 12: Boss Battle #5 V2 - nene -Live Placement Tracking Pulsating Animation based on terrain walking across (30 min) Sound Effects (1 hour) @@ -180,7 +179,7 @@ Menu Select/Back Sound ========================== Stages VI - XII: 7 Stages (1 hour each, 7 hours total) -Menu Navigations (2 hours) +Menu Navigations (3 hours) Grand Prix Management (1 hour) Unlocks (1 hour) Leaderboard Management (1 hour)