Add in structures to deal with custom menu navigation setups.

pull/35/head
sigonasr2 1 year ago
parent 97ce43ed21
commit cbb277cab2
  1. 21
      Adventures in Lestoria/AdventuresInLestoria.cpp
  2. 3
      Adventures in Lestoria/AdventuresInLestoria.h
  3. 4
      Adventures in Lestoria/Key.cpp
  4. 2
      Adventures in Lestoria/Key.h
  5. 16
      Adventures in Lestoria/MainMenuWindow.cpp
  6. 43
      Adventures in Lestoria/Menu.cpp
  7. 44
      Adventures in Lestoria/Menu.h
  8. 15
      Adventures in Lestoria/TODO.txt
  9. 2
      Adventures in Lestoria/Version.h

@ -97,6 +97,10 @@ InputGroup AiL::KEY_DOWN;
InputGroup AiL::KEY_ATTACK; InputGroup AiL::KEY_ATTACK;
InputGroup AiL::KEY_CONFIRM; InputGroup AiL::KEY_CONFIRM;
InputGroup AiL::KEY_MENU; InputGroup AiL::KEY_MENU;
InputGroup AiL::KEY_SCROLLUP;
InputGroup AiL::KEY_SCROLLDOWN;
InputGroup AiL::KEY_BACK;
#ifndef __EMSCRIPTEN__ #ifndef __EMSCRIPTEN__
::discord::Core*Discord{}; ::discord::Core*Discord{};
#endif #endif
@ -2368,13 +2372,28 @@ void AiL::InitializeDefaultKeybinds(){
KEY_DOWN.AddKeybind({KEY,S}); KEY_DOWN.AddKeybind({KEY,S});
KEY_DOWN.AddKeybind({CONTROLLER,static_cast<int>(GPButtons::DPAD_D)}); KEY_DOWN.AddKeybind({CONTROLLER,static_cast<int>(GPButtons::DPAD_D)});
KEY_CONFIRM.AddKeybind({MOUSE,Mouse::LEFT}); KEY_CONFIRM.AddKeybind({MOUSE,Mouse::LEFT});
KEY_CONFIRM.AddKeybind({CONTROLLER,static_cast<int>(GPButtons::FACE_D)});
KEY_CONFIRM.AddKeybind({CONTROLLER,static_cast<int>(GPButtons::FACE_R)}); KEY_CONFIRM.AddKeybind({CONTROLLER,static_cast<int>(GPButtons::FACE_R)});
KEY_CONFIRM.AddKeybind({CONTROLLER,static_cast<int>(GPButtons::START)}); KEY_CONFIRM.AddKeybind({CONTROLLER,static_cast<int>(GPButtons::START)});
KEY_CONFIRM.AddKeybind({KEY,SPACE}); KEY_CONFIRM.AddKeybind({KEY,SPACE});
KEY_CONFIRM.AddKeybind({KEY,ENTER}); KEY_CONFIRM.AddKeybind({KEY,ENTER});
KEY_CONFIRM.AddKeybind({KEY,Z});
KEY_BACK.AddKeybind({KEY,X});
KEY_BACK.AddKeybind({KEY,SHIFT});
KEY_BACK.AddKeybind({KEY,ESCAPE});
KEY_BACK.AddKeybind({CONTROLLER,static_cast<int>(GPButtons::FACE_D)});
KEY_MENU.AddKeybind({KEY,ESCAPE}); KEY_MENU.AddKeybind({KEY,ESCAPE});
KEY_MENU.AddKeybind({CONTROLLER,static_cast<int>(GPButtons::START)}); KEY_MENU.AddKeybind({CONTROLLER,static_cast<int>(GPButtons::START)});
KEY_SCROLLUP.AddKeybind({KEY,Q});
KEY_SCROLLUP.AddKeybind({KEY,PGUP});
KEY_SCROLLUP.AddKeybind({KEY,NP8});
KEY_SCROLLUP.AddKeybind({CONTROLLER,static_cast<int>(GPButtons::L2)});
KEY_SCROLLUP.AddKeybind({CONTROLLER,static_cast<int>(GPButtons::L1)});
KEY_SCROLLDOWN.AddKeybind({KEY,E});
KEY_SCROLLDOWN.AddKeybind({KEY,PGDN});
KEY_SCROLLDOWN.AddKeybind({KEY,NP2});
KEY_SCROLLDOWN.AddKeybind({CONTROLLER,static_cast<int>(GPButtons::R2)});
KEY_SCROLLDOWN.AddKeybind({CONTROLLER,static_cast<int>(GPButtons::R1)});
} }
void AiL::SetBossNameDisplay(std::string name,float time){ void AiL::SetBossNameDisplay(std::string name,float time){

@ -73,6 +73,9 @@ class AiL : public olc::PixelGameEngine
SplashScreen splash; SplashScreen splash;
public: public:
Pathfinding pathfinder; Pathfinding pathfinder;
static InputGroup KEY_SCROLLUP;
static InputGroup KEY_SCROLLDOWN;
static InputGroup KEY_BACK;
static InputGroup KEY_CONFIRM; static InputGroup KEY_CONFIRM;
static InputGroup KEY_ATTACK; static InputGroup KEY_ATTACK;
static InputGroup KEY_LEFT; static InputGroup KEY_LEFT;

@ -339,3 +339,7 @@ void Input::StopVibration(){
} }
} }
} }
const bool operator<(const InputGroup&group1,const InputGroup&group2){
return &group1<&group2;
}

@ -85,3 +85,5 @@ class GenericKey{
public: public:
static std::map<std::pair<InputType,int>,std::string>keyLiteral; //The displayed text for a given key for a given input type. static std::map<std::pair<InputType,int>,std::string>keyLiteral; //The displayed text for a given key for a given input type.
}; };
const bool operator<(const InputGroup&group1,const InputGroup&group2);

@ -87,4 +87,20 @@ void Menu::InitializeMainMenuWindow(){
}else{ }else{
mainMenuWindow->SetDefaultButton(newGameButton); mainMenuWindow->SetDefaultButton(newGameButton);
} }
mainMenuWindow->SetupKeyboardNavigation(
{
{game->KEY_BACK,{"",[](MenuType type){}}},
}
,{
{"New Game Button",{
.up="Quit Game Button",
.down="Load Game Button",}},
{"Load Game Button",{
.up="New Game Button",
.down="Quit Game Button",}},
{"Quit Game Button",{
.up="Load Game Button",
.down="New Game Button",}},
});
} }

@ -321,6 +321,36 @@ void Menu::SetDefaultButton(std::weak_ptr<MenuComponent>button){
void Menu::KeyboardButtonNavigation(AiL*game,vf2d menuPos){ void Menu::KeyboardButtonNavigation(AiL*game,vf2d menuPos){
std::weak_ptr<MenuComponent>prevSelection=selection; std::weak_ptr<MenuComponent>prevSelection=selection;
std::string selectionButtonName=selection.lock()->GetName();
if(navigationGroups.count(selectionButtonName)){
Navigation nav=navigationGroups[selectionButtonName];
if(game->KEY_UP.Pressed()){
SetMouseNavigation(false);
if(std::holds_alternative<std::string>(nav.up)&&std::get<std::string>(nav.up).length()>0)selection=components[std::get<std::string>(nav.up)];
else
if(std::holds_alternative<MenuDataFunc>(nav.up))std::get<MenuDataFunc>(nav.up)(type);
}
if(game->KEY_DOWN.Pressed()){
SetMouseNavigation(false);
if(std::holds_alternative<std::string>(nav.down)&&std::get<std::string>(nav.down).length()>0)selection=components[std::get<std::string>(nav.down)];
else
if(std::holds_alternative<MenuDataFunc>(nav.down))std::get<MenuDataFunc>(nav.down)(type);
}
if(game->KEY_LEFT.Pressed()){
SetMouseNavigation(false);
if(std::holds_alternative<std::string>(nav.left)&&std::get<std::string>(nav.left).length()>0)selection=components[std::get<std::string>(nav.left)];
else
if(std::holds_alternative<MenuDataFunc>(nav.left))std::get<MenuDataFunc>(nav.left)(type);
}
if(game->KEY_RIGHT.Pressed()){
SetMouseNavigation(false);
if(std::holds_alternative<std::string>(nav.right)&&std::get<std::string>(nav.right).length()>0)selection=components[std::get<std::string>(nav.right)];
else
if(std::holds_alternative<MenuDataFunc>(nav.right))std::get<MenuDataFunc>(nav.right)(type);
}
}
if(game->KEY_CONFIRM.Pressed()){ if(game->KEY_CONFIRM.Pressed()){
SetMouseNavigation(game->GetMouse(0).bPressed); //If a click occurs we use mouse controls. SetMouseNavigation(game->GetMouse(0).bPressed); //If a click occurs we use mouse controls.
buttonHoldTime=0; buttonHoldTime=0;
@ -575,3 +605,16 @@ void Menu::AddChapterListener(std::weak_ptr<MenuComponent>component){
MenuFuncData::MenuFuncData(Menu&menu,AiL*const game,std::weak_ptr<MenuComponent>component,std::weak_ptr<ScrollableWindowComponent>parentComponent) MenuFuncData::MenuFuncData(Menu&menu,AiL*const game,std::weak_ptr<MenuComponent>component,std::weak_ptr<ScrollableWindowComponent>parentComponent)
:menu(menu),game(game),component(component),parentComponent(parentComponent){} :menu(menu),game(game),component(component),parentComponent(parentComponent){}
void Menu::SetSelection(std::weak_ptr<MenuComponent>button){
selection=button;
}
void Menu::SetupKeyboardNavigation(MenuInputGroups inputGroups,ButtonNavigationGroups navigationGroups){
this->inputGroups=inputGroups;
this->navigationGroups=navigationGroups;
}
const std::weak_ptr<MenuComponent>Menu::GetSelection()const{
return selection;
}

@ -43,11 +43,25 @@ All rights reserved.
#include "Attributable.h" #include "Attributable.h"
#include "olcUTIL_Geometry2D.h" #include "olcUTIL_Geometry2D.h"
#include "olcPGEX_ViewPort.h" #include "olcPGEX_ViewPort.h"
#include "Key.h"
class AiL; class AiL;
class MenuComponent; class MenuComponent;
class ScrollableWindowComponent; class ScrollableWindowComponent;
struct Navigation;
class Menu;
struct MenuFuncData{
Menu&menu;
AiL*const game;
const std::weak_ptr<MenuComponent> component;
const std::weak_ptr<ScrollableWindowComponent> parentComponent={};
MenuFuncData(Menu&menu,AiL*const game,std::weak_ptr<MenuComponent> component,std::weak_ptr<ScrollableWindowComponent>parentComponent={});
};
using MenuFunc=std::function<bool(MenuFuncData)>;
//Add a component to a menu using this macro. Follow-up with END at the end of it. //Add a component to a menu using this macro. Follow-up with END at the end of it.
#define ADD(key,componentType) _AddComponent<componentType>(key,std::make_shared<componentType> #define ADD(key,componentType) _AddComponent<componentType>(key,std::make_shared<componentType>
#define END ) #define END )
@ -85,6 +99,21 @@ enum MenuType{
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
}; };
using MenuDataFunc=std::function<void(MenuType)>;
using InputGroupActionDisplayName=std::string;
using ButtonName=std::string;
using MenuInputGroups=std::map<InputGroup,std::pair<InputGroupActionDisplayName,std::variant<ButtonName,MenuDataFunc>>>;
using ButtonNavigationGroups=std::map<ButtonName,Navigation>;
struct Navigation{
std::variant<std::string,MenuDataFunc>up;
std::variant<std::string,MenuDataFunc>down;
std::variant<std::string,MenuDataFunc>left;
std::variant<std::string,MenuDataFunc>right;
};
class Menu:public IAttributable{ class Menu:public IAttributable{
static void InitializeConsumableInventoryWindow(); static void InitializeConsumableInventoryWindow();
static void InitializeClassInfoWindow(); static void InitializeClassInfoWindow();
@ -188,6 +217,8 @@ public:
void RecalculateComponentCount(); void RecalculateComponentCount();
void SetDefaultButton(std::weak_ptr<MenuComponent>button); void SetDefaultButton(std::weak_ptr<MenuComponent>button);
void SetSelection(std::weak_ptr<MenuComponent>button);
const std::weak_ptr<MenuComponent>GetSelection()const;
private: private:
Menu(vf2d pos,vf2d size); Menu(vf2d pos,vf2d size);
std::weak_ptr<MenuComponent>defaultButton; std::weak_ptr<MenuComponent>defaultButton;
@ -199,6 +230,7 @@ private:
//Mandatory before any menu operations! This creates and sets up the menu in memory. //Mandatory before any menu operations! This creates and sets up the menu in memory.
static Menu*CreateMenu(MenuType type,vf2d pos,vf2d size); static Menu*CreateMenu(MenuType type,vf2d pos,vf2d size);
void SetupKeyboardNavigation(MenuInputGroups inputGroups,ButtonNavigationGroups navigationGroups);
void KeyboardButtonNavigation(AiL*game,vf2d menuPos); void KeyboardButtonNavigation(AiL*game,vf2d menuPos);
static void DrawScaledWindowBackground(AiL*game,vf2d menuPos,vf2d size,Pixel renderColor); static void DrawScaledWindowBackground(AiL*game,vf2d menuPos,vf2d size,Pixel renderColor);
static void DrawTiledWindowBackground(AiL*game,vf2d menuPos,vf2d size,Pixel renderColor); static void DrawTiledWindowBackground(AiL*game,vf2d menuPos,vf2d size,Pixel renderColor);
@ -210,6 +242,8 @@ private:
Pixel GetRenderColor(); Pixel GetRenderColor();
MenuType type; MenuType type;
MenuInputGroups inputGroups;
ButtonNavigationGroups navigationGroups;
static bool MOUSE_NAVIGATION; static bool MOUSE_NAVIGATION;
bool cover; //A black cover for when a menu pops up to fade out the stuff behind it. bool cover; //A black cover for when a menu pops up to fade out the stuff behind it.
@ -219,13 +253,3 @@ template<typename T>
std::shared_ptr<T>Component(MenuType menu,std::string componentName){ std::shared_ptr<T>Component(MenuType menu,std::string componentName){
return DYNAMIC_POINTER_CAST<T>(Menu::menus[menu]->components[componentName]); return DYNAMIC_POINTER_CAST<T>(Menu::menus[menu]->components[componentName]);
} }
struct MenuFuncData{
Menu&menu;
AiL*const game;
const std::weak_ptr<MenuComponent> component;
const std::weak_ptr<ScrollableWindowComponent> parentComponent={};
MenuFuncData(Menu&menu,AiL*const game,std::weak_ptr<MenuComponent> component,std::weak_ptr<ScrollableWindowComponent>parentComponent={});
};
using MenuFunc=std::function<bool(MenuFuncData)>;

@ -31,3 +31,18 @@ Story proofreading/correcting/storyboarding
- Emscripten _DEBUG flag add as an option when building - Emscripten _DEBUG flag add as an option when building
mainMenuWindow->SetupKeyboardNavigation(
{
{game->KEY_BACK,{"","Quit Game Button"}},
{game->KEY_BACK,{"",[](MenuFuncData data){}}},
}
,{
{"New Game Button",{
.up="Quit Game Button",
.down="Load Game Button",}},
{"Load Game Button",{
.up="New Game Button",
.down="Quit Game Button",}},
});

@ -39,7 +39,7 @@ All rights reserved.
#define VERSION_MAJOR 0 #define VERSION_MAJOR 0
#define VERSION_MINOR 2 #define VERSION_MINOR 2
#define VERSION_PATCH 1 #define VERSION_PATCH 1
#define VERSION_BUILD 5958 #define VERSION_BUILD 5966
#define stringify(a) stringify_(a) #define stringify(a) stringify_(a)
#define stringify_(a) #a #define stringify_(a) #a

Loading…
Cancel
Save