using now IMGUI for the GUI and removed the Overlay based interface
This commit is contained in:
+283
-22
@@ -1,19 +1,22 @@
|
||||
#include "View.h"
|
||||
#include "CameraBase.h"
|
||||
#include "UserInterface.h"
|
||||
#include "SimpleConsoleOverlay.h"
|
||||
#include "IMGUIControls.h"
|
||||
|
||||
#include "Engine.h"
|
||||
#include "Physics.h"
|
||||
#include "Model.h"
|
||||
#include "Controller.h"
|
||||
#include "EventBase.h"
|
||||
|
||||
#include "Game.h"
|
||||
#include "ShipEntity.h"
|
||||
#include "AsteroidEntity.h"
|
||||
#include "AsteroidsEvents.h"
|
||||
#include "RocketEntity.h"
|
||||
|
||||
#include <GL/gl.h>
|
||||
#include <GL/glu.h>
|
||||
|
||||
// #define DRAW_BOUNDARIES
|
||||
|
||||
@@ -29,27 +32,6 @@ namespace asteroids {
|
||||
int View::OnInit (int argc, char* argv[]) {
|
||||
ViewBase::OnInit (argc, argv);
|
||||
|
||||
// We want menu
|
||||
Engine::OverlayBasePtr menu_overlay (new MainMenuOverlay);
|
||||
Engine::OverlayBasePtr game_running_overlay (new GameRunningOverlay);
|
||||
Engine::OverlayBasePtr game_over_overlay (new GameOverOverlay);
|
||||
Engine::OverlayBasePtr level_complete_overlay (new LevelCompleteOverlay);
|
||||
Engine::OverlayBasePtr game_paused_overlay (new GamePausedOverlay);
|
||||
Engine::OverlayBasePtr player_died_overlay (new PlayerDiedOverlay);
|
||||
Engine::OverlayBasePtr highscore_overlay (new HighscoreOverlay);
|
||||
Engine::OverlayBasePtr enterplayername_overlay (new EnterPlayernameOverlay);
|
||||
|
||||
mOverlayManager.Register (menu_overlay, GameStateMainMenu);
|
||||
mOverlayManager.Register (game_running_overlay, GameStateRunning);
|
||||
mOverlayManager.Register (level_complete_overlay, GameStateLevelComplete);
|
||||
mOverlayManager.Register (game_over_overlay, GameStateGameOver);
|
||||
mOverlayManager.Register (player_died_overlay, GameStatePlayerDied);
|
||||
mOverlayManager.Register (game_paused_overlay, GameStatePaused);
|
||||
mOverlayManager.Register (highscore_overlay, GameStateShowHighscore);
|
||||
mOverlayManager.Register (enterplayername_overlay, GameStateEnterPlayername);
|
||||
|
||||
mOverlayManager.InitOverlays();
|
||||
|
||||
/*
|
||||
// We want the console
|
||||
mConsoleOverlay = boost::shared_ptr<Engine::SimpleConsoleOverlay> (new Engine::SimpleConsoleOverlay);
|
||||
@@ -58,6 +40,8 @@ int View::OnInit (int argc, char* argv[]) {
|
||||
mOverlayManager.Register (mConsoleOverlay, GameStateMainMenu);
|
||||
*/
|
||||
|
||||
LoadFont("AldotheApache.ttf", 20);
|
||||
|
||||
// This is a simple star field that makes the game so spacy
|
||||
int i;
|
||||
for (i = 0; i < 200; i++) {
|
||||
@@ -69,6 +53,9 @@ int View::OnInit (int argc, char* argv[]) {
|
||||
mBackgroundStars.push_back (star);
|
||||
}
|
||||
|
||||
mGUIShipSprite.LoadFromPNG("./data/textures/ship.png");
|
||||
mGUIShipSprite.SetScale (0.1);
|
||||
|
||||
mAsteroidSprite.LoadFromPNG ("./data/textures/asteroid.png");
|
||||
mShipSprite.LoadFromPNG ("./data/textures/ship.png");
|
||||
|
||||
@@ -197,6 +184,29 @@ void View::DrawStars() {
|
||||
|
||||
}
|
||||
|
||||
void View::Draw() {
|
||||
PreDraw();
|
||||
|
||||
// Actual Drawing
|
||||
UpdateCamera ();
|
||||
|
||||
if (mDrawGrid)
|
||||
DrawGrid ();
|
||||
|
||||
/*
|
||||
if (mDrawAxis)
|
||||
DrawAxis ();
|
||||
*/
|
||||
|
||||
DrawWorld ();
|
||||
|
||||
DrawUi ();
|
||||
// mOverlayManager.Draw();
|
||||
|
||||
// Perform post-Draw actions
|
||||
PostDraw();
|
||||
}
|
||||
|
||||
void View::DrawWorld() {
|
||||
std::map<unsigned int, Engine::EntityBase*>::iterator entity_iterator;
|
||||
|
||||
@@ -309,9 +319,260 @@ void View::DrawWorld() {
|
||||
glPopMatrix ();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Userinterface
|
||||
*/
|
||||
void View::DrawUi () {
|
||||
glClearColor (0.1, 0.1, 0.1, 1.);
|
||||
|
||||
screen_right = static_cast<float> (Engine::GetWindowWidth());
|
||||
screen_bottom = static_cast<float> (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 ();
|
||||
|
||||
unsigned int game_state = GetModel()->GetGameState();
|
||||
|
||||
SelectFont("console.ttf");
|
||||
SetFontJustification (Engine::FontJustificationLeft);
|
||||
GetController()->EnableTextinput(true);
|
||||
|
||||
switch (game_state) {
|
||||
case GameStateMainMenu:
|
||||
DrawUiMainMenu();
|
||||
break;
|
||||
case GameStateRunning:
|
||||
DrawUiGameRunning();
|
||||
break;
|
||||
case GameStatePaused:
|
||||
DrawUiGamePaused();
|
||||
break;
|
||||
case GameStatePlayerDied:
|
||||
DrawUiPlayerDied();
|
||||
break;
|
||||
case GameStateLevelComplete:
|
||||
DrawUiLevelComplete();
|
||||
break;
|
||||
case GameStateShowHighscore:
|
||||
DrawUiHighscore();
|
||||
break;
|
||||
case GameStateEnterPlayername:
|
||||
DrawUiEnterPlayername();
|
||||
break;
|
||||
case GameStateGameOver:
|
||||
DrawUiGameOver();
|
||||
break;
|
||||
default:
|
||||
Engine::LogWarning ("Trying to draw unknown GameState: %s (%d)",
|
||||
GetStringGameState (game_state), game_state);
|
||||
break;
|
||||
}
|
||||
|
||||
glPopMatrix ();
|
||||
|
||||
glMatrixMode (GL_PROJECTION);
|
||||
glPopMatrix ();
|
||||
|
||||
glMatrixMode (GL_MODELVIEW);
|
||||
|
||||
}
|
||||
|
||||
void View::DrawUiMainMenu() {
|
||||
Engine::GUI::Label (4, "A s t e r o i d s", screen_right * 0.5 - 100, 180);
|
||||
|
||||
if (Engine::GUI::Button (1, "New Game", screen_right * 0.5 - 100, 200, 250, 40)) {
|
||||
GetModel()->SetGameState(GameStateEnterPlayername);
|
||||
}
|
||||
|
||||
if (Engine::GUI::Button (2, "Highscores", screen_right * 0.5 - 100, 250, 250, 40)) {
|
||||
GetModel()->SetGameState(GameStateShowHighscore);
|
||||
}
|
||||
|
||||
if (Engine::GUI::Button (3, "Quit", screen_right * 0.5 - 100, 330, 250, 40)) {
|
||||
Engine::RunCommand("quit");
|
||||
}
|
||||
}
|
||||
|
||||
void View::DrawUiGameRunning() {
|
||||
// We choose a different font and also draw it aligned to the right as this
|
||||
// looks nicer with the points
|
||||
SelectFont ("AldotheApache.ttf");
|
||||
SetFontJustification (Engine::FontJustificationRight);
|
||||
|
||||
std::ostringstream out_stream;
|
||||
out_stream << GetModel()->GetPlayerLives() << " x ";
|
||||
DrawGLString (screen_right - 64, screen_bottom - 20, out_stream.str().c_str());
|
||||
|
||||
mGUIShipSprite.DrawAt2D (screen_right - 32 - 10, screen_bottom - 16);
|
||||
|
||||
out_stream.str("");
|
||||
out_stream << GetModel()->GetPoints();
|
||||
DrawGLString (screen_right - 30, 40, out_stream.str().c_str());
|
||||
|
||||
// revert the font justification
|
||||
SetFontJustification (Engine::FontJustificationLeft);
|
||||
|
||||
if (Engine::GUI::CheckKeyPress(SDLK_ESCAPE))
|
||||
GetModel()->SetGameState(GameStatePaused);
|
||||
}
|
||||
|
||||
void View::DrawUiGameOver() {
|
||||
Engine::GUI::Label (4, "G a m e O v e r", screen_right * 0.5 - 100, 180);
|
||||
|
||||
if (GetModel()->GetPlayerLives() == 0) {
|
||||
Engine::GUI::Label(5, "That was pathetic!", screen_right * 0.5 - 80, screen_bottom * 0.5 - 8);
|
||||
} else {
|
||||
Engine::GUI::Label (6, "You earned yourself the",
|
||||
screen_right * 0.5 - 80,
|
||||
screen_bottom * 0.5 - 32);
|
||||
Engine::GUI::Label (7, "You Rock(TM) award.",
|
||||
screen_right * 0.5 - 60,
|
||||
screen_bottom * 0.5 + 0);
|
||||
Engine::GUI::Label (8, "Go tell your friends.",
|
||||
screen_right * 0.5 - 70,
|
||||
screen_bottom * 0.5 + 32);
|
||||
}
|
||||
|
||||
if (Engine::GUI::Button (2, "Continue...",
|
||||
screen_right * 0.5 - 100,
|
||||
screen_bottom * 0.5 + 60, 250, 40)) {
|
||||
GetModel()->SetGameState(GameStateShowHighscore);
|
||||
}
|
||||
}
|
||||
|
||||
void View::DrawUiLevelComplete() {
|
||||
Engine::GUI::Label (4, "Level Complete!", screen_right * 0.5 - 100, 180);
|
||||
|
||||
Engine::GUI::Label (6, "Congratulations - You rock!", screen_right * 0.5 - 80, screen_bottom * 0.5 -16);
|
||||
|
||||
if(Engine::GUI::Button (1, "Next level ...", screen_right * 0.5 - 80, screen_bottom * 0.5 -16, 250, 40)) {
|
||||
GetModel()->SetGameState(GameStateRunning);
|
||||
}
|
||||
}
|
||||
|
||||
void View::DrawUiGamePaused() {
|
||||
Engine::GUI::Label (4, "- P a u s e d -", screen_right * 0.5 - 100, 180);
|
||||
|
||||
if (Engine::GUI::Button (1, "Resume Game", screen_right * 0.5 - 100, 200, 250, 40)) {
|
||||
GetModel()->SetGameState(GameStateRunning);
|
||||
}
|
||||
|
||||
if (Engine::GUI::Button (2, "Abort Game", screen_right * 0.5 - 100, 250, 250, 40)) {
|
||||
GetModel()->SetGameState(GameStateMainMenu);
|
||||
}
|
||||
|
||||
if (Engine::GUI::Button (3, "Quit", screen_right * 0.5 - 100, 330, 250, 40)) {
|
||||
Engine::RunCommand("quit");
|
||||
}
|
||||
}
|
||||
|
||||
void View::DrawUiPlayerDied() {
|
||||
Engine::GUI::Label (4, "You died ...", screen_right * 0.5 - 40, screen_bottom * 0.5 - 8 - 32);
|
||||
|
||||
if (Engine::GUI::Button (1, "Continue", screen_right * 0.5 - 100, 200, 250, 40)) {
|
||||
GetModel()->SetGameState(GameStateRunning);
|
||||
}
|
||||
}
|
||||
|
||||
void View::DrawUiHighscore() {
|
||||
float x = screen_right * 0.5 - 100;
|
||||
float y = screen_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<Model::HighscoreEntry>::iterator highscore_iter = GetModel()->mHighscoreList.begin();
|
||||
|
||||
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) {
|
||||
SetFontColor (224./255., 200/255., 0.);
|
||||
Engine::DrawGLString ( x, y, out_stream.str().c_str());
|
||||
SetFontColor (1., 1., 1.);
|
||||
} else {
|
||||
Engine::DrawGLString ( x, y, out_stream.str().c_str());
|
||||
}
|
||||
|
||||
// go down one line
|
||||
y += 16;
|
||||
|
||||
i++;
|
||||
highscore_iter++;
|
||||
}
|
||||
|
||||
if (Engine::GUI::Button (1, "Back to MainMenu", x + 16, y + 16, 250, 40)) {
|
||||
GetModel()->SetGameState(GameStateMainMenu);
|
||||
}
|
||||
}
|
||||
|
||||
void View::DrawUiEnterPlayername() {
|
||||
Engine::GUI::Label (4, "A s t e r o i d s", screen_right * 0.5 - 100, 180);
|
||||
|
||||
// Enter your name
|
||||
std::string player_name = GetModel()->GetPlayerName();
|
||||
|
||||
Engine::GUI::Label (1, "Enter your name: ", screen_right * 0.5 - 100, 250);
|
||||
|
||||
if (Engine::GUI::LineEdit (2, screen_right * 0.5 + 20, 238, player_name, 16)) {
|
||||
GetModel()->SetPlayerName(player_name);
|
||||
}
|
||||
|
||||
if (Engine::GUI::Button (3, "Start Game", screen_right - 150 - 20, 500, 150, 40)) {
|
||||
GetModel()->SetGameState(GameStateRunning);
|
||||
}
|
||||
|
||||
if (Engine::GUI::Button (5, "Back", 20, 500, 150, 40)) {
|
||||
GetModel()->SetGameState(GameStateMainMenu);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Entities
|
||||
*/
|
||||
void View::DrawEntity (Engine::EntityBase *entity) {
|
||||
if (entity->mType == GameEntityTypeAsteroid)
|
||||
DrawAsteroid ((AsteroidEntity*) entity);
|
||||
|
||||
Reference in New Issue
Block a user