highscore now working
- added ControllerBase::EnableTextinput() for setting up unicode and key repetitions - added new state GameStateEnterPlayerNamemain
parent
38096a4502
commit
91cdebd33a
|
@ -27,6 +27,7 @@ BEGIN_ENUM(GameState)
|
||||||
DECL_ENUM_ELEMENT(GameStatePlayerDied),
|
DECL_ENUM_ELEMENT(GameStatePlayerDied),
|
||||||
DECL_ENUM_ELEMENT(GameStateLevelComplete),
|
DECL_ENUM_ELEMENT(GameStateLevelComplete),
|
||||||
DECL_ENUM_ELEMENT(GameStateShowHighscore),
|
DECL_ENUM_ELEMENT(GameStateShowHighscore),
|
||||||
|
DECL_ENUM_ELEMENT(GameStateEnterPlayername),
|
||||||
DECL_ENUM_ELEMENT(GameStateGameOver)
|
DECL_ENUM_ELEMENT(GameStateGameOver)
|
||||||
}
|
}
|
||||||
END_ENUM(GameState)
|
END_ENUM(GameState)
|
||||||
|
|
|
@ -80,7 +80,8 @@ void Model::Process () {
|
||||||
// some action.
|
// some action.
|
||||||
Engine::LogDebug ("Switching from %s->%s", GetStringGameState(mLastGameState), GetStringGameState(mGameState));
|
Engine::LogDebug ("Switching from %s->%s", GetStringGameState(mLastGameState), GetStringGameState(mGameState));
|
||||||
|
|
||||||
if (mLastGameState == GameStateMainMenu && mGameState == GameStateRunning) {
|
if ( (mLastGameState == GameStateMainMenu && mGameState == GameStateRunning)
|
||||||
|
|| (mLastGameState == GameStateEnterPlayername && mGameState == GameStateRunning)){
|
||||||
OnNewGame();
|
OnNewGame();
|
||||||
}
|
}
|
||||||
else if (mLastGameState == GameStateRunning && mGameState == GameStatePlayerDied) {
|
else if (mLastGameState == GameStateRunning && mGameState == GameStatePlayerDied) {
|
||||||
|
@ -92,13 +93,14 @@ void Model::Process () {
|
||||||
Engine::EventBasePtr gameover_event (new Engine::EventBase());
|
Engine::EventBasePtr gameover_event (new Engine::EventBase());
|
||||||
gameover_event->mEventType = EventGameOver;
|
gameover_event->mEventType = EventGameOver;
|
||||||
QueueEvent (gameover_event);
|
QueueEvent (gameover_event);
|
||||||
//mGameState = GameStateGameOver;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (mLastGameState == GameStateLevelComplete && mGameState == GameStateRunning) {
|
else if (mLastGameState == GameStateLevelComplete && mGameState == GameStateRunning) {
|
||||||
mCurrentLevelIndex++;
|
mCurrentLevelIndex++;
|
||||||
if (mCurrentLevelIndex == mLevelList.size()) {
|
if (mCurrentLevelIndex == mLevelList.size()) {
|
||||||
SetGameState(GameStateGameOver);
|
Engine::EventBasePtr gameover_event (new Engine::EventBase());
|
||||||
|
gameover_event->mEventType = EventGameOver;
|
||||||
|
QueueEvent (gameover_event);
|
||||||
} else {
|
} else {
|
||||||
DoLoadLevel(mLevelList[mCurrentLevelIndex].c_str());
|
DoLoadLevel(mLevelList[mCurrentLevelIndex].c_str());
|
||||||
}
|
}
|
||||||
|
@ -346,7 +348,9 @@ bool Model::OnLevelComplete() {
|
||||||
Engine::LogMessage ("Level complete!");
|
Engine::LogMessage ("Level complete!");
|
||||||
|
|
||||||
if (mCurrentLevelIndex + 1 == mLevelList.size()) {
|
if (mCurrentLevelIndex + 1 == mLevelList.size()) {
|
||||||
SetGameState(GameStateGameOver);
|
Engine::EventBasePtr gameover_event (new Engine::EventBase());
|
||||||
|
gameover_event->mEventType = EventGameOver;
|
||||||
|
QueueEvent (gameover_event);
|
||||||
} else {
|
} else {
|
||||||
SetGameState (GameStateLevelComplete);
|
SetGameState (GameStateLevelComplete);
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "UserInterface.h"
|
#include "UserInterface.h"
|
||||||
#include "Model.h"
|
#include "Model.h"
|
||||||
#include "View.h"
|
#include "View.h"
|
||||||
|
#include "Controller.h"
|
||||||
#include "Sprite.h"
|
#include "Sprite.h"
|
||||||
#include "ShipEntity.h"
|
#include "ShipEntity.h"
|
||||||
|
|
||||||
|
@ -35,7 +36,7 @@ bool MainMenuOverlay::OnKeyDown (const SDL_keysym &keysym) {
|
||||||
Engine::RunCommand ("quit");
|
Engine::RunCommand ("quit");
|
||||||
return true;
|
return true;
|
||||||
case SDLK_RETURN:
|
case SDLK_RETURN:
|
||||||
GetModel()->SetGameState(GameStateRunning);
|
GetModel()->SetGameState(GameStateEnterPlayername);
|
||||||
return true;
|
return true;
|
||||||
case SDLK_h:
|
case SDLK_h:
|
||||||
GetModel()->SetGameState(GameStateShowHighscore);
|
GetModel()->SetGameState(GameStateShowHighscore);
|
||||||
|
@ -73,7 +74,8 @@ void MainMenuOverlay::Draw () {
|
||||||
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 - 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 - 100, bottom * 0.5 - 8 - 32, "Main Menu");
|
||||||
Engine::DrawGLString ( right * 0.5 - 80, bottom * 0.5 - 8 - 16, "[Return] - Start Game");
|
Engine::DrawGLString ( right * 0.5 - 80, bottom * 0.5 - 8 - 16, "[Return] - Start Game");
|
||||||
Engine::DrawGLString ( right * 0.5 - 80, bottom * 0.5 - 8, "[Escape] - Quit");
|
Engine::DrawGLString ( right * 0.5 - 80, bottom * 0.5 - 8, "[h] - Show Highscore");
|
||||||
|
Engine::DrawGLString ( right * 0.5 - 80, bottom * 0.5 + 8, "[Escape] - Quit");
|
||||||
|
|
||||||
glPopMatrix ();
|
glPopMatrix ();
|
||||||
|
|
||||||
|
@ -174,10 +176,10 @@ void GameOverOverlay::Init () {
|
||||||
bool GameOverOverlay::OnKeyDown (const SDL_keysym &keysym) {
|
bool GameOverOverlay::OnKeyDown (const SDL_keysym &keysym) {
|
||||||
switch (keysym.sym) {
|
switch (keysym.sym) {
|
||||||
case SDLK_ESCAPE:
|
case SDLK_ESCAPE:
|
||||||
GetModel()->SetGameState(GameStateMainMenu);
|
GetModel()->SetGameState(GameStateShowHighscore);
|
||||||
break;
|
break;
|
||||||
case SDLK_RETURN:
|
case SDLK_RETURN:
|
||||||
GetModel()->SetGameState(GameStateMainMenu);
|
GetModel()->SetGameState(GameStateShowHighscore);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -424,15 +426,6 @@ bool HighscoreOverlay::OnKeyDown (const SDL_keysym &keysym) {
|
||||||
switch (keysym.sym) {
|
switch (keysym.sym) {
|
||||||
case SDLK_ESCAPE:
|
case SDLK_ESCAPE:
|
||||||
case SDLK_RETURN:
|
case SDLK_RETURN:
|
||||||
// If we just entered a new entry we simply show the highscore table,
|
|
||||||
// otherwise we switch back to the main menu
|
|
||||||
if (GetModel()->mNewestHighscoreEntryIndex < GetModel()->mHighscoreList.size()) {
|
|
||||||
GetModel()->mNewestHighscoreEntryIndex = GetModel()->mHighscoreList.size();
|
|
||||||
SDL_EnableUNICODE(-1);
|
|
||||||
SDL_EnableKeyRepeat(0,100);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
GetModel()->SetGameState(GameStateMainMenu);
|
GetModel()->SetGameState(GameStateMainMenu);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -443,7 +436,7 @@ bool HighscoreOverlay::OnKeyDown (const SDL_keysym &keysym) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void HighscoreOverlay::Draw () {
|
void HighscoreOverlay::Draw () {
|
||||||
glClearColor (0., 0., 0., 1.);
|
glClearColor (0.1, 0.1, 0.1, 1.);
|
||||||
|
|
||||||
right = static_cast<float> (Engine::GetWindowWidth());
|
right = static_cast<float> (Engine::GetWindowWidth());
|
||||||
bottom = static_cast<float> (Engine::GetWindowHeight());
|
bottom = static_cast<float> (Engine::GetWindowHeight());
|
||||||
|
@ -531,4 +524,95 @@ void HighscoreOverlay::Draw () {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**********************
|
||||||
|
*
|
||||||
|
* EnterPlayername
|
||||||
|
*
|
||||||
|
**********************/
|
||||||
|
|
||||||
|
void EnterPlayernameOverlay::Init () {
|
||||||
|
mPlayerNameInput = "Starkiller";
|
||||||
|
}
|
||||||
|
|
||||||
|
bool EnterPlayernameOverlay::OnKeyDown (const SDL_keysym &keysym) {
|
||||||
|
GetController()->EnableTextinput(true);
|
||||||
|
|
||||||
|
switch (keysym.sym) {
|
||||||
|
case SDLK_ESCAPE:
|
||||||
|
GetModel()->SetGameState(GameStateMainMenu);
|
||||||
|
return true;
|
||||||
|
case SDLK_BACKSPACE:
|
||||||
|
if (mPlayerNameInput.size() > 0)
|
||||||
|
mPlayerNameInput = mPlayerNameInput.substr (0, mPlayerNameInput.size() - 1 );
|
||||||
|
return true;
|
||||||
|
break;
|
||||||
|
case SDLK_RETURN:
|
||||||
|
// If we just entered a new entry we simply show the highscore table,
|
||||||
|
// otherwise we switch back to the main menu
|
||||||
|
GetModel()->SetPlayerName(mPlayerNameInput);
|
||||||
|
GetController()->EnableTextinput(false);
|
||||||
|
GetModel()->SetGameState(GameStateRunning);
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keysym.unicode) {
|
||||||
|
if ((keysym.unicode & 0xFF80) == 0) {
|
||||||
|
mPlayerNameInput += keysym.unicode & 0x7F;
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
Engine::LogWarning ("Input key not supported!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EnterPlayernameOverlay::Draw () {
|
||||||
|
glClearColor (0.1, 0.1, 0.1, 1.);
|
||||||
|
|
||||||
|
right = static_cast<float> (Engine::GetWindowWidth());
|
||||||
|
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 ();
|
||||||
|
|
||||||
|
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, "Enter your name: ");
|
||||||
|
|
||||||
|
std::string name_output (mPlayerNameInput);
|
||||||
|
name_output += "_";
|
||||||
|
Engine::DrawGLString ( x + 15*8, y, name_output.c_str());
|
||||||
|
Engine::DrawGLString ( x + 16, y + 16, "Press [Return] to continue.");
|
||||||
|
|
||||||
|
glPopMatrix ();
|
||||||
|
|
||||||
|
glMatrixMode (GL_PROJECTION);
|
||||||
|
glPopMatrix ();
|
||||||
|
|
||||||
|
glMatrixMode (GL_MODELVIEW);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ class OverlayBase;
|
||||||
|
|
||||||
#include "OverlayBase.h"
|
#include "OverlayBase.h"
|
||||||
#include "Sprite.h"
|
#include "Sprite.h"
|
||||||
|
#include <string>
|
||||||
|
|
||||||
namespace asteroids {
|
namespace asteroids {
|
||||||
|
|
||||||
|
@ -103,6 +104,21 @@ class HighscoreOverlay : public Engine::OverlayBase {
|
||||||
virtual void Draw ();
|
virtual void Draw ();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class EnterPlayernameOverlay : public Engine::OverlayBase {
|
||||||
|
public:
|
||||||
|
EnterPlayernameOverlay () {
|
||||||
|
};
|
||||||
|
virtual ~EnterPlayernameOverlay() {};
|
||||||
|
|
||||||
|
virtual void Init ();
|
||||||
|
|
||||||
|
virtual bool OnKeyDown (const SDL_keysym &keysym);
|
||||||
|
virtual void Draw ();
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string mPlayerNameInput;
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* USERINTERFACE */
|
#endif /* USERINTERFACE */
|
||||||
|
|
|
@ -37,6 +37,7 @@ int View::OnInit (int argc, char* argv[]) {
|
||||||
Engine::OverlayBasePtr game_paused_overlay (new GamePausedOverlay);
|
Engine::OverlayBasePtr game_paused_overlay (new GamePausedOverlay);
|
||||||
Engine::OverlayBasePtr player_died_overlay (new PlayerDiedOverlay);
|
Engine::OverlayBasePtr player_died_overlay (new PlayerDiedOverlay);
|
||||||
Engine::OverlayBasePtr highscore_overlay (new HighscoreOverlay);
|
Engine::OverlayBasePtr highscore_overlay (new HighscoreOverlay);
|
||||||
|
Engine::OverlayBasePtr enterplayername_overlay (new EnterPlayernameOverlay);
|
||||||
|
|
||||||
mOverlayManager.Register (menu_overlay, GameStateMainMenu);
|
mOverlayManager.Register (menu_overlay, GameStateMainMenu);
|
||||||
mOverlayManager.Register (game_running_overlay, GameStateRunning);
|
mOverlayManager.Register (game_running_overlay, GameStateRunning);
|
||||||
|
@ -45,6 +46,7 @@ int View::OnInit (int argc, char* argv[]) {
|
||||||
mOverlayManager.Register (player_died_overlay, GameStatePlayerDied);
|
mOverlayManager.Register (player_died_overlay, GameStatePlayerDied);
|
||||||
mOverlayManager.Register (game_paused_overlay, GameStatePaused);
|
mOverlayManager.Register (game_paused_overlay, GameStatePaused);
|
||||||
mOverlayManager.Register (highscore_overlay, GameStateShowHighscore);
|
mOverlayManager.Register (highscore_overlay, GameStateShowHighscore);
|
||||||
|
mOverlayManager.Register (enterplayername_overlay, GameStateEnterPlayername);
|
||||||
|
|
||||||
mOverlayManager.InitOverlays();
|
mOverlayManager.InitOverlays();
|
||||||
|
|
||||||
|
|
|
@ -130,6 +130,17 @@ void ControllerBase::ProcessEvents () {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** \brief Activates or deactivates unicode processing and key delays of the keyboard inputs */
|
||||||
|
void ControllerBase::EnableTextinput (bool textinput_state) {
|
||||||
|
if (textinput_state) {
|
||||||
|
SDL_EnableUNICODE(1);
|
||||||
|
SDL_EnableKeyRepeat(500, 50);
|
||||||
|
} else {
|
||||||
|
SDL_EnableUNICODE(-1);
|
||||||
|
SDL_EnableKeyRepeat(0, 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** \brief Keyboard processing */
|
/** \brief Keyboard processing */
|
||||||
bool ControllerBase::OnKeyDown (const SDL_keysym &keysym) {
|
bool ControllerBase::OnKeyDown (const SDL_keysym &keysym) {
|
||||||
if (mView->mOverlayManager.SendKeyDown (keysym))
|
if (mView->mOverlayManager.SendKeyDown (keysym))
|
||||||
|
|
|
@ -44,6 +44,9 @@ class ControllerBase : public Module {
|
||||||
}
|
}
|
||||||
bool BindKey (int key, const char *command);
|
bool BindKey (int key, const char *command);
|
||||||
|
|
||||||
|
/** \brief Activates or deactivates unicode processing and key delays of the keyboard inputs */
|
||||||
|
void EnableTextinput (bool textinput_state);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/** \brief Initializes the system */
|
/** \brief Initializes the system */
|
||||||
virtual int OnInit (int argc, char* argv[]);
|
virtual int OnInit (int argc, char* argv[]);
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
* have to know the number of bits that are to be reserved in advance so this
|
* have to know the number of bits that are to be reserved in advance so this
|
||||||
* is hard coded into the library for now.
|
* is hard coded into the library for now.
|
||||||
*/
|
*/
|
||||||
#define ENTITY_CONTROLLER_MAX_KEY_STATES 64
|
const int EntityControllerMaxKeyStates = 64;
|
||||||
|
|
||||||
namespace Engine {
|
namespace Engine {
|
||||||
|
|
||||||
|
|
|
@ -5,20 +5,20 @@
|
||||||
namespace Engine {
|
namespace Engine {
|
||||||
|
|
||||||
bool EntityControllerState::GetKey (int state) {
|
bool EntityControllerState::GetKey (int state) {
|
||||||
assert (state < ENTITY_CONTROLLER_MAX_KEY_STATES && state >= 0);
|
assert (state < EntityControllerMaxKeyStates && state >= 0);
|
||||||
|
|
||||||
return mKeyState.test (state);
|
return mKeyState.test (state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityControllerState::SetKey (int state) {
|
void EntityControllerState::SetKey (int state) {
|
||||||
assert (state < ENTITY_CONTROLLER_MAX_KEY_STATES && state >= 0);
|
assert (state < EntityControllerMaxKeyStates && state >= 0);
|
||||||
|
|
||||||
LogDebug ("Setting Entity Key State %d", state);
|
LogDebug ("Setting Entity Key State %d", state);
|
||||||
mKeyState.set (state);
|
mKeyState.set (state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EntityControllerState::UnsetKey (int state) {
|
void EntityControllerState::UnsetKey (int state) {
|
||||||
assert (state < ENTITY_CONTROLLER_MAX_KEY_STATES && state >= 0);
|
assert (state < EntityControllerMaxKeyStates && state >= 0);
|
||||||
|
|
||||||
LogDebug ("Unsetting Entity Key State %d", state);
|
LogDebug ("Unsetting Entity Key State %d", state);
|
||||||
mKeyState.reset (state);
|
mKeyState.reset (state);
|
||||||
|
|
|
@ -100,7 +100,7 @@ struct EntityPhysicState {
|
||||||
* \todo [Low] The current design is very unflexible. Is there a better way?
|
* \todo [Low] The current design is very unflexible. Is there a better way?
|
||||||
*/
|
*/
|
||||||
struct EntityControllerState {
|
struct EntityControllerState {
|
||||||
std::bitset<ENTITY_CONTROLLER_MAX_KEY_STATES> mKeyState;
|
std::bitset<EntityControllerMaxKeyStates> mKeyState;
|
||||||
|
|
||||||
bool GetKey (int state);
|
bool GetKey (int state);
|
||||||
void SetKey (int state);
|
void SetKey (int state);
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "DrawingsGL.h"
|
#include "DrawingsGL.h"
|
||||||
#include "OverlayBase.h"
|
#include "OverlayBase.h"
|
||||||
#include "SimpleConsoleOverlay.h"
|
#include "SimpleConsoleOverlay.h"
|
||||||
|
#include "ControllerBase.h"
|
||||||
|
|
||||||
#include "OGLFT.h"
|
#include "OGLFT.h"
|
||||||
|
|
||||||
|
@ -16,10 +17,10 @@ bool SimpleConsoleOverlay::OnKeyDown (const SDL_keysym &keysym) {
|
||||||
if (mActive) {
|
if (mActive) {
|
||||||
// We have to call SetActive() to actually
|
// We have to call SetActive() to actually
|
||||||
// activate the unicode processing of SDL
|
// activate the unicode processing of SDL
|
||||||
SetActive (false);
|
EngineGetController()->EnableTextinput(false);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
SetActive (true);
|
EngineGetController()->EnableTextinput(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -31,7 +32,7 @@ bool SimpleConsoleOverlay::OnKeyDown (const SDL_keysym &keysym) {
|
||||||
// check for input that requires actions
|
// check for input that requires actions
|
||||||
switch (keysym.sym) {
|
switch (keysym.sym) {
|
||||||
case SDLK_ESCAPE:
|
case SDLK_ESCAPE:
|
||||||
SetActive (false);
|
EngineGetController()->EnableTextinput(false);
|
||||||
return true;
|
return true;
|
||||||
break;
|
break;
|
||||||
case SDLK_BACKSPACE:
|
case SDLK_BACKSPACE:
|
||||||
|
|
Loading…
Reference in New Issue