From dba8045011d99bd481c8b1a899b45556f0a6824f Mon Sep 17 00:00:00 2001 From: Tamir Atias Date: Tue, 10 Jan 2012 04:20:52 +0200 Subject: [PATCH] [ADD] In-game menu navigation using arrow keys. --- Win32/Unuk/LibUnuk/LibUnuk.vcproj | 4 --- src/libUnuk/Button.cpp | 36 +++++++++++++++++-- src/libUnuk/Button.h | 12 +++++++ src/libUnuk/IngameMenu.cpp | 58 +++++++++++++++++++++++++++++-- src/libUnuk/IngameMenu.h | 4 +++ 5 files changed, 105 insertions(+), 9 deletions(-) diff --git a/Win32/Unuk/LibUnuk/LibUnuk.vcproj b/Win32/Unuk/LibUnuk/LibUnuk.vcproj index f5e4fc9..baaf054 100644 --- a/Win32/Unuk/LibUnuk/LibUnuk.vcproj +++ b/Win32/Unuk/LibUnuk/LibUnuk.vcproj @@ -285,10 +285,6 @@ RelativePath="..\..\..\src\libUnuk\MemManager.h" > - - diff --git a/src/libUnuk/Button.cpp b/src/libUnuk/Button.cpp index 7ee8691..62bd5b3 100644 --- a/src/libUnuk/Button.cpp +++ b/src/libUnuk/Button.cpp @@ -1,7 +1,8 @@ #include "Button.h" Button::Button(void) { - + _highlighted = false; + _mouseOver = false; } Button::~Button(void) { @@ -30,6 +31,16 @@ void Button::SetOverRGB(SDL_Color colour) { _mouseOverColour = colour; } +void Button::SetHighlightRGB(Uint8 r, Uint8 g, Uint8 b) { + _highlightColour.r = r; + _highlightColour.g = g; + _highlightColour.b = b; +} + +void Button::SetHighlightRGB(SDL_Color colour) { + _highlightColour = colour; +} + void Button::SetXY(int xArg, int yArg) { x = xArg; y = yArg; @@ -62,14 +73,33 @@ void Button::SetText(string textArg) { bool Button::CheckMouseOver(void) { if(event.motion.x > _button.GetX() && event.motion.x < _button.GetX() + _button.GetWidth()) { if(event.motion.y > _button.GetY() && event.motion.y < _button.GetY() + _button.GetHeight()) { - _button.SetRGB(_mouseOverColour.r, _mouseOverColour.g, _mouseOverColour.b); + if (!_highlighted) { + _button.SetRGB(_mouseOverColour.r, _mouseOverColour.g, _mouseOverColour.b); + } return true; } } - _button.SetRGB(_mouseOutColour); + if (!_highlighted) { + _button.SetRGB(_mouseOutColour); + } return false; } +void Button::SetHighlighted(bool highlighted) { + if(_highlighted != highlighted) { + if(highlighted) { + _button.SetRGB(_highlightColour); + } else { + if(_mouseOver) { + _button.SetRGB(_mouseOverColour); + } else { + _button.SetRGB(_textColour); + } + } + } + _highlighted = highlighted; +} + void Button::Render(void) { _button.Draw(); _text.Render(); diff --git a/src/libUnuk/Button.h b/src/libUnuk/Button.h index 04f8cfe..d5152bf 100644 --- a/src/libUnuk/Button.h +++ b/src/libUnuk/Button.h @@ -22,6 +22,11 @@ public: void SetTextRGB(SDL_Color); void SetText(string textArg); + void SetHighlightRGB(Uint8 r, Uint8 g, Uint8 b); + void SetHighlightRGB(SDL_Color); + + void SetHighlighted(bool highlighted); + void SetXY(int xArg, int yArg); int GetX(void) const { return x; } @@ -29,6 +34,8 @@ public: int GetWidth(void) const { return w; } int GetHeight(void) const { return h; } + bool GetHighlighted(void) { return _highlighted; } + bool CheckMouseOver(void); void Render(void); @@ -40,6 +47,7 @@ private: SDL_Color _mouseOutColour; SDL_Color _mouseOverColour; SDL_Color _textColour; + SDL_Color _highlightColour; int x; int y; @@ -48,6 +56,10 @@ private: Rect _button; Text _text; + + bool _highlighted; + + bool _mouseOver; }; #endif diff --git a/src/libUnuk/IngameMenu.cpp b/src/libUnuk/IngameMenu.cpp index 683298f..c230bd7 100644 --- a/src/libUnuk/IngameMenu.cpp +++ b/src/libUnuk/IngameMenu.cpp @@ -2,35 +2,46 @@ IngameMenu::IngameMenu(void) { _active = false; + _highlightedButton = 0; btnResume.SetOutRGB(200, 200, 200); btnResume.SetOverRGB(255, 255, 255); btnResume.SetTextRGB(0, 0, 0); btnResume.SetText("Resume Game"); + btnResume.SetHighlightRGB(255, 128, 0); + btnResume.SetHighlighted(true); btnResume.SetXY(SCREEN_WIDTH / 2 - btnResume.GetWidth() / 2, 50); btnSaveGame.SetOutRGB(200, 200, 200); btnSaveGame.SetOverRGB(255, 255, 255); btnSaveGame.SetTextRGB(0, 0, 0); btnSaveGame.SetText("SaveGame"); + btnSaveGame.SetHighlightRGB(255, 128, 0); + btnSaveGame.SetHighlighted(false); btnSaveGame.SetXY(SCREEN_WIDTH / 2 - btnSaveGame.GetWidth() / 2, 100); btnLoadGame.SetOutRGB(200, 200, 200); btnLoadGame.SetOverRGB(255, 255, 255); btnLoadGame.SetTextRGB(0, 0, 0); btnLoadGame.SetText("LoadGame"); + btnLoadGame.SetHighlightRGB(255, 128, 0); + btnLoadGame.SetHighlighted(false); btnLoadGame.SetXY(SCREEN_WIDTH / 2 - btnLoadGame.GetWidth() / 2, 150); btnOptions.SetOutRGB(200, 200, 200); btnOptions.SetOverRGB(255, 255, 255); btnOptions.SetTextRGB(0, 0, 0); btnOptions.SetText("Options"); + btnOptions.SetHighlightRGB(255, 128, 0); + btnOptions.SetHighlighted(false); btnOptions.SetXY(SCREEN_WIDTH / 2 - btnOptions.GetWidth() / 2, 200); btnExitToMenu.SetOutRGB(200, 200, 200); btnExitToMenu.SetOverRGB(255, 255, 255); btnExitToMenu.SetTextRGB(0, 0, 0); btnExitToMenu.SetText("Exit To Main Menu"); + btnExitToMenu.SetHighlightRGB(255, 128, 0); + btnExitToMenu.SetHighlighted(false); btnExitToMenu.SetXY(SCREEN_WIDTH / 2 - btnExitToMenu.GetWidth() / 2, 250); } @@ -45,10 +56,23 @@ ingameMenuNavVal_t IngameMenu::HandleInput(void) { btnLoadGame.CheckMouseOver(); btnOptions.CheckMouseOver(); btnExitToMenu.CheckMouseOver(); - + if(event.key.type == SDL_KEYDOWN) { - if(event.key.keysym.sym == SDLK_ESCAPE) + if(event.key.keysym.sym == SDLK_ESCAPE) { return ingameMenuResume; + } else if(event.key.keysym.sym == SDLK_DOWN) { + HighlightNewSelection(_highlightedButton + 1); + } else if(event.key.keysym.sym == SDLK_UP) { + HighlightNewSelection(_highlightedButton - 1); + } else if(event.key.keysym.sym == SDLK_RETURN) { + switch(_highlightedButton) { + case 0: return ingameMenuResume; + case 1: return ingameMenuSaveGame; + case 2: return ingameMenuLoadGame; + case 3: return ingameMenuOptions; + case 4: return ingameMenuMainMenu; + } + } } else if(event.type == SDL_MOUSEBUTTONUP) { if(event.button.button == SDL_BUTTON_LEFT) { @@ -75,3 +99,33 @@ void IngameMenu::Render(void) { btnOptions.RenderLiteral(); btnExitToMenu.RenderLiteral(); } + +void IngameMenu::HighlightNewSelection(int newButton) { + // Turn of highlight for currently highlighted button + switch(_highlightedButton) { + case 0: btnResume.SetHighlighted(false); break; + case 1: btnSaveGame.SetHighlighted(false); break; + case 2: btnLoadGame.SetHighlighted(false); break; + case 3: btnOptions.SetHighlighted(false); break; + case 4: btnExitToMenu.SetHighlighted(false); break; + } + + _highlightedButton = newButton; + + // If < 0 then up was pressed when first index was selected + // If > 0 then down was pressed when last index was selected + if(_highlightedButton < 0) { + _highlightedButton = 4; + } else if(_highlightedButton > 4) { + _highlightedButton = 0; + } + + // Highlight new selection + switch(_highlightedButton) { + case 0: btnResume.SetHighlighted(true); break; + case 1: btnSaveGame.SetHighlighted(true); break; + case 2: btnLoadGame.SetHighlighted(true); break; + case 3: btnOptions.SetHighlighted(true); break; + case 4: btnExitToMenu.SetHighlighted(true); break; + } +} \ No newline at end of file diff --git a/src/libUnuk/IngameMenu.h b/src/libUnuk/IngameMenu.h index 930be32..ef0ddeb 100644 --- a/src/libUnuk/IngameMenu.h +++ b/src/libUnuk/IngameMenu.h @@ -27,6 +27,8 @@ public: bool GetStatus(void) { return _active; } private: + void HighlightNewSelection(int newButton); + bool _active; Button btnResume; @@ -34,6 +36,8 @@ private: Button btnLoadGame; Button btnOptions; Button btnExitToMenu; + + int _highlightedButton; }; #endif