#include "OGLFT.h" #include #include #include "DrawingsGL.h" #include "OverlayBase.h" #include "UserInterface.h" #include "Model.h" #include "View.h" #include "Controller.h" #include "Sprite.h" #include "ShipEntity.h" #include "Engine.h" #include "Game.h" #include "IMGUIControls.h" namespace asteroids { // static float left = 0; static float right = 0; // static float top = 0; static float bottom = 0; void MainMenuOverlay::Init () { // setup of the HUD font GetView()->LoadFont ("AldotheApache.ttf", 20); GetView()->SelectFont ("AldotheApache.ttf"); GetView()->SetFontJustification (Engine::FontJustificationRight); } bool MainMenuOverlay::OnKeyDown (const SDL_keysym &keysym) { if (keysym.sym == SDLK_ESCAPE) Engine::RunCommand("quit"); return false; } void MainMenuOverlay::Draw () { glClearColor (0.1, 0.1, 0.1, 1.); right = static_cast (Engine::GetWindowWidth()); bottom = static_cast (Engine::GetWindowHeight()); // we switch to orthographic projection and draw the contents of the 2d // overlay on top of the previous drawings glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); // first we have to get the size of the current viewport to set up the // orthographic projection correctly GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); gluOrtho2D (viewport[0], viewport[2], viewport[3], viewport[1]); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); Engine::GUI::Label (4, "A s t e r o i d s", right * 0.5 - 100, 180); if (Engine::GUI::Button (1, "New Game", right * 0.5 - 100, 200, 250, 40)) { GetModel()->SetGameState(GameStateEnterPlayername); GetController()->uistate.hotitem = 0; } if (Engine::GUI::Button (2, "Highscores", right * 0.5 - 100, 250, 250, 40)) { GetModel()->SetGameState(GameStateShowHighscore); GetController()->uistate.hotitem = 0; } if (Engine::GUI::Button (3, "Quit", right * 0.5 - 100, 330, 250, 40)) { Engine::RunCommand("quit"); } GetView()->SelectFont("console.ttf"); glPopMatrix (); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); }; /********************** * * Game Running * **********************/ void GameRunningOverlay::Init () { if (!mShipSprite.LoadFromPNG("./data/textures/ship.png")) Engine::LogError ("Could not load ship sprite!"); // setup of the HUD font GetView()->LoadFont ("AldotheApache.ttf", 20); GetView()->SelectFont ("AldotheApache.ttf"); GetView()->SetFontJustification (Engine::FontJustificationRight); assert (mShipSprite.GetWidth() > 1); mShipSprite.SetScale (0.1); } bool GameRunningOverlay::OnKeyDown (const SDL_keysym &keysym) { switch (keysym.sym) { case SDLK_ESCAPE: GetModel()->SetGameState(GameStatePaused); return true; default: break; } return false; } void GameRunningOverlay::Draw () { glClearColor (0., 0., 0., 1.); right = static_cast (Engine::GetWindowWidth()); bottom = static_cast (Engine::GetWindowHeight()); // we switch to orthographic projection and draw the contents of the 2d // overlay on top of the previous drawings glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); // first we have to get the size of the current viewport to set up the // orthographic projection correctly GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); gluOrtho2D (viewport[0], viewport[2], viewport[3], viewport[1]); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); // then we do the drawings right = static_cast (Engine::GetWindowWidth()); bottom = static_cast (Engine::GetWindowHeight()); GetView()->SelectFont ("AldotheApache.ttf"); std::ostringstream out_stream; out_stream << GetModel()->GetPlayerLives() << " x "; GetView()->DrawGLString (right - 64, bottom - 20, out_stream.str().c_str()); mShipSprite.DrawAt2D (right - 32 - 10, bottom - 16); out_stream.str(""); out_stream << GetModel()->GetPoints(); GetView()->DrawGLString (right - 10, 40, out_stream.str().c_str()); glPopMatrix (); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); }; /********************** * * Game Over * **********************/ void GameOverOverlay::Init () { } bool GameOverOverlay::OnKeyDown (const SDL_keysym &keysym) { switch (keysym.sym) { case SDLK_ESCAPE: GetModel()->SetGameState(GameStateShowHighscore); break; case SDLK_RETURN: GetModel()->SetGameState(GameStateShowHighscore); break; default: break; } return true; } void GameOverOverlay::Draw () { glClearColor (0., 0., 0., 1.); right = static_cast (Engine::GetWindowWidth()); bottom = static_cast (Engine::GetWindowHeight()); // we switch to orthographic projection and draw the contents of the 2d // overlay on top of the previous drawings glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); // first we have to get the size of the current viewport to set up the // orthographic projection correctly GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); gluOrtho2D (viewport[0], viewport[2], viewport[3], viewport[1]); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); GetView()->SelectFont("console.ttf"); // then we do the drawings std::ostringstream topbar_stream; Engine::DrawGLString ( right * 0.5 - 60, bottom * 0.5 - 8 - 64, "G a m e O v e r"); if (GetModel()->GetPlayerLives() == 0) { topbar_stream << "That was pathetic! "; Engine::DrawGLString ( right * 0.5 - 80, bottom * 0.5 - 8, topbar_stream.str().c_str ()); } else { Engine::DrawGLString ( right * 0.5 - 80, bottom * 0.5 - 32, "You earned yourself the"); Engine::DrawGLString ( right * 0.5 - 60, bottom * 0.5 + 0, "You Rock(TM) award."); Engine::DrawGLString ( right * 0.5 - 70, bottom * 0.5 + 32, "Go tell your friends."); } glPopMatrix (); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); }; /********************** * * Level Complete * **********************/ void LevelCompleteOverlay::Init () { } bool LevelCompleteOverlay::OnKeyDown (const SDL_keysym &keysym) { switch (keysym.sym) { case SDLK_RETURN: GetModel()->SetGameState(GameStateRunning); break; default: break; } return true; } void LevelCompleteOverlay::Draw () { glClearColor (0., 0., 0., 1.); right = static_cast (Engine::GetWindowWidth()); bottom = static_cast (Engine::GetWindowHeight()); // we switch to orthographic projection and draw the contents of the 2d // overlay on top of the previous drawings glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); // first we have to get the size of the current viewport to set up the // orthographic projection correctly GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); gluOrtho2D (viewport[0], viewport[2], viewport[3], viewport[1]); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); GetView()->SelectFont("console.ttf"); // then we do the drawings Engine::DrawGLString ( right * 0.5 - 80, bottom * 0.5 - 8 - 16, "Congratulations - You rock!"); Engine::DrawGLString ( right * 0.5 - 80, bottom * 0.5 - 8, "[Return] - Next level ..."); glPopMatrix (); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); }; /********************** * * Game Paused * **********************/ void GamePausedOverlay::Init () { } bool GamePausedOverlay::OnKeyDown (const SDL_keysym &keysym) { switch (keysym.sym) { case SDLK_ESCAPE: Engine::RunCommand ("quit"); return true; case SDLK_RETURN: GetModel()->SetGameState(GameStateRunning); return true; default: return true; } } void GamePausedOverlay::Draw () { glClearColor (0.1, 0.1, 0.1, 1.); right = static_cast (Engine::GetWindowWidth()); bottom = static_cast (Engine::GetWindowHeight()); // we switch to orthographic projection and draw the contents of the 2d // overlay on top of the previous drawings glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); // first we have to get the size of the current viewport to set up the // orthographic projection correctly GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); gluOrtho2D (viewport[0], viewport[2], viewport[3], viewport[1]); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); GetView()->SelectFont("console.ttf"); // then we do the drawings Engine::DrawGLString ( right * 0.5 - 100, bottom * 0.5 - 8 - 64, "A s t e r o i d s"); Engine::DrawGLString ( right * 0.5 - 100, bottom * 0.5 - 8 - 32, "Main Menu"); Engine::DrawGLString ( right * 0.5 - 80, bottom * 0.5 - 8 - 16, "[Return] - Resume Game"); Engine::DrawGLString ( right * 0.5 - 80, bottom * 0.5 - 8, "[Escape] - Quit"); glPopMatrix (); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); }; /********************** * * Player Died * **********************/ void PlayerDiedOverlay::Init () { } bool PlayerDiedOverlay::OnKeyDown (const SDL_keysym &keysym) { switch (keysym.sym) { case SDLK_RETURN: GetModel()->SetGameState(GameStateRunning); break; default: break; } return true; } void PlayerDiedOverlay::Draw () { glClearColor (0., 0., 0., 1.); right = static_cast (Engine::GetWindowWidth()); bottom = static_cast (Engine::GetWindowHeight()); // we switch to orthographic projection and draw the contents of the 2d // overlay on top of the previous drawings glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); // first we have to get the size of the current viewport to set up the // orthographic projection correctly GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); gluOrtho2D (viewport[0], viewport[2], viewport[3], viewport[1]); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); GetView()->SelectFont("console.ttf"); // then we do the drawings std::ostringstream topbar_stream; topbar_stream << "You died ..."; Engine::DrawGLString ( right * 0.5 - 40, bottom * 0.5 - 8 - 32, topbar_stream.str().c_str ()); Engine::DrawGLString ( right * 0.5 - 90, bottom * 0.5 + 8, "Press [Return] to continue."); glPopMatrix (); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); }; /********************** * * Highscore * **********************/ void HighscoreOverlay::Init () { } bool HighscoreOverlay::OnKeyDown (const SDL_keysym &keysym) { switch (keysym.sym) { case SDLK_ESCAPE: case SDLK_RETURN: GetModel()->SetGameState(GameStateMainMenu); return true; default: break; } return true; } void HighscoreOverlay::Draw () { glClearColor (0.1, 0.1, 0.1, 1.); right = static_cast (Engine::GetWindowWidth()); bottom = static_cast (Engine::GetWindowHeight()); // we switch to orthographic projection and draw the contents of the 2d // overlay on top of the previous drawings glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); // first we have to get the size of the current viewport to set up the // orthographic projection correctly GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); gluOrtho2D (viewport[0], viewport[2], viewport[3], viewport[1]); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); GetView()->SelectFont("console.ttf"); float x = right * 0.5 - 100; float y = bottom * 0.5 - 8 - 128; // then we do the drawings Engine::DrawGLString ( x, y, "A s t e r o i d s"); y += 30; Engine::DrawGLString ( x, y, "Highscore"); y += 30; std::list::iterator highscore_iter = GetModel()->mHighscoreList.begin(); GetView()->SetFontJustification(Engine::FontJustificationLeft); unsigned int entry_length = 32; unsigned int i = 0; while (highscore_iter != GetModel()->mHighscoreList.end()) { // compute the number of digits unsigned int digits = 1; unsigned int temp_val = highscore_iter->points; while (temp_val > 0) { temp_val /= 10; digits ++; } // output of the name std::ostringstream out_stream; out_stream << highscore_iter->name; // add dots to fill the line temp_val = entry_length - out_stream.str().size() - digits; for (temp_val; temp_val > 0; temp_val--) { out_stream << "."; } out_stream << highscore_iter->points; // Check whether we have to highlight an entry (such as when entering // the name) if (GetModel()->mNewestHighscoreEntryIndex < GetModel()->mHighscoreList.size() && GetModel()->mNewestHighscoreEntryIndex == i) { GetView()->SetFontColor (224./255., 200/255., 0.); Engine::DrawGLString ( x, y, out_stream.str().c_str()); GetView()->SetFontColor (1., 1., 1.); } else { Engine::DrawGLString ( x, y, out_stream.str().c_str()); } // go down one line y += 16; i++; highscore_iter++; } Engine::DrawGLString ( x + 16, y + 16, "Press [Return] to continue."); glPopMatrix (); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); }; /********************** * * EnterPlayername * **********************/ void EnterPlayernameOverlay::Init () { mPlayerNameInput = "Starkiller"; } bool EnterPlayernameOverlay::OnKeyDown (const SDL_keysym &keysym) { if (keysym.sym == SDLK_ESCAPE) { GetModel()->SetGameState(GameStateMainMenu); GetController()->uistate.hotitem = 0; return true; } return false; } void EnterPlayernameOverlay::Draw () { glClearColor (0.1, 0.1, 0.1, 1.); right = static_cast (Engine::GetWindowWidth()); bottom = static_cast (Engine::GetWindowHeight()); // we switch to orthographic projection and draw the contents of the 2d // overlay on top of the previous drawings glMatrixMode (GL_PROJECTION); glPushMatrix (); glLoadIdentity (); // first we have to get the size of the current viewport to set up the // orthographic projection correctly GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); gluOrtho2D (viewport[0], viewport[2], viewport[3], viewport[1]); glMatrixMode (GL_MODELVIEW); glPushMatrix (); glLoadIdentity (); GetView()->SelectFont("console.ttf"); Engine::GUI::Label (4, "A s t e r o i d s", right * 0.5 - 100, 180); Engine::GUI::Label (1, "Enter your name: ", right * 0.5 - 100, 250); // Make sure we have UNICODE processing enabled! GetController()->EnableTextinput(true); std::string player_name = GetModel()->GetPlayerName(); if (Engine::GUI::LineEdit (2, right * 0.5 + 20, 238, player_name, 16)) { GetModel()->SetPlayerName(player_name); } if (Engine::GUI::Button (3, "Start Game", right - 150 - 20, 500, 150, 40)) { GetModel()->SetGameState(GameStateRunning); } if (Engine::GUI::Button (5, "Back", 20, 500, 150, 40)) { GetModel()->SetGameState(GameStateMainMenu); GetController()->uistate.hotitem = 0; } glPopMatrix (); glMatrixMode (GL_PROJECTION); glPopMatrix (); glMatrixMode (GL_MODELVIEW); }; }