Switched menu button system to component inheritance system.
This commit is contained in:
parent
2914aa1972
commit
3723835cc7
@ -77,7 +77,6 @@ Crawler::Crawler()
|
||||
bool Crawler::OnUserCreate(){
|
||||
InitializeDefaultKeybinds();
|
||||
InitializeLevels();
|
||||
Menu::InitializeMenus();
|
||||
|
||||
circleCooldownPoints.push_back({0,0});
|
||||
for(int i=0;i<=360;i+=4){
|
||||
@ -107,6 +106,8 @@ bool Crawler::OnUserCreate(){
|
||||
GFX.SetInitialized();
|
||||
std::cout<<GFX.size()<<" images have been loaded."<<std::endl;
|
||||
|
||||
Menu::InitializeMenus();
|
||||
|
||||
Monster::InitializeStrategies();
|
||||
//Animations
|
||||
sig::Animation::InitializeAnimations();
|
||||
|
@ -274,7 +274,7 @@
|
||||
<ClInclude Include="Key.h" />
|
||||
<ClInclude Include="Map.h" />
|
||||
<ClInclude Include="Menu.h" />
|
||||
<ClInclude Include="MenuButton.h" />
|
||||
<ClInclude Include="MenuComponent.h" />
|
||||
<ClInclude Include="Monster.h" />
|
||||
<ClInclude Include="MonsterAttribute.h" />
|
||||
<ClInclude Include="MonsterStrategyHelpers.h" />
|
||||
@ -313,7 +313,8 @@
|
||||
<ClCompile Include="LightningBoltEmitter.cpp" />
|
||||
<ClCompile Include="Map.cpp" />
|
||||
<ClCompile Include="Menu.cpp" />
|
||||
<ClCompile Include="MenuButton.cpp" />
|
||||
<ClCompile Include="MenuComponent.cpp" />
|
||||
<ClCompile Include="MenuIconButton.cpp" />
|
||||
<ClCompile Include="Meteor.cpp" />
|
||||
<ClCompile Include="RunAway.cpp" />
|
||||
<ClCompile Include="RunTowards.cpp" />
|
||||
|
@ -147,7 +147,7 @@
|
||||
<ClInclude Include="Menu.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="MenuButton.h">
|
||||
<ClInclude Include="MenuComponent.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="MenuType.h">
|
||||
@ -266,7 +266,7 @@
|
||||
<ClCompile Include="Menu.cpp">
|
||||
<Filter>Source Files\Interface</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="MenuButton.cpp">
|
||||
<ClCompile Include="MenuComponent.cpp">
|
||||
<Filter>Source Files\Interface</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="TestMenu.cpp">
|
||||
@ -275,6 +275,9 @@
|
||||
<ClCompile Include="TestSubMenu.cpp">
|
||||
<Filter>Source Files\Interface</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="MenuIconButton.cpp">
|
||||
<Filter>Source Files\Interface</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="cpp.hint" />
|
||||
|
@ -23,16 +23,16 @@ void Menu::InitializeMenus(){
|
||||
}
|
||||
}
|
||||
|
||||
void Menu::AddButton(const MenuButton&button){
|
||||
buttons[button.rect.pos.y].push_back(button);
|
||||
void Menu::AddComponent(MenuComponent*button){
|
||||
buttons[button->rect.pos.y].push_back(button);
|
||||
}
|
||||
|
||||
void Menu::MenuSelect(Crawler*game){
|
||||
if(selection==vi2d{-1,-1})return;
|
||||
buttons[selection.y][selection.x].onClick(*this,game);
|
||||
if(buttons[selection.y][selection.x].menuDest!=MenuType::ENUM_END){
|
||||
buttons[selection.y][selection.x]->onClick(*this,game);
|
||||
if(buttons[selection.y][selection.x]->menuDest!=MenuType::ENUM_END){
|
||||
if(stack.size()<32){
|
||||
stack.push_back(&menus[buttons[selection.y][selection.x].menuDest]);//Navigate to the next menu.
|
||||
stack.push_back(&menus[buttons[selection.y][selection.x]->menuDest]);//Navigate to the next menu.
|
||||
}else{
|
||||
std::cout<<"WARNING! Exceeded menu stack size limit!"<<std::endl;
|
||||
throw;
|
||||
@ -45,16 +45,16 @@ void Menu::Update(Crawler*game){
|
||||
|
||||
for(auto&key:buttons){
|
||||
for(auto&button:key.second){
|
||||
button.hovered=false;
|
||||
button->hovered=false;
|
||||
}
|
||||
}
|
||||
if(!MOUSE_NAVIGATION){
|
||||
if(selection!=vi2d{-1,-1})buttons[selection.y][selection.x].hovered=true;
|
||||
if(selection!=vi2d{-1,-1})buttons[selection.y][selection.x]->hovered=true;
|
||||
}else{
|
||||
for(auto&key:buttons){
|
||||
for(auto&button:key.second){
|
||||
if(geom2d::overlaps(geom2d::rect<float>{button.rect.pos+upperLeftPos,button.rect.size},game->GetMousePos())){
|
||||
button.hovered=true;
|
||||
if(geom2d::overlaps(geom2d::rect<float>{button->rect.pos+upperLeftPos,button->rect.size},game->GetMousePos())){
|
||||
button->hovered=true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -84,7 +84,7 @@ void Menu::Update(Crawler*game){
|
||||
for(auto&key:buttons){
|
||||
int index=0;
|
||||
for(auto&button:key.second){
|
||||
if(geom2d::overlaps(geom2d::rect<float>{button.rect.pos+upperLeftPos,button.rect.size},game->GetMousePos())){
|
||||
if(geom2d::overlaps(geom2d::rect<float>{button->rect.pos+upperLeftPos,button->rect.size},game->GetMousePos())){
|
||||
selection={index,key.first};
|
||||
break;
|
||||
}
|
||||
@ -96,7 +96,7 @@ void Menu::Update(Crawler*game){
|
||||
}
|
||||
for(auto&key:buttons){
|
||||
for(auto&button:key.second){
|
||||
button.Update(game);
|
||||
button->Update(game);
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -106,7 +106,7 @@ void Menu::Draw(Crawler*game){
|
||||
game->FillRectDecal(upperLeftPos,size,VERY_DARK_BLUE);
|
||||
for(auto&key:buttons){
|
||||
for(auto&button:key.second){
|
||||
button.Draw(game,upperLeftPos);
|
||||
button->Draw(game,upperLeftPos);
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -141,11 +141,11 @@ void Menu::KeyboardButtonNavigation(Crawler*game){
|
||||
}else{
|
||||
for(auto&key:buttons){
|
||||
if(found){ //Once we discover the previous element, the next element becomes our next selection.
|
||||
int previousButtonX=buttons[selection.y][selection.x].rect.pos.x;
|
||||
int previousButtonX=buttons[selection.y][selection.x]->rect.pos.x;
|
||||
selection.y=key.first;
|
||||
int index=0;
|
||||
for(auto&button:key.second){ //Try to match a button in the same column as this button first.
|
||||
if(previousButtonX==button.rect.pos.x){
|
||||
if(previousButtonX==button->rect.pos.x){
|
||||
selection.x=index;
|
||||
break;
|
||||
}
|
||||
@ -183,11 +183,11 @@ void Menu::KeyboardButtonNavigation(Crawler*game){
|
||||
prevInd=key.first;
|
||||
}
|
||||
if(prevInd!=-1){
|
||||
int previousButtonX=buttons[selection.y][selection.x].rect.pos.x;
|
||||
int previousButtonX=buttons[selection.y][selection.x]->rect.pos.x;
|
||||
selection.y=prevInd;
|
||||
int index=0;
|
||||
for(auto&button:buttons[prevInd]){ //Try to match a button in the same column as this button first.
|
||||
if(previousButtonX==button.rect.pos.x){
|
||||
if(previousButtonX==button->rect.pos.x){
|
||||
selection.x=index;
|
||||
break;
|
||||
}
|
||||
|
@ -1,8 +1,10 @@
|
||||
#pragma once
|
||||
#include "MenuButton.h"
|
||||
#include "MenuComponent.h"
|
||||
#include "olcPixelGameEngine.h"
|
||||
#include <stack>
|
||||
|
||||
#define MENUFUNC [](Menu&menu,Crawler*game)
|
||||
|
||||
class Crawler;
|
||||
|
||||
class Menu{
|
||||
@ -11,13 +13,13 @@ class Menu{
|
||||
static bool MOUSE_NAVIGATION;
|
||||
static std::map<MenuType,Menu>menus;
|
||||
|
||||
std::map<int/*Y*/,std::vector<MenuButton>>buttons; //Buttons are stored in rows followed by their column order.
|
||||
std::map<int/*Y*/,std::vector<MenuComponent*>>buttons; //Buttons are stored in rows followed by their column order.
|
||||
vi2d selection={-1,-1};
|
||||
vf2d size; //Size in tiles (24x24), every menu will be tile-based
|
||||
public:
|
||||
Menu();
|
||||
Menu(vf2d size);
|
||||
void AddButton(const MenuButton&button);
|
||||
void AddComponent(MenuComponent*button);
|
||||
void Update(Crawler*game);
|
||||
void Draw(Crawler*game);
|
||||
static void InitializeMenus();
|
||||
|
@ -1,22 +0,0 @@
|
||||
#include "Crawler.h"
|
||||
#include "Menu.h"
|
||||
|
||||
MenuButton::MenuButton(geom2d::rect<float>rect,std::string label,Decal*icon,MenuFunc onClick)
|
||||
:rect(rect),label(label),menuDest(MenuType::ENUM_END),icon(icon),onClick(onClick),hoverEffect(0){}
|
||||
|
||||
MenuButton::MenuButton(geom2d::rect<float>rect,std::string label,MenuType menuDest,Decal*icon,MenuFunc onClick)
|
||||
:rect(rect),label(label),menuDest(menuDest),icon(icon),onClick(onClick),hoverEffect(0){}
|
||||
|
||||
void MenuButton::Update(Crawler*game){
|
||||
if(hovered){
|
||||
hoverEffect=std::min(1.f,hoverEffect+game->GetElapsedTime());
|
||||
}else{
|
||||
hoverEffect=std::max(0.f,hoverEffect-game->GetElapsedTime());
|
||||
}
|
||||
}
|
||||
|
||||
void MenuButton::Draw(Crawler*game,vf2d parentPos){
|
||||
game->FillRectDecal(rect.pos+parentPos,rect.size,PixelLerp(VERY_DARK_BLUE,CYAN,hoverEffect));
|
||||
game->DrawRectDecal(rect.pos+parentPos,rect.size,GREY);
|
||||
game->DrawStringPropDecal(rect.pos+parentPos+rect.size/2-game->GetTextSizeProp(label)/2,label);
|
||||
}
|
@ -1,24 +0,0 @@
|
||||
#pragma once
|
||||
#include "olcUTIL_Geometry2D.h"
|
||||
#include "MenuType.h"
|
||||
#include <functional>
|
||||
|
||||
class Menu;
|
||||
class Crawler;
|
||||
|
||||
class MenuButton{
|
||||
friend class Menu;
|
||||
MenuType menuDest;
|
||||
geom2d::rect<float>rect;
|
||||
std::string label;
|
||||
Decal*icon;
|
||||
MenuFunc onClick;
|
||||
bool hovered=false;
|
||||
private:
|
||||
float hoverEffect=0;
|
||||
public:
|
||||
MenuButton(geom2d::rect<float>rect,std::string label,Decal*icon,MenuFunc onClick);
|
||||
MenuButton(geom2d::rect<float>rect,std::string label,MenuType menuDest,Decal* icon,MenuFunc onClick);
|
||||
void Update(Crawler*game);
|
||||
void Draw(Crawler*game,vf2d parentPos);
|
||||
};
|
22
Crawler/MenuComponent.cpp
Normal file
22
Crawler/MenuComponent.cpp
Normal file
@ -0,0 +1,22 @@
|
||||
#include "Crawler.h"
|
||||
#include "Menu.h"
|
||||
|
||||
MenuComponent::MenuComponent(geom2d::rect<float>rect,std::string label,MenuFunc onClick)
|
||||
:rect(rect),label(label),menuDest(MenuType::ENUM_END),onClick(onClick),hoverEffect(0){}
|
||||
|
||||
MenuComponent::MenuComponent(geom2d::rect<float>rect,std::string label,MenuType menuDest,MenuFunc onClick)
|
||||
:rect(rect),label(label),menuDest(menuDest),onClick(onClick),hoverEffect(0){}
|
||||
|
||||
void MenuComponent::Update(Crawler*game){
|
||||
if(hovered){
|
||||
hoverEffect=std::min(1.f,hoverEffect+game->GetElapsedTime());
|
||||
}else{
|
||||
hoverEffect=std::max(0.f,hoverEffect-game->GetElapsedTime());
|
||||
}
|
||||
}
|
||||
|
||||
void MenuComponent::Draw(Crawler*game,vf2d parentPos){
|
||||
game->FillRectDecal(rect.pos+parentPos,rect.size,PixelLerp(VERY_DARK_BLUE,CYAN,hoverEffect));
|
||||
game->DrawRectDecal(rect.pos+parentPos,rect.size,GREY);
|
||||
game->DrawStringPropDecal(rect.pos+parentPos+rect.size/2-game->GetTextSizeProp(label)/2,label);
|
||||
}
|
34
Crawler/MenuComponent.h
Normal file
34
Crawler/MenuComponent.h
Normal file
@ -0,0 +1,34 @@
|
||||
#pragma once
|
||||
#include "olcUTIL_Geometry2D.h"
|
||||
#include "MenuType.h"
|
||||
#include <functional>
|
||||
|
||||
class Menu;
|
||||
class Crawler;
|
||||
|
||||
class MenuComponent{
|
||||
friend class Menu;
|
||||
MenuType menuDest;
|
||||
std::string label;
|
||||
MenuFunc onClick;
|
||||
bool hovered=false;
|
||||
private:
|
||||
float hoverEffect=0;
|
||||
protected:
|
||||
geom2d::rect<float>rect;
|
||||
public:
|
||||
MenuComponent(geom2d::rect<float>rect,std::string label,MenuFunc onClick);
|
||||
MenuComponent(geom2d::rect<float>rect,std::string label,MenuType menuDest,MenuFunc onClick);
|
||||
virtual void Update(Crawler*game);
|
||||
virtual void Draw(Crawler*game,vf2d parentPos);
|
||||
};
|
||||
|
||||
class MenuIconButton:public MenuComponent{
|
||||
private:
|
||||
Decal*icon;
|
||||
public:
|
||||
MenuIconButton(geom2d::rect<float>rect,Decal*icon,MenuFunc onClick);
|
||||
protected:
|
||||
virtual void Update(Crawler*game)override;
|
||||
virtual void Draw(Crawler*game,vf2d parentPos)override;
|
||||
};
|
15
Crawler/MenuIconButton.cpp
Normal file
15
Crawler/MenuIconButton.cpp
Normal file
@ -0,0 +1,15 @@
|
||||
#include "MenuComponent.h"
|
||||
#include "Crawler.h"
|
||||
|
||||
MenuIconButton::MenuIconButton(geom2d::rect<float>rect,Decal*icon,MenuFunc onClick)
|
||||
:MenuComponent(rect,"",onClick),icon(icon)
|
||||
{}
|
||||
|
||||
void MenuIconButton::Update(Crawler*game){
|
||||
MenuComponent::Update(game);
|
||||
}
|
||||
|
||||
void MenuIconButton::Draw(Crawler*game,vf2d parentPos){
|
||||
MenuComponent::Draw(game,parentPos);
|
||||
game->DrawRotatedDecal(parentPos+rect.middle(),icon,0,icon->sprite->Size()/2);
|
||||
}
|
@ -699,3 +699,7 @@ void Player::SetAnimationBasedOnTargetingDirection(float targetDirection){
|
||||
void Player::SetIframes(float duration){
|
||||
iframe_time=duration;
|
||||
}
|
||||
|
||||
void Player::SetMana(int mana){
|
||||
this->mana=std::clamp(mana,0,maxmana);
|
||||
}
|
@ -133,6 +133,7 @@ public:
|
||||
bool CanAct(Ability&ability);
|
||||
void Knockback(vf2d vel);
|
||||
void SetIframes(float duration);
|
||||
void SetMana(int mana);
|
||||
|
||||
void AddBuff(BuffType type,float duration,float intensity);
|
||||
std::vector<Buff>GetBuffs(BuffType buff);
|
||||
|
@ -8,19 +8,19 @@ const Menu Menu::InitializeTestMenu(){
|
||||
menu.stack.clear();
|
||||
};
|
||||
|
||||
testMenu.AddButton(MenuButton({{24*1,24*1},{24*2,24*1}},"Close",nullptr,quitWindow));
|
||||
testMenu.AddComponent(new MenuComponent({{24*1,24*1},{24*2,24*1}},"Close",quitWindow));
|
||||
|
||||
MenuFunc doNothing=[](Menu&menu,Crawler*game){};
|
||||
|
||||
testMenu.AddButton(MenuButton({{24*4,24*1},{24*3,24*1}},"Test",nullptr,doNothing));
|
||||
testMenu.AddComponent(new MenuComponent({{24*4,24*1},{24*3,24*1}},"Test",doNothing));
|
||||
|
||||
MenuFunc HurtPlayer=[](Menu&menu,Crawler*game){
|
||||
game->GetPlayer()->Hurt(20,game->GetPlayer()->OnUpperLevel(),game->GetPlayer()->GetZ());
|
||||
};
|
||||
|
||||
testMenu.AddButton(MenuButton({{24*4,24*3},{24*3,24*1}},"Hurt Player",nullptr,HurtPlayer));
|
||||
testMenu.AddComponent(new MenuComponent({{24*4,24*3},{24*3,24*1}},"Hurt Player",HurtPlayer));
|
||||
|
||||
testMenu.AddButton(MenuButton({{24*2,24*4.5},{24*4,24*1}},"Open Another\n Menu",TEST_2,nullptr,doNothing));
|
||||
testMenu.AddComponent(new MenuComponent({{24*2,24*4.5},{24*4,24*1}},"Open Another\n Menu",TEST_2,doNothing));
|
||||
|
||||
return testMenu;
|
||||
}
|
@ -1,20 +1,31 @@
|
||||
#include "Crawler.h"
|
||||
#include "Menu.h"
|
||||
#include "DEFINES.h"
|
||||
#include "olcPixelGameEngine.h"
|
||||
#include "safemap.h"
|
||||
|
||||
INCLUDE_GFX
|
||||
|
||||
const Menu Menu::InitializeTestSubMenu(){
|
||||
Menu testSubMenu({24*4,24*5});
|
||||
|
||||
MenuFunc goBack=[](Menu&menu,Crawler*game){
|
||||
MenuFunc goBack=MENUFUNC{
|
||||
menu.stack.pop_back();
|
||||
};
|
||||
|
||||
testSubMenu.AddButton(MenuButton({{24*1,24*1},{24*2,24*1}},"Go Back",nullptr,goBack));
|
||||
testSubMenu.AddComponent(new MenuComponent({{24*1,24*1},{24*2,24*1}},"Go Back",goBack));
|
||||
|
||||
MenuFunc quitWindow=[](Menu&menu,Crawler*game){
|
||||
MenuFunc quitWindow=MENUFUNC{
|
||||
menu.stack.clear();
|
||||
};
|
||||
|
||||
testSubMenu.AddButton(MenuButton({{24*1,24*3},{24*3,24*1}},"Close Window",nullptr,quitWindow));
|
||||
testSubMenu.AddComponent(new MenuComponent({{24*1,24*3},{24*3,24*1}},"Close Window",quitWindow));
|
||||
|
||||
MenuFunc restoreMana=MENUFUNC{
|
||||
game->GetPlayer()->SetMana(game->GetPlayer()->GetMaxMana());
|
||||
};
|
||||
|
||||
testSubMenu.AddComponent(new MenuIconButton({{24*0,24*3},{24*1,24*2}},GFX["mana.png"].Decal(),restoreMana));
|
||||
|
||||
return testSubMenu;
|
||||
}
|
@ -2,7 +2,7 @@
|
||||
#define VERSION_MAJOR 0
|
||||
#define VERSION_MINOR 2
|
||||
#define VERSION_PATCH 0
|
||||
#define VERSION_BUILD 1644
|
||||
#define VERSION_BUILD 1651
|
||||
|
||||
#define stringify(a) stringify_(a)
|
||||
#define stringify_(a) #a
|
||||
|
Loading…
x
Reference in New Issue
Block a user