From 3b54b1d28dacbb2276a927a8282c87e924264ef5 Mon Sep 17 00:00:00 2001 From: Tamir Atias Date: Tue, 10 Jan 2012 06:32:05 +0200 Subject: [PATCH] [Add] Buttons groups. [Add] Main menu arrow navigation. --- Save/save | 2 +- Win32/Unuk/LibUnuk/LibUnuk.vcproj | 8 ++ src/libUnuk/Button.cpp | 1 - src/libUnuk/IngameMenu.cpp | 152 +++++++++++---------------- src/libUnuk/IngameMenu.h | 12 +-- src/libUnuk/MainMenu.cpp | 169 +++++++++++++++++++----------- src/libUnuk/MainMenu.h | 17 ++- src/libUnuk/Makefile | 2 +- 8 files changed, 185 insertions(+), 178 deletions(-) diff --git a/Save/save b/Save/save index 60af4dd..f7492c8 100644 --- a/Save/save +++ b/Save/save @@ -2,6 +2,6 @@ Allanis 120 - 144 + 180 map diff --git a/Win32/Unuk/LibUnuk/LibUnuk.vcproj b/Win32/Unuk/LibUnuk/LibUnuk.vcproj index baaf054..f03682c 100644 --- a/Win32/Unuk/LibUnuk/LibUnuk.vcproj +++ b/Win32/Unuk/LibUnuk/LibUnuk.vcproj @@ -169,6 +169,14 @@ RelativePath="..\..\..\src\libUnuk\Button.h" > + + + + diff --git a/src/libUnuk/Button.cpp b/src/libUnuk/Button.cpp index d94e0c7..2c0bc20 100644 --- a/src/libUnuk/Button.cpp +++ b/src/libUnuk/Button.cpp @@ -6,7 +6,6 @@ Button::Button(void) { } Button::~Button(void) { - } void Button::SetOutRGB(Uint8 r, Uint8 g, Uint8 b) { diff --git a/src/libUnuk/IngameMenu.cpp b/src/libUnuk/IngameMenu.cpp index 57dc6ec..c67b91a 100644 --- a/src/libUnuk/IngameMenu.cpp +++ b/src/libUnuk/IngameMenu.cpp @@ -2,70 +2,75 @@ 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); + Button* btnResume = new Button(); + 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(false); + 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); + Button* btnSaveGame = new Button(); + 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); + Button* btnLoadGame = new Button(); + 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); + Button* btnOptions = new Button(); + 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); + Button* btnExitToMenu = new Button(); + 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); + + _buttons.AddButton(btnResume); + _buttons.AddButton(btnSaveGame); + _buttons.AddButton(btnLoadGame); + _buttons.AddButton(btnOptions); + _buttons.AddButton(btnExitToMenu); } IngameMenu::~IngameMenu(void) { - } ingameMenuNavVal_t IngameMenu::HandleInput(void) { while(SDL_PollEvent(&event)) { - btnResume.CheckMouseOver(); - btnSaveGame.CheckMouseOver(); - btnLoadGame.CheckMouseOver(); - btnOptions.CheckMouseOver(); - btnExitToMenu.CheckMouseOver(); - + _buttons.CheckMouseOverDummy(); + if(event.key.type == SDL_KEYDOWN) { if(event.key.keysym.sym == SDLK_ESCAPE) { return ingameMenuResume; } else if(event.key.keysym.sym == SDLK_DOWN) { - HighlightNewSelection(_highlightedButton + 1); + _buttons.SelectNext(); } else if(event.key.keysym.sym == SDLK_UP) { - HighlightNewSelection(_highlightedButton - 1); + _buttons.SelectPrevious(); } else if(event.key.keysym.sym == SDLK_RETURN) { - switch(_highlightedButton) { + switch(_buttons.GetSelectedButton()) { case 0: return ingameMenuResume; case 1: return ingameMenuSaveGame; case 2: return ingameMenuLoadGame; @@ -76,16 +81,13 @@ ingameMenuNavVal_t IngameMenu::HandleInput(void) { } else if(event.type == SDL_MOUSEBUTTONUP) { if(event.button.button == SDL_BUTTON_LEFT) { - if(btnResume.CheckMouseOver()) - return ingameMenuResume; - else if(btnSaveGame.CheckMouseOver()) - return ingameMenuSaveGame; - else if(btnLoadGame.CheckMouseOver()) - return ingameMenuLoadGame; - else if(btnOptions.CheckMouseOver()) - return ingameMenuOptions; - else if(btnExitToMenu.CheckMouseOver()) - return ingameMenuMainMenu; + switch(_buttons.CheckMouseOver()) { + case 0: return ingameMenuResume; + case 1: return ingameMenuSaveGame; + case 2: return ingameMenuLoadGame; + case 3: return ingameMenuOptions; + case 4: return ingameMenuMainMenu; + } } } } @@ -93,39 +95,5 @@ ingameMenuNavVal_t IngameMenu::HandleInput(void) { } void IngameMenu::Render(void) { - btnResume.RenderLiteral(); - btnSaveGame.RenderLiteral(); - btnLoadGame.RenderLiteral(); - 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; - } -} + _buttons.RenderLiteral(); +} \ No newline at end of file diff --git a/src/libUnuk/IngameMenu.h b/src/libUnuk/IngameMenu.h index ef0ddeb..d6f36c5 100644 --- a/src/libUnuk/IngameMenu.h +++ b/src/libUnuk/IngameMenu.h @@ -3,7 +3,7 @@ #include "../Unuk/Globals.h" #include "../Unuk/Constants.h" -#include "Button.h" +#include "ButtonGroup.h" #include "ButtonToggle.h" enum ingameMenuNavVal_t { @@ -27,17 +27,9 @@ public: bool GetStatus(void) { return _active; } private: - void HighlightNewSelection(int newButton); - bool _active; - Button btnResume; - Button btnSaveGame; - Button btnLoadGame; - Button btnOptions; - Button btnExitToMenu; - - int _highlightedButton; + ButtonGroup _buttons; }; #endif diff --git a/src/libUnuk/MainMenu.cpp b/src/libUnuk/MainMenu.cpp index 95f06d0..3b75bcf 100644 --- a/src/libUnuk/MainMenu.cpp +++ b/src/libUnuk/MainMenu.cpp @@ -1,11 +1,46 @@ #include "MainMenu.h" MainMenu::MainMenu(void) { - btnNewGame.SetOutRGB(200, 200, 200); - btnNewGame.SetOverRGB(255, 255, 255); - btnNewGame.SetTextRGB(0, 0, 0); - btnNewGame.SetText("New Game"); - btnNewGame.SetXY(100, 150); + Button* btnNewGame = new Button(); + btnNewGame->SetOutRGB(200, 200, 200); + btnNewGame->SetOverRGB(255, 255, 255); + btnNewGame->SetTextRGB(0, 0, 0); + btnNewGame->SetText("New Game"); + btnNewGame->SetXY(100, 150); + btnNewGame->SetHighlightRGB(255, 128, 0); + btnNewGame->SetHighlighted(false); + + Button* btnLoadGame = new Button(); + btnLoadGame->SetOutRGB(200, 200, 200); + btnLoadGame->SetOverRGB(255, 255, 255); + btnLoadGame->SetTextRGB(0, 0, 0); + btnLoadGame->SetText("Load Game"); + btnLoadGame->SetHighlightRGB(255, 128, 0); + btnLoadGame->SetHighlighted(false); + btnLoadGame->SetXY(100, 200); + + Button* btnOptions = new Button(); + 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(100, 250); + + Button* btnExit = new Button(); + btnExit->SetOutRGB(200, 200, 200); + btnExit->SetOverRGB(255, 255, 255); + btnExit->SetTextRGB(0, 0, 0); + btnExit->SetText("Exit"); + btnExit->SetHighlightRGB(255, 128, 0); + btnExit->SetHighlighted(false); + btnExit->SetXY(100, 300); + + grpMain.AddButton(btnNewGame); + grpMain.AddButton(btnLoadGame); + grpMain.AddButton(btnOptions); + grpMain.AddButton(btnExit); btnNewGameActive = false; @@ -16,39 +51,30 @@ MainMenu::MainMenu(void) { rectNewGame.SetXY(250, 150); rectNewGame.SetWidthHeight(lblNewGame.GetWidth() + 50, 90); - btnNewGameYes.SetOutRGB(20, 150, 20); - btnNewGameYes.SetOverRGB(20, 255, 20); - btnNewGameYes.SetTextRGB(0, 0, 0); - btnNewGameYes.SetText("Yes"); - btnNewGameYes.SetXY(rectNewGame.GetX() + rectNewGame.GetWidth() / 2 - 40 - btnNewGameYes.GetWidth(), 190); - - btnNewGameNo.SetOutRGB(150, 20, 20); - btnNewGameNo.SetOverRGB(255, 20, 20); - btnNewGameNo.SetTextRGB(0, 0, 0); - btnNewGameNo.SetText("No"); - btnNewGameNo.SetXY(rectNewGame.GetX() + rectNewGame.GetWidth() / 2 + 40 - btnNewGameNo.GetWidth(), 190); - - btnLoadGame.SetOutRGB(200, 200, 200); - btnLoadGame.SetOverRGB(255, 255, 255); - btnLoadGame.SetTextRGB(0, 0, 0); - btnLoadGame.SetText("Load Game"); - btnLoadGame.SetXY(100, 200); - - btnOptions.SetOutRGB(200, 200, 200); - btnOptions.SetOverRGB(255, 255, 255); - btnOptions.SetTextRGB(0, 0, 0); - btnOptions.SetText("Options"); - btnOptions.SetXY(100, 250); - - btnExit.SetOutRGB(200, 200, 200); - btnExit.SetOverRGB(255, 255, 255); - btnExit.SetTextRGB(0, 0, 0); - btnExit.SetText("Exit"); - btnExit.SetXY(100, 300); - lblMenu.SetXY(100, 75); lblMenu.SetTextBlended("Unuk", vlarge, 0, 0, 0); + Button* btnNewGameYes = new Button(); + btnNewGameYes->SetOutRGB(20, 150, 20); + btnNewGameYes->SetOverRGB(20, 255, 20); + btnNewGameYes->SetTextRGB(0, 0, 0); + btnNewGameYes->SetText("Yes"); + btnNewGameYes->SetHighlightRGB(255, 128, 0); + btnNewGameYes->SetHighlighted(false); + btnNewGameYes->SetXY(rectNewGame.GetX() + rectNewGame.GetWidth() / 2 - 40 - btnNewGameYes->GetWidth(), 190); + + Button* btnNewGameNo = new Button(); + btnNewGameNo->SetOutRGB(150, 20, 20); + btnNewGameNo->SetOverRGB(255, 20, 20); + btnNewGameNo->SetTextRGB(0, 0, 0); + btnNewGameNo->SetText("No"); + btnNewGameNo->SetHighlightRGB(255, 128, 0); + btnNewGameNo->SetHighlighted(false); + btnNewGameNo->SetXY(rectNewGame.GetX() + rectNewGame.GetWidth() / 2 + 40 - btnNewGameNo->GetWidth(), 190); + + grpNewGame.AddButton(btnNewGameYes); + grpNewGame.AddButton(btnNewGameNo); + //m_background.Load("MainMenu"); camera.x = 0; @@ -68,32 +94,55 @@ mainMenuNavVal_t MainMenu::Run(void) { SDL_Flip(screen); while(SDL_PollEvent(&event)) { - btnNewGame.CheckMouseOver(); + grpMain.CheckMouseOverDummy(); + if(btnNewGameActive) { - btnNewGameYes.CheckMouseOver(); - btnNewGameNo.CheckMouseOver(); + grpNewGame.CheckMouseOverDummy(); } - btnLoadGame.CheckMouseOver(); - btnOptions.CheckMouseOver(); - btnExit.CheckMouseOver(); - - if(event.type == SDL_MOUSEBUTTONUP) { + if(event.key.type == SDL_KEYDOWN) { + if(event.key.keysym.sym == SDLK_DOWN) { + if(btnNewGameActive) { + grpNewGame.SelectNext(); + } else { + grpMain.SelectNext(); + } + } else if(event.key.keysym.sym == SDLK_UP) { + if(btnNewGameActive) { + grpNewGame.SelectPrevious(); + } else { + grpMain.SelectPrevious(); + } + } else if(event.key.keysym.sym == SDLK_RETURN) { + if(btnNewGameActive) { + switch(grpNewGame.GetSelectedButton()) { + case 0: return mainMenuNewGame; break; + case 1: btnNewGameActive = false; break; + } + } else { + switch(grpMain.GetSelectedButton()) { + case 0: btnNewGameActive = !btnNewGameActive; break; + case 1: return mainMenuLoadGame; + case 2: return mainMenuOptions; + case 3: return mainMenuExitGame; + } + } + } + } + else if(event.type == SDL_MOUSEBUTTONUP) { if(event.button.button == SDL_BUTTON_LEFT) { - if(btnNewGame.CheckMouseOver()) - btnNewGameActive = !btnNewGameActive; - else if(btnLoadGame.CheckMouseOver()) - return mainMenuLoadGame; - else if(btnOptions.CheckMouseOver()) - return mainMenuOptions; - else if(btnExit.CheckMouseOver()) - return mainMenuExitGame; + switch(grpMain.CheckMouseOver()) { + case 0: btnNewGameActive = !btnNewGameActive; break; + case 1: return mainMenuLoadGame; + case 2: return mainMenuOptions; + case 3: return mainMenuExitGame; + } if(btnNewGameActive) { - if(btnNewGameYes.CheckMouseOver()) - return mainMenuNewGame; - //else if(btnNewGameNo.CheckMouseOver()) - //return btnNewGameActive = false; + switch(grpNewGame.CheckMouseOver()) { + case 0: return mainMenuNewGame; break; + case 1: btnNewGameActive = false; break; + } } } } @@ -112,15 +161,11 @@ void MainMenu::Render(void) { lblMenu.Render(); - btnNewGame.Render(); + grpMain.RenderLiteral(); + if(btnNewGameActive) { rectNewGame.Draw(); lblNewGame.Render(); - btnNewGameYes.Render(); - btnNewGameNo.Render(); + grpNewGame.RenderLiteral(); } - - btnLoadGame.Render(); - btnOptions.Render(); - btnExit.Render(); } diff --git a/src/libUnuk/MainMenu.h b/src/libUnuk/MainMenu.h index 44209e3..91fd175 100644 --- a/src/libUnuk/MainMenu.h +++ b/src/libUnuk/MainMenu.h @@ -3,7 +3,7 @@ #include "../Unuk/Constants.h" #include "FPS.h" -#include "Button.h" +#include "ButtonGroup.h" #include "Map.h" #include "Rect.h" #include "Text.h" @@ -29,17 +29,12 @@ private: Text lblMenu; - Button btnNewGame; + ButtonGroup grpMain; - bool btnNewGameActive; - Rect rectNewGame; - Text lblNewGame; - Button btnNewGameYes; - Button btnNewGameNo; - - Button btnLoadGame; - Button btnOptions; - Button btnExit; + bool btnNewGameActive; + Rect rectNewGame; + Text lblNewGame; + ButtonGroup grpNewGame; }; #endif diff --git a/src/libUnuk/Makefile b/src/libUnuk/Makefile index a6711e0..d21a69e 100644 --- a/src/libUnuk/Makefile +++ b/src/libUnuk/Makefile @@ -1,7 +1,7 @@ CC = g++ CFLAGS = -ansi -Wall -g LDADD = -lGL -lGLU -lSDL -lSDL_ttf -lSDL_gfx -lSDL_image -ltinyxml -objects = ApplySurface.o Button.o ButtonToggle.o Character.o Collision.o \ +objects = ApplySurface.o Button.o ButtonToggle.o ButtonGroup.o Character.o Collision.o \ Debug.o Font.o FPS.o ImageLoader.o IngameMenu.o Input.o MainMenu.o \ Map.o MapElement.o MapEntities.o MemManager.o NPC.o ParticleEmitter.o \ Rect.o Text.o Texture.o TextureManager.o Timer.o \