|
|
|
@ -1,10 +1,14 @@ |
|
|
|
|
#include "Crawler.h" |
|
|
|
|
#include "Menu.h" |
|
|
|
|
#include "DEFINES.h" |
|
|
|
|
#include "safemap.h" |
|
|
|
|
|
|
|
|
|
bool Menu::MOUSE_NAVIGATION=true; |
|
|
|
|
std::vector<Menu*>Menu::stack; |
|
|
|
|
std::map<MenuType,Menu>Menu::menus; |
|
|
|
|
|
|
|
|
|
INCLUDE_GFX |
|
|
|
|
|
|
|
|
|
Menu::Menu(){} |
|
|
|
|
|
|
|
|
|
Menu::Menu(vf2d size) |
|
|
|
@ -60,40 +64,7 @@ void Menu::Update(Crawler*game){ |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
KeyboardButtonNavigation(game); |
|
|
|
|
if(game->GetMouse(0).bPressed||game->GetKey(ENTER).bPressed||game->GetKey(SPACE).bPressed){ |
|
|
|
|
MOUSE_NAVIGATION=game->GetMouse(0).bPressed; //If a click occurs we use mouse controls.
|
|
|
|
|
if(!MOUSE_NAVIGATION){ |
|
|
|
|
MenuSelect(game); |
|
|
|
|
//Key presses automatically highlight the first button if it's not highlighted.
|
|
|
|
|
if(selection==vi2d{-1,-1}&&buttons.size()>0){ |
|
|
|
|
//Find the first possible button entry in the map...
|
|
|
|
|
int firstInd=-1; |
|
|
|
|
for(auto&key:buttons){ |
|
|
|
|
if(buttons[key.first].size()>0){ |
|
|
|
|
firstInd=key.first; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if(firstInd!=-1){ //This means we found a valid menu item. If we didn't find one don't highlight any menu item...
|
|
|
|
|
selection={0,firstInd}; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}else{//Mouse click.
|
|
|
|
|
selection={-1,-1}; |
|
|
|
|
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())){ |
|
|
|
|
selection={index,key.first}; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
index++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
MenuSelect(game); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
KeyboardButtonNavigation(game,upperLeftPos); |
|
|
|
|
for(auto&key:buttons){ |
|
|
|
|
for(auto&button:key.second){ |
|
|
|
|
button->Update(game); |
|
|
|
@ -103,7 +74,28 @@ void Menu::Update(Crawler*game){ |
|
|
|
|
|
|
|
|
|
void Menu::Draw(Crawler*game){ |
|
|
|
|
vf2d upperLeftPos=game->GetScreenSize()/2-size/2; |
|
|
|
|
game->FillRectDecal(upperLeftPos,size,VERY_DARK_BLUE); |
|
|
|
|
|
|
|
|
|
vf2d patchSize=vf2d{float("Interface.9PatchSize"_i[0]),float("Interface.9PatchSize"_i[1])}; |
|
|
|
|
|
|
|
|
|
//Upper-Left
|
|
|
|
|
game->DrawPartialDecal(upperLeftPos-patchSize,patchSize,GFX["9patch.png"].Decal(),{patchSize.x*0,patchSize.y*0},patchSize); |
|
|
|
|
//Upper-Right
|
|
|
|
|
game->DrawPartialDecal(upperLeftPos+vf2d{size.x,-patchSize.y},patchSize,GFX["9patch.png"].Decal(),{patchSize.x*2,patchSize.y*0},patchSize); |
|
|
|
|
//Bottom-Left
|
|
|
|
|
game->DrawPartialDecal(upperLeftPos+vf2d{-patchSize.x,size.y},patchSize,GFX["9patch.png"].Decal(),{patchSize.x*0,patchSize.y*2},patchSize); |
|
|
|
|
//Bottom-Right
|
|
|
|
|
game->DrawPartialDecal(upperLeftPos+vf2d{size.x,size.y},patchSize,GFX["9patch.png"].Decal(),{patchSize.x*2,patchSize.y*2},patchSize); |
|
|
|
|
//Top
|
|
|
|
|
game->DrawPartialDecal(upperLeftPos+vf2d{0,-patchSize.y},patchSize+vf2d{size.x,0},GFX["9patch.png"].Decal(),{patchSize.x*1,patchSize.y*0},patchSize); |
|
|
|
|
//Left
|
|
|
|
|
game->DrawPartialDecal(upperLeftPos+vf2d{-patchSize.x,0},patchSize+vf2d{0,size.y},GFX["9patch.png"].Decal(),{patchSize.x*0,patchSize.y*1},patchSize); |
|
|
|
|
//Right
|
|
|
|
|
game->DrawPartialDecal(upperLeftPos+vf2d{size.x,0},patchSize+vf2d{0,size.y},GFX["9patch.png"].Decal(),{patchSize.x*2,patchSize.y*1},patchSize); |
|
|
|
|
//Bottom
|
|
|
|
|
game->DrawPartialDecal(upperLeftPos+vf2d{0,size.y},patchSize+vf2d{size.x,0},GFX["9patch.png"].Decal(),{patchSize.x*1,patchSize.y*2},patchSize); |
|
|
|
|
//Center
|
|
|
|
|
game->DrawPartialDecal(upperLeftPos,patchSize+size,GFX["9patch.png"].Decal(),{patchSize.x*1,patchSize.y*1},patchSize); |
|
|
|
|
|
|
|
|
|
for(auto&key:buttons){ |
|
|
|
|
for(auto&button:key.second){ |
|
|
|
|
button->Draw(game,upperLeftPos); |
|
|
|
@ -116,7 +108,7 @@ void Menu::OpenMenu(MenuType menu){ |
|
|
|
|
stack.push_back(&(menus[menu])); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void Menu::KeyboardButtonNavigation(Crawler*game){ |
|
|
|
|
void Menu::KeyboardButtonNavigation(Crawler*game,vf2d menuPos){ |
|
|
|
|
if(game->GetKey(RIGHT).bPressed){ |
|
|
|
|
if(selection==vi2d{-1,-1})return; |
|
|
|
|
MOUSE_NAVIGATION=false; |
|
|
|
@ -209,4 +201,37 @@ void Menu::KeyboardButtonNavigation(Crawler*game){ |
|
|
|
|
selection.x=-1; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if(game->GetMouse(0).bPressed||game->GetKey(ENTER).bPressed||game->GetKey(SPACE).bPressed){ |
|
|
|
|
MOUSE_NAVIGATION=game->GetMouse(0).bPressed; //If a click occurs we use mouse controls.
|
|
|
|
|
if(!MOUSE_NAVIGATION){ |
|
|
|
|
MenuSelect(game); |
|
|
|
|
//Key presses automatically highlight the first button if it's not highlighted.
|
|
|
|
|
if(selection==vi2d{-1,-1}&&buttons.size()>0){ |
|
|
|
|
//Find the first possible button entry in the map...
|
|
|
|
|
int firstInd=-1; |
|
|
|
|
for(auto&key:buttons){ |
|
|
|
|
if(buttons[key.first].size()>0){ |
|
|
|
|
firstInd=key.first; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if(firstInd!=-1){ //This means we found a valid menu item. If we didn't find one don't highlight any menu item...
|
|
|
|
|
selection={0,firstInd}; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}else{//Mouse click.
|
|
|
|
|
selection={-1,-1}; |
|
|
|
|
for(auto&key:buttons){ |
|
|
|
|
int index=0; |
|
|
|
|
for(auto&button:key.second){ |
|
|
|
|
if(geom2d::overlaps(geom2d::rect<float>{button->rect.pos+menuPos,button->rect.size},game->GetMousePos())){ |
|
|
|
|
selection={index,key.first}; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
index++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
MenuSelect(game); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |