From 8a7ae48031f9eadf33eae1ce8315dbd871a26bb5 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Sun, 25 Aug 2024 02:21:45 -0500 Subject: [PATCH] Add Player Options Menu --- assets/PBData | 2 +- assets/longbutton2.png | Bin 0 -> 7020 bytes assets/longhighlight_button2.png | Bin 0 -> 7046 bytes src/HamsterAI.cpp | 4 + src/HamsterAI.h | 1 + src/HamsterGame.cpp | 137 ++++++++++++++++++++++++------- src/HamsterGame.h | 12 ++- src/Menu.cpp | 89 +++++++++++++++++--- src/Menu.h | 8 +- src/TODO.txt | 2 + src/olcPixelGameEngine.h | 39 +-------- 11 files changed, 211 insertions(+), 83 deletions(-) create mode 100644 assets/longbutton2.png create mode 100644 assets/longhighlight_button2.png diff --git a/assets/PBData b/assets/PBData index 238c6d1..5e75890 100644 --- a/assets/PBData +++ b/assets/PBData @@ -1 +1 @@ -48889 2147483647 2147483647 2147483647 109086 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 \ No newline at end of file +2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 2147483647 0.7 0.6 OneLoneHam Yellow \ No newline at end of file diff --git a/assets/longbutton2.png b/assets/longbutton2.png new file mode 100644 index 0000000000000000000000000000000000000000..d66dbdc81c31bfac6056c13b3ed24f40ad6f2f58 GIT binary patch literal 7020 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 Sx*5zI#M<1}EN{!cBmV*N)H6;1 literal 0 HcmV?d00001 diff --git a/assets/longhighlight_button2.png b/assets/longhighlight_button2.png new file mode 100644 index 0000000000000000000000000000000000000000..b2ee2af1d22abf9f8ef8c3f837182e5b4ccb59ce GIT binary patch literal 7046 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 zJrecordedActions; diff --git a/src/HamsterGame.cpp b/src/HamsterGame.cpp index da06f8a..5622687 100644 --- a/src/HamsterGame.cpp +++ b/src/HamsterGame.cpp @@ -24,8 +24,51 @@ HamsterGame::HamsterGame(const std::string&appName){ bool HamsterGame::OnUserCreate(){ CreateLayer(); EnableLayer(1U,true); + for(const std::string&map:mapNameList){ + mapPBs[map]=std::numeric_limits::max(); + } LoadPBs(); audio.SetBackgroundPlay(true); + + #ifdef __EMSCRIPTEN__ + emscripten_idb_async_load("hamster",Game().bgmVolLabel.c_str(),&Game().bgmVol,[](void*arg,void*data,int length){ + std::string rawMetadata=(char*)data; + std::cout<=Game().mapNameList.size())break; - int readVal; - file>>readVal; - mapPBs[Game().mapNameList[readCounter]]=readVal; - readCounter++; + #ifdef __EMSCRIPTEN__ + for(int i{0};const std::string&mapName:Game().mapNameList){ + mapPBs[mapName]=UNPLAYED; + emscripten_idb_async_load("hamster",Game().mapNameList[i].c_str(),&Game().mapNameList[i],[](void*arg,void*data,int length){ + std::string rawMetadata=(char*)data; + std::cout<>Game().bgmVol; + std::cout<>Game().sfxVol; + std::cout<>Game().playerName; + std::cout<>Game().hamsterColor; + std::cout<>readVal; + mapPBs[Game().mapNameList[readCounter]]=readVal; + } } - file.close(); - #endif - i++; - } + readCounter++; + } + file.close(); + #endif } const HamsterGame::GameMode HamsterGame::GetGameMode(){ diff --git a/src/HamsterGame.h b/src/HamsterGame.h index e9aa16b..59b2d04 100644 --- a/src/HamsterGame.h +++ b/src/HamsterGame.h @@ -112,6 +112,8 @@ public: const std::string PopNextMap(); void ProcessMap(); void QuitGame(); + std::string playerName{"OneLoneHamster"}; + void SaveOptions(); private: void UpdateGame(const float fElapsedTime); void DrawGame(); @@ -173,6 +175,7 @@ private: "Grand Prix I", "Grand Prix II", "Grand Prix III", + "Marathon", }; std::string emscripten_temp_val{"123456"}; std::vectorhamsterColorNames{ @@ -195,4 +198,11 @@ private: int totalOperationsCount{}; int operationsProgress{}; bool gameIsRunning{true}; -}; \ No newline at end of file + std::string bgmVolLabel{"bgmVol"}; + std::string sfxVolLabel{"sfxVol"}; + std::string playerNameLabel{"playerName"}; + std::string hamsterColorLabel{"hamsterColor"}; + float bgmVol{0.7f}; + float sfxVol{0.7f}; + std::string hamsterColor{hamsterColorNames[0]}; +}; diff --git a/src/Menu.cpp b/src/Menu.cpp index 57b35d0..c59acf9 100644 --- a/src/Menu.cpp +++ b/src/Menu.cpp @@ -42,6 +42,7 @@ All rights reserved. #include "Hamster.h" void Menu::UpdateAndDraw(HamsterGame&game,const float fElapsedTime){ + if(HamsterGame::Game().IsTextEntryEnabled()||ignoreInputs)goto Drawing; menuTransitionRefreshTimer-=fElapsedTime; for(int i{0};const Button&b:menuButtons){ @@ -74,6 +75,7 @@ void Menu::UpdateAndDraw(HamsterGame&game,const float fElapsedTime){ } } + Drawing: game.EnableLayer(0U,menuTimer>0.f); switch(currentMenu){ @@ -109,6 +111,7 @@ void Menu::UpdateAndDraw(HamsterGame&game,const float fElapsedTime){ Draw(game,currentMenu,game.SCREEN_FRAME.pos); } game.border.Update(fElapsedTime); + ignoreInputs=false; } void Menu::Transition(const TransitionType type,const MenuType gotoMenu,const float transitionTime){ if(menuTimer>0.f)return; @@ -121,22 +124,54 @@ std::vectorMenu::GetMenuButtons(const MenuType type){ std::vectorbuttons; switch(type){ case MAIN_MENU:{ - buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-32.f},"Grand Prix","button.png","highlight_button.png",Pixel{165,208,96},Pixel{37,134,139},[this](){Transition(SHIFT_LEFT,GRAND_PRIX,0.5f);}); - buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,0.f},"Single Race","button.png","highlight_button.png",Pixel{165,208,96},Pixel{37,134,139},[this](){Transition(SHIFT_UP,SINGLE_RACE,0.5f);}); - buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,32.f},"Options","button.png","highlight_button.png",Pixel{165,208,96},Pixel{37,134,139},[this](){Transition(SHIFT_RIGHT,OPTIONS,0.5f);}); - buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,64.f},"Quit","button.png","highlight_button.png",Pixel{165,208,96},Pixel{37,134,139},[this](){Transition(SHIFT_DOWN,QUIT,0.5f);}); + buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-32.f},"Grand Prix","button.png","highlight_button.png",Pixel{165,208,96},Pixel{37,134,139},[this](Button&self){Transition(SHIFT_LEFT,GRAND_PRIX,0.5f);}); + buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,0.f},"Single Race","button.png","highlight_button.png",Pixel{165,208,96},Pixel{37,134,139},[this](Button&self){Transition(SHIFT_UP,SINGLE_RACE,0.5f);}); + buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,32.f},"Options","button.png","highlight_button.png",Pixel{165,208,96},Pixel{37,134,139},[this](Button&self){Transition(SHIFT_RIGHT,OPTIONS,0.5f);}); + buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,64.f},"Quit","button.png","highlight_button.png",Pixel{165,208,96},Pixel{37,134,139},[this](Button&self){Transition(SHIFT_DOWN,QUIT,0.5f);}); }break; case GRAND_PRIX:{ //Add more buttons up here! - buttons.emplace_back(vf2d{54.f,HamsterGame::SCREEN_FRAME.size.y-24.f},"< Back","button3.png","highlight_button3.png",Pixel{145,199,255},Pixel{145,199,255},[this](){Transition(SHIFT_RIGHT,MAIN_MENU,0.5f);}); + buttons.emplace_back(vf2d{54.f,HamsterGame::SCREEN_FRAME.size.y-24.f},"< Back","button3.png","highlight_button3.png",Pixel{145,199,255},Pixel{145,199,255},[this](Button&self){Transition(SHIFT_RIGHT,MAIN_MENU,0.5f);}); }break; case SINGLE_RACE:{ //Add more buttons up here! - buttons.emplace_back(vf2d{54.f,HamsterGame::SCREEN_FRAME.size.y-24.f},"< Back","button4.png","highlight_button4.png",Pixel{220,185,155},Pixel{180,140,152},[this](){Transition(SHIFT_DOWN,MAIN_MENU,0.5f);}); + buttons.emplace_back(vf2d{54.f,HamsterGame::SCREEN_FRAME.size.y-24.f},"< Back","button4.png","highlight_button4.png",Pixel{220,185,155},Pixel{180,140,152},[this](Button&self){Transition(SHIFT_DOWN,MAIN_MENU,0.5f);}); }break; case OPTIONS:{ - //Add more buttons up here! - buttons.emplace_back(vf2d{54.f,HamsterGame::SCREEN_FRAME.size.y-24.f},"< Back","button2.png","highlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](){Transition(SHIFT_LEFT,MAIN_MENU,0.5f);}); + buttons.emplace_back(HamsterGame::SCREEN_FRAME.size/2+vf2d{0.f,-32.f},std::format("BGM: {}",int(round(HamsterGame::Game().bgmVol*100))),"button2.png","highlight_button2.png",Pixel{114,109,163},Pixel{79,81,128},[this](Button&self){ + HamsterGame::Game().bgmVol=((int(round(HamsterGame::Game().bgmVol*100))+10)%110)/100.f; + self.buttonText=std::format("BGM: {}",int(round(HamsterGame::Game().bgmVol*100))); + HamsterGame::Game().emscripten_temp_val=std::to_string(HamsterGame::Game().bgmVol); + #ifdef __EMSCRIPTEN__ + emscripten_idb_async_store("hamster",HamsterGame::Game().bgmVolLabel.c_str(),HamsterGame::Game().emscripten_temp_val.data(),HamsterGame::Game().emscripten_temp_val.length(),0,[](void*args){ + std::cout<<"Success!"<onClick) +Menu::Button::Button(const vf2d pos,const std::string&buttonText,const std::string&buttonImg,const std::string&highlightButtonImg,const Pixel textCol,const Pixel highlightTextCol,const std::functiononClick) :pos(pos),buttonText(buttonText),buttonImg(buttonImg),highlightButtonImg(highlightButtonImg),onClick(onClick),textCol(textCol),highlightTextCol(highlightTextCol){} const bool Menu::Button::IsHovered(const vf2d&offset)const{ @@ -303,7 +342,14 @@ const bool Menu::Button::IsHovered(const vf2d&offset)const{ void Menu::Button::Draw(HamsterGame&game,const vf2d&offset,std::optional>selectedButton)const{ if(selectedButton.has_value()&&&selectedButton.value().get()==this){ game.DrawRotatedDecal(pos+offset,game.GetGFX(highlightButtonImg).Decal(),0.f,game.GetGFX(highlightButtonImg).Sprite()->Size()/2); - game.DrawRotatedStringPropDecal(pos+offset,buttonText,0.f,game.GetTextSizeProp(buttonText)/2,highlightTextCol); + if(game.IsTextEntryEnabled()&&buttonText.starts_with("Player Name")){ + std::string blinkingCursor{" "}; + if(fmod(game.GetRuntime(),1.f)<0.5f)blinkingCursor="|"; + game.DrawRotatedStringPropDecal(pos+offset,std::format("Player Name: {}{}",game.TextEntryGetString(),blinkingCursor),0.f,game.GetTextSizeProp(buttonText)/2,highlightTextCol); + std::string helpText{"Press or to finish name entry."}; + const vf2d helpTextSize{game.GetTextSizeProp(helpText)}; + game.DrawShadowRotatedStringPropDecal(pos+offset+vf2d{0,12.f},helpText,0.f,helpTextSize/2); + }else game.DrawRotatedStringPropDecal(pos+offset,buttonText,0.f,game.GetTextSizeProp(buttonText)/2,highlightTextCol); }else{ game.DrawRotatedDecal(pos+offset,game.GetGFX(buttonImg).Decal(),0.f,game.GetGFX(buttonImg).Sprite()->Size()/2); game.DrawRotatedStringPropDecal(pos+offset,buttonText,0.f,game.GetTextSizeProp(buttonText)/2,textCol); @@ -311,5 +357,26 @@ void Menu::Button::Draw(HamsterGame&game,const vf2d&offset,std::optionalonClick; + std::functiononClick; public: - Button(const vf2d pos,const std::string&buttonText,const std::string&buttonImg,const std::string&highlightButtonImg,const Pixel textCol,const Pixel highlightTextCol,const std::functiononClick={}); + std::string buttonText; + Button(const vf2d pos,const std::string&buttonText,const std::string&buttonImg,const std::string&highlightButtonImg,const Pixel textCol,const Pixel highlightTextCol,const std::functiononClick={}); const bool IsHovered(const vf2d&offset)const; void OnClick(); void Draw(HamsterGame&game,const vf2d&pos,std::optional>selectedButton={})const; @@ -103,8 +103,10 @@ class Menu{ void DrawTransition(HamsterGame&game); void OnMenuTransition(); std::vector