From 02c7165b371b2b341c44857852c506ded3eb9de8 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Tue, 24 Oct 2023 03:03:34 -0500 Subject: [PATCH] Add in class display labels, animated sprite icons, and title of the window. --- Crawler/CharacterRotatingDisplay.h | 2 +- Crawler/ClassSelectionWindow.cpp | 93 +++++++++++++++-------------- Crawler/Crawler.cpp | 16 ++--- Crawler/Crawler.vcxproj | 5 +- Crawler/Crawler.vcxproj.filters | 3 + Crawler/Menu.cpp | 12 ++++ Crawler/Menu.h | 2 +- Crawler/MenuAnimatedIconButton.h | 28 +++++++++ Crawler/MenuComponent.cpp | 6 +- Crawler/MenuComponent.h | 1 + Crawler/MenuIconButton.h | 4 +- Crawler/Version.h | 2 +- Crawler/assets/nico-warrior.png | Bin 21575 -> 9352 bytes Crawler/assets/nico-warrior.xcf | Bin 32779 -> 32757 bytes Crawler/safemap.h | 2 +- 15 files changed, 115 insertions(+), 61 deletions(-) create mode 100644 Crawler/MenuAnimatedIconButton.h diff --git a/Crawler/CharacterRotatingDisplay.h b/Crawler/CharacterRotatingDisplay.h index 2099af2d..1bb699c4 100644 --- a/Crawler/CharacterRotatingDisplay.h +++ b/Crawler/CharacterRotatingDisplay.h @@ -9,7 +9,7 @@ class CharacterRotatingDisplay:public MenuComponent{ protected: Decal*icon; float timer; - float rotatingFactor=18; + float rotatingFactor=7; float perspectiveFactor=6; public: inline CharacterRotatingDisplay(MenuType parent,geom2d::rectrect,Decal*icon) diff --git a/Crawler/ClassSelectionWindow.cpp b/Crawler/ClassSelectionWindow.cpp index e537c384..12e15896 100644 --- a/Crawler/ClassSelectionWindow.cpp +++ b/Crawler/ClassSelectionWindow.cpp @@ -3,6 +3,7 @@ #include "DEFINES.h" #include "Menu.h" #include "MenuLabel.h" +#include "MenuAnimatedIconButton.h" INCLUDE_game typedef Attribute A; @@ -14,58 +15,62 @@ void Menu::InitializeClassSelectionWindow(){ vf2d outlineSize=classSelectionWindow->size-vf2d{13,13}; + MenuLabel*classSelectionLabel=new MenuLabel(CLASS_SELECTION,{{4,20},{outlineSize.x,32}},"Choose a Character Class",2,true,true,true,true); + classSelectionWindow->AddComponent("Class Selection Title Label",classSelectionLabel); + MenuLabel*outline=new MenuLabel(CLASS_SELECTION,{{4,4},outlineSize},"",1,true,false,true,false); classSelectionWindow->AddComponent("Outline Border",outline); vf2d buttonPadding={2,2}; - vf2d buttonSize={outlineSize.y/3-buttonPadding.y*3,outlineSize.y/3-buttonPadding.y*3}; + vf2d buttonSize={floor(outlineSize.y/3-buttonPadding.y*3),outlineSize.y/9-buttonPadding.y*3}; //The floor is for fixing a small pixel rounding bug. float buttonTotalWidth=(buttonSize.x+buttonPadding.x)*3; vf2d buttonStartPos=outline->GetPos()+vf2d{outlineSize.x/2,outlineSize.y/3}-vf2d{buttonTotalWidth/2,0}; - MenuComponent*warriorButton=new MenuComponent(CLASS_SELECTION,{buttonStartPos+(buttonSize+buttonPadding)*vf2d{0,0},buttonSize},Warrior::name,CLASS_INFO, - [](MenuFuncData data){ - data.menu.S(A::CLASS_SELECTION)=Warrior::name; - delete Menu::menus[CLASS_INFO]; - Menu::InitializeClassInfoWindow(); - }); - MenuComponent*rangerButton=new MenuComponent(CLASS_SELECTION,{buttonStartPos+(buttonSize+buttonPadding)*vf2d{1,0},buttonSize},Ranger::name,CLASS_INFO, - [](MenuFuncData data){ - data.menu.S(A::CLASS_SELECTION)=Ranger::name; - delete Menu::menus[CLASS_INFO]; - Menu::InitializeClassInfoWindow(); - }); - MenuComponent*wizardButton=new MenuComponent(CLASS_SELECTION,{buttonStartPos+(buttonSize+buttonPadding)*vf2d{2,0},buttonSize},Wizard::name,CLASS_INFO, - [](MenuFuncData data){ - data.menu.S(A::CLASS_SELECTION)=Wizard::name; - delete Menu::menus[CLASS_INFO]; - Menu::InitializeClassInfoWindow(); - }); - MenuComponent*thiefButton=new MenuComponent(CLASS_SELECTION,{buttonStartPos+(buttonSize+buttonPadding)*vf2d{0,1},buttonSize},Thief::name,CLASS_INFO, - [](MenuFuncData data){ - data.menu.S(A::CLASS_SELECTION)=Thief::name; - delete Menu::menus[CLASS_INFO]; - Menu::InitializeClassInfoWindow(); - }); - MenuComponent*trapperButton=new MenuComponent(CLASS_SELECTION,{buttonStartPos+(buttonSize+buttonPadding)*vf2d{1,1},buttonSize},Trapper::name,CLASS_INFO, - [](MenuFuncData data){ - data.menu.S(A::CLASS_SELECTION)=Trapper::name; - delete Menu::menus[CLASS_INFO]; - Menu::InitializeClassInfoWindow(); - }); - MenuComponent*witchButton=new MenuComponent(CLASS_SELECTION,{buttonStartPos+(buttonSize+buttonPadding)*vf2d{2,1},buttonSize},Witch::name,CLASS_INFO, - [](MenuFuncData data){ - data.menu.S(A::CLASS_SELECTION)=Witch::name; - delete Menu::menus[CLASS_INFO]; - Menu::InitializeClassInfoWindow(); - }); - - classSelectionWindow->AddComponent("Warrior Button",warriorButton); - classSelectionWindow->AddComponent("Ranger Button",rangerButton); - classSelectionWindow->AddComponent("Wizard Button",wizardButton); - classSelectionWindow->AddComponent("Thief Button",thiefButton); - classSelectionWindow->AddComponent("Trapper Button",trapperButton); - classSelectionWindow->AddComponent("Witch Button",witchButton); + std::arrayclassNames={ + Warrior::name, + Ranger::name, + Wizard::name, + Thief::name, + Trapper::name, + Witch::name, + }; + std::arrayclassAnimationNames={ + Warrior::walk_s, + Ranger::walk_s, + Wizard::walk_s, + Thief::walk_s, + Trapper::walk_s, + Witch::walk_s, + }; + + for(int i=0;i<6;i++){ + std::string className=classNames[i]; + std::string classAnimationName=classAnimationNames[i]; + vf2d offsetPos={ + buttonStartPos.x+(buttonSize.x+buttonPadding.x)*float(i%3), + buttonStartPos.y+(buttonSize.y+buttonPadding.y+2*outlineSize.y/9)*float(i/3)+2*outlineSize.y/9, + }; + vf2d backgroundOffsetPos={ + buttonStartPos.x+(buttonSize.x+buttonPadding.x)*float(i%3), + buttonStartPos.y+(buttonSize.y+buttonPadding.y+2*outlineSize.y/9)*float(i/3), + }; + vf2d backgroundSize={floor(outlineSize.y/3-buttonPadding.y*3),outlineSize.y/3-buttonPadding.y*3}; //The floor is for fixing a small pixel rounding bug. + MenuLabel*backgroundOutline=new MenuLabel(CLASS_SELECTION,{backgroundOffsetPos,backgroundSize},"",1,true,false,true,true); + MenuLabel*classLabel=new MenuLabel(CLASS_SELECTION,{backgroundOffsetPos,buttonSize},className,1,true,true); + MenuAnimatedIconButton*classSprite=new MenuAnimatedIconButton(CLASS_SELECTION,{backgroundOffsetPos+vf2d{0,12},backgroundSize+vf2d{0,-buttonSize.y-12}},classAnimationName,[](MenuFuncData data){},false); + MenuComponent*classButton=new MenuComponent(CLASS_SELECTION,{offsetPos,buttonSize},"Info",CLASS_INFO, + [](MenuFuncData data){ + data.menu.S(A::CLASS_SELECTION)=data.component->S(A::CLASS_SELECTION); + delete Menu::menus[CLASS_INFO]; + Menu::InitializeClassInfoWindow(); + }); + classButton->S(A::CLASS_SELECTION)=className; + classSelectionWindow->AddComponent(className+" Button",classButton); + classSelectionWindow->AddComponent(className+" Background",backgroundOutline); + classSelectionWindow->AddComponent(className+" Label",classLabel); + classSelectionWindow->AddComponent(className+" Icon",classSprite); + } } \ No newline at end of file diff --git a/Crawler/Crawler.cpp b/Crawler/Crawler.cpp index 62d744c0..826693b0 100644 --- a/Crawler/Crawler.cpp +++ b/Crawler/Crawler.cpp @@ -109,6 +109,14 @@ bool Crawler::OnUserCreate(){ InitializeGraphics(); InitializeClasses(); + Monster::InitializeStrategies(); + //Animations + sig::Animation::InitializeAnimations(); + MonsterData::InitializeMonsterData(); + + sig::Animation::SetupPlayerAnimations(); + view=TileTransformedView{GetScreenSize(),{1,1}}; + Menu::InitializeMenus(); Inventory::AddItem("Small Health Potion",16); @@ -130,14 +138,6 @@ bool Crawler::OnUserCreate(){ Inventory::AddItem("Bandages",10); Inventory::AddItem("Blue Slime Remains",22); - Monster::InitializeStrategies(); - //Animations - sig::Animation::InitializeAnimations(); - MonsterData::InitializeMonsterData(); - - sig::Animation::SetupPlayerAnimations(); - view=TileTransformedView{GetScreenSize(),{1,1}}; - LoadLevel(LEVEL_NAMES["starting_map"_S]); ChangePlayerClass(WARRIOR); diff --git a/Crawler/Crawler.vcxproj b/Crawler/Crawler.vcxproj index 352b7b62..cff5ede7 100644 --- a/Crawler/Crawler.vcxproj +++ b/Crawler/Crawler.vcxproj @@ -156,7 +156,7 @@ - Level3 + TurnOffAllWarnings true true true @@ -219,7 +219,7 @@ - Level3 + TurnOffAllWarnings true true true @@ -331,6 +331,7 @@ + diff --git a/Crawler/Crawler.vcxproj.filters b/Crawler/Crawler.vcxproj.filters index 4114a6fc..e58383cf 100644 --- a/Crawler/Crawler.vcxproj.filters +++ b/Crawler/Crawler.vcxproj.filters @@ -350,6 +350,9 @@ Source Files\Interface + + Header Files\Interface + diff --git a/Crawler/Menu.cpp b/Crawler/Menu.cpp index d275580c..f9ca84b2 100644 --- a/Crawler/Menu.cpp +++ b/Crawler/Menu.cpp @@ -14,6 +14,18 @@ safeunorderedmapMenu::themes; safemap>Menu::inventoryListeners; const vf2d Menu::CENTERED = {-456,-456}; std::vectorMenu::unhandledComponents; +////////////////////////////////////////////////////////////////////////////////////////////////// +///__///////////////////////////////////////////////////////////////////////////////////////////// +//| |//////////////////////////////////////////////////////////////////////////////////////////// +//| |/////WARNING! If you are adding something here you likely are adding another container with MenuComponent pointers in it right now. +//| |/////Because we are handling raw pointers, you must also add this container to the list of iterating search removal contains that occur in the +//| |/////DESTRUCTOR of MenuComponents!!!!! THIS IS NOT A DRILL! +//|__|//////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////// +///__///////////////////////////////////////////////////////////////////////////////////////////// +//|__///////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////// MenuType Menu::lastMenuTypeCreated; std::string Menu::lastRegisteredComponent; diff --git a/Crawler/Menu.h b/Crawler/Menu.h index f2c3da87..41bad1c7 100644 --- a/Crawler/Menu.h +++ b/Crawler/Menu.h @@ -79,7 +79,7 @@ private: static void InitializeClassInfoWindow(); static void InitializeClassSelectionWindow(); static void InitializeMainMenuWindow(); - //X (0-3), Y (0-2) for specific 9-patch tile (tiled version). + //X (0-2), Y (0-2) for specific 9-patch tile (tiled version). static Renderable&GetPatchPart(int x,int y); void KeyboardButtonNavigation(Crawler*game,vf2d menuPos); diff --git a/Crawler/MenuAnimatedIconButton.h b/Crawler/MenuAnimatedIconButton.h new file mode 100644 index 00000000..d8e90f42 --- /dev/null +++ b/Crawler/MenuAnimatedIconButton.h @@ -0,0 +1,28 @@ +#pragma once +#include "MenuIconButton.h" +#include "DEFINES.h" +#include "Crawler.h" + +INCLUDE_game +INCLUDE_ANIMATION_DATA + +class MenuAnimatedIconButton:public MenuIconButton{ +protected: + std::string animation; +private: + float animationTime=0; +public: + inline MenuAnimatedIconButton(MenuType parent,geom2d::rectrect,std::string animation,MenuFunc onClick,bool selectable=true) + :MenuIconButton(parent,rect,nullptr,onClick,selectable),animation(animation){} +protected: + virtual inline void Update(Crawler*game)override{ + MenuIconButton::Update(game); + animationTime+=game->GetElapsedTime(); + } + virtual inline void Draw(Crawler*game,vf2d parentPos,bool focused)override{ + MenuComponent::Draw(game,parentPos,focused); //INTENTIONAL! The way we draw animations is different from static images, we skip over MenuIconButton's draw! + Sprite*spr=ANIMATION_DATA[animation].GetFrame(animationTime).GetSourceImage()->Sprite(); + geom2d::rectsprRect=ANIMATION_DATA[animation].GetFrame(animationTime).GetSourceRect(); + game->DrawPartialSprite(parentPos+rect.middle()-sprRect.size/2,spr,sprRect.pos,sprRect.size,1,Sprite::Flip::NONE); + } +}; \ No newline at end of file diff --git a/Crawler/MenuComponent.cpp b/Crawler/MenuComponent.cpp index f479dad6..4f4e3368 100644 --- a/Crawler/MenuComponent.cpp +++ b/Crawler/MenuComponent.cpp @@ -106,4 +106,8 @@ vf2d MenuComponent::GetPos(){ return rect.pos; } -void MenuComponent::OnInventorySlotsUpdate(ITCategory cat){} \ No newline at end of file +void MenuComponent::OnInventorySlotsUpdate(ITCategory cat){} + +std::string MenuComponent::GetLabel(){ + return label; +} \ No newline at end of file diff --git a/Crawler/MenuComponent.h b/Crawler/MenuComponent.h index 2a5755bc..d71efda3 100644 --- a/Crawler/MenuComponent.h +++ b/Crawler/MenuComponent.h @@ -52,4 +52,5 @@ public: virtual bool HandleOutsideDisabledButtonSelection(MenuComponent*disabledButton); //Called whenever an inventory slot gets updated, whether it's adding or removing an item. virtual void OnInventorySlotsUpdate(ITCategory cat); + std::string GetLabel(); }; \ No newline at end of file diff --git a/Crawler/MenuIconButton.h b/Crawler/MenuIconButton.h index d6ab4082..294f56bb 100644 --- a/Crawler/MenuIconButton.h +++ b/Crawler/MenuIconButton.h @@ -9,8 +9,8 @@ class MenuIconButton:public MenuComponent{ protected: Decal*icon; public: - inline MenuIconButton(MenuType parent,geom2d::rectrect,Decal*icon,MenuFunc onClick) - :MenuComponent(parent,rect,"",onClick),icon(icon){} + inline MenuIconButton(MenuType parent,geom2d::rectrect,Decal*icon,MenuFunc onClick,bool selectable=true) + :MenuComponent(parent,rect,"",onClick,selectable),icon(icon){} protected: virtual inline void Update(Crawler*game)override{ MenuComponent::Update(game); diff --git a/Crawler/Version.h b/Crawler/Version.h index 0d7fec4b..56b0df1b 100644 --- a/Crawler/Version.h +++ b/Crawler/Version.h @@ -2,7 +2,7 @@ #define VERSION_MAJOR 0 #define VERSION_MINOR 2 #define VERSION_PATCH 0 -#define VERSION_BUILD 2335 +#define VERSION_BUILD 2391 #define stringify(a) stringify_(a) #define stringify_(a) #a diff --git a/Crawler/assets/nico-warrior.png b/Crawler/assets/nico-warrior.png index 56cbe0fed0edf80d06e58bfc4828691a30ee5a0d..17b3bd36c41b97dcebb4478e2f5b518b0165e4e5 100644 GIT binary patch delta 5026 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 bool initialized=false; public: - O&operator[](T key){ + O&operator[](T key){ if(initialized&&map.count(key)==0){ std::cout<<"WARNING! Trying to get non-existent key "<