improvement of the text input and added some documentation
parent
3f962163b3
commit
61275239ce
|
@ -536,11 +536,12 @@ void EnterPlayernameOverlay::Init () {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EnterPlayernameOverlay::OnKeyDown (const SDL_keysym &keysym) {
|
bool EnterPlayernameOverlay::OnKeyDown (const SDL_keysym &keysym) {
|
||||||
if (keysym.sym == SDLK_ESCAPE) {
|
/* if (keysym.sym == SDLK_ESCAPE) {
|
||||||
GetModel()->SetGameState(GameStateMainMenu);
|
GetModel()->SetGameState(GameStateMainMenu);
|
||||||
GetController()->uistate.hotitem = 0;
|
GetController()->uistate.hotitem = 0;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -569,18 +570,43 @@ void EnterPlayernameOverlay::Draw () {
|
||||||
|
|
||||||
GetView()->SelectFont("console.ttf");
|
GetView()->SelectFont("console.ttf");
|
||||||
|
|
||||||
Engine::GUI::Label (4, "A s t e r o i d s", right * 0.5 - 100, 180);
|
// If ESC, we want to go back to the main menu (warning: OpenGL cleanup has
|
||||||
|
// still to be performed!
|
||||||
|
if (Engine::GUI::CheckKeyPress(SDLK_ESCAPE)) {
|
||||||
|
GetModel()->SetGameState(GameStateMainMenu);
|
||||||
|
glPopMatrix ();
|
||||||
|
|
||||||
Engine::GUI::Label (1, "Enter your name: ", right * 0.5 - 100, 250);
|
glMatrixMode (GL_PROJECTION);
|
||||||
|
glPopMatrix ();
|
||||||
|
|
||||||
|
glMatrixMode (GL_MODELVIEW);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Engine::GUI::Label (4, "A s t e r o i d s", right * 0.5 - 100, 180);
|
||||||
|
|
||||||
// Make sure we have UNICODE processing enabled!
|
// Make sure we have UNICODE processing enabled!
|
||||||
GetController()->EnableTextinput(true);
|
GetController()->EnableTextinput(true);
|
||||||
|
|
||||||
|
// Enter your name
|
||||||
std::string player_name = GetModel()->GetPlayerName();
|
std::string player_name = GetModel()->GetPlayerName();
|
||||||
|
|
||||||
|
Engine::GUI::Label (1, "Enter your name: ", right * 0.5 - 100, 250);
|
||||||
|
|
||||||
if (Engine::GUI::LineEdit (2, right * 0.5 + 20, 238, player_name, 16)) {
|
if (Engine::GUI::LineEdit (2, right * 0.5 + 20, 238, player_name, 16)) {
|
||||||
GetModel()->SetPlayerName(player_name);
|
GetModel()->SetPlayerName(player_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// some test
|
||||||
|
static std::string otherstring("25blabla");
|
||||||
|
|
||||||
|
Engine::GUI::Label (6, "Enter your age : ", right * 0.5 - 100, 280);
|
||||||
|
|
||||||
|
if (Engine::GUI::LineEdit (7, right * 0.5 + 20, 268, otherstring, 16)) {
|
||||||
|
// GetModel()->SetPlayerName(player_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (Engine::GUI::Button (3, "Start Game", right - 150 - 20, 500, 150, 40)) {
|
if (Engine::GUI::Button (3, "Start Game", right - 150 - 20, 500, 150, 40)) {
|
||||||
GetModel()->SetGameState(GameStateRunning);
|
GetModel()->SetGameState(GameStateRunning);
|
||||||
}
|
}
|
||||||
|
|
|
@ -270,6 +270,18 @@ int convert_keystring (const char *key_val) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* convert_keycode (const int &keycode) {
|
||||||
|
int i = 0;
|
||||||
|
while (key_table[i].keynum != keytable_last) {
|
||||||
|
if (key_table[i].keynum == keycode)
|
||||||
|
return key_table[i].keystr;
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Commands for the ControllerBase
|
* Commands for the ControllerBase
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -13,7 +13,7 @@ class Module;
|
||||||
*
|
*
|
||||||
* See also http://sol.gfxile.net/imgui/
|
* See also http://sol.gfxile.net/imgui/
|
||||||
*/
|
*/
|
||||||
struct UIState {
|
struct IMGUIState {
|
||||||
int hotitem;
|
int hotitem;
|
||||||
int activeitem;
|
int activeitem;
|
||||||
|
|
||||||
|
@ -34,6 +34,8 @@ struct UIState {
|
||||||
|
|
||||||
/** \brief Converts a string into the corresponding keycode */
|
/** \brief Converts a string into the corresponding keycode */
|
||||||
int convert_keystring (const char *key_val);
|
int convert_keystring (const char *key_val);
|
||||||
|
/** \brief Converts a key code value to the string that describes the value */
|
||||||
|
const char* convert_keycode (const int &keycode);
|
||||||
|
|
||||||
/** \brief All input is sent here and distributed from here
|
/** \brief All input is sent here and distributed from here
|
||||||
*
|
*
|
||||||
|
@ -74,13 +76,12 @@ class ControllerBase : public Module {
|
||||||
uistate.hotitem = 0;
|
uistate.hotitem = 0;
|
||||||
}
|
}
|
||||||
void IMGUIClear () {
|
void IMGUIClear () {
|
||||||
LogMessage ("Called IMGUIClear()");
|
|
||||||
uistate.hotitem = 0;
|
uistate.hotitem = 0;
|
||||||
uistate.kbditem = 0;
|
uistate.kbditem = 0;
|
||||||
}
|
}
|
||||||
void IMGUIFinish ();
|
void IMGUIFinish ();
|
||||||
|
|
||||||
UIState uistate;
|
IMGUIState uistate;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/** \brief Initializes the system */
|
/** \brief Initializes the system */
|
||||||
|
|
|
@ -123,6 +123,9 @@ bool Button (int id, const char* caption, int x, int y, int w, int h) {
|
||||||
|
|
||||||
// Keyboard Logic
|
// Keyboard Logic
|
||||||
if (controller->uistate.kbditem == id) {
|
if (controller->uistate.kbditem == id) {
|
||||||
|
// Any unicode keys that were sent get cleared
|
||||||
|
controller->uistate.last_unicode = 0;
|
||||||
|
|
||||||
// We have to make sure, that we always clear the uistate.last_keysym
|
// We have to make sure, that we always clear the uistate.last_keysym
|
||||||
// value, otherwise the same action might be repeated over and over.
|
// value, otherwise the same action might be repeated over and over.
|
||||||
switch (controller->uistate.last_keysym) {
|
switch (controller->uistate.last_keysym) {
|
||||||
|
@ -165,32 +168,30 @@ bool LineEdit (int id, int x, int y, std::string &text_value, const int &maxleng
|
||||||
int w = maxlength * 16;
|
int w = maxlength * 16;
|
||||||
int h = 16;
|
int h = 16;
|
||||||
|
|
||||||
// LogMessage ("id = %d hotitem = %d activeitem = %d kbditem = %d", id, controller->uistate.hotitem, controller->uistate.activeitem, controller->uistate.kbditem);
|
// LogMessage ("id = %d hotitem = %d activeitem = %d kbditem = %d key = %s", id, controller->uistate.hotitem, controller->uistate.activeitem, controller->uistate.kbditem, convert_keycode (controller->uistate.last_keysym));
|
||||||
|
|
||||||
// Check for hotness
|
// Check for hotness
|
||||||
if (regionhit (x, y, w, h)) {
|
if (regionhit (x, y, w, h)) {
|
||||||
controller->uistate.hotitem = id;
|
controller->uistate.hotitem = id;
|
||||||
if (controller->uistate.activeitem == 0
|
if (controller->uistate.activeitem == 0
|
||||||
&& controller->GetButtonState(MouseButtonLeft))
|
&& controller->GetButtonState(MouseButtonLeft)) {
|
||||||
controller->uistate.activeitem = id;
|
controller->uistate.activeitem = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If nothing is selected
|
|
||||||
if (controller->uistate.hotitem != 0) {
|
|
||||||
controller->uistate.kbditem = controller->uistate.hotitem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (controller->uistate.kbditem == 0) {
|
if (controller->uistate.kbditem == 0) {
|
||||||
controller->uistate.hotitem = id;
|
controller->uistate.hotitem = id;
|
||||||
controller->uistate.kbditem = id;
|
controller->uistate.kbditem = id;
|
||||||
|
controller->uistate.last_unicode = 0;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Render
|
// Render
|
||||||
glColor3f (0.2, 0.2, 0.2);
|
glColor3f (0.2, 0.2, 0.2);
|
||||||
DrawRect2D (x + 4, y + 4, w, h);
|
DrawRect2D (x + 4, y + 4, w, h);
|
||||||
|
|
||||||
if (controller->uistate.hotitem == id
|
// If we have keyboard focus, we highlight the widget
|
||||||
|| controller->uistate.kbditem == id) {
|
if ( controller->uistate.kbditem == id) {
|
||||||
if (controller->uistate.activeitem == id) {
|
if (controller->uistate.activeitem == id) {
|
||||||
glColor3f (0.8, 0.8, 0.8);
|
glColor3f (0.8, 0.8, 0.8);
|
||||||
DrawRect2D (x, y, w, h);
|
DrawRect2D (x, y, w, h);
|
||||||
|
@ -284,10 +285,18 @@ bool LineEdit (int id, int x, int y, std::string &text_value, const int &maxleng
|
||||||
&& controller->uistate.hotitem == id
|
&& controller->uistate.hotitem == id
|
||||||
&& controller->uistate.activeitem == id) {
|
&& controller->uistate.activeitem == id) {
|
||||||
controller->uistate.kbditem = id;
|
controller->uistate.kbditem = id;
|
||||||
|
controller->uistate.last_unicode = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CheckKeyPress (int keycode) {
|
||||||
|
if (controller->uistate.last_keysym == keycode)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,10 +1,17 @@
|
||||||
|
/** \brief Header file for the IMGUI widgets
|
||||||
|
*
|
||||||
|
* \todo [med] Cyclying through widgets via tab and shift-tab
|
||||||
|
*/
|
||||||
#ifndef _IMGUICONTROLS_H
|
#ifndef _IMGUICONTROLS_H
|
||||||
#define _IMGUICONTROLS_H
|
#define _IMGUICONTROLS_H
|
||||||
|
|
||||||
|
#include <SDL/SDL.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
namespace Engine {
|
namespace Engine {
|
||||||
|
|
||||||
|
/** \brief IMGUI widgets and functions
|
||||||
|
*/
|
||||||
namespace GUI {
|
namespace GUI {
|
||||||
|
|
||||||
/** \brief Checks whether the mouse is in the given rectangle */
|
/** \brief Checks whether the mouse is in the given rectangle */
|
||||||
|
@ -24,6 +31,14 @@ bool Button (int id, const char* caption, int x, int y, int w, int h);
|
||||||
|
|
||||||
bool LineEdit (int id, int x, int y, std::string &text_value, const int &maxlength);
|
bool LineEdit (int id, int x, int y, std::string &text_value, const int &maxlength);
|
||||||
|
|
||||||
|
/** \brief Checks whether a given key was pressed
|
||||||
|
*
|
||||||
|
* This function can be used to check whether a single key (e.g. ESC) was
|
||||||
|
* pressed. This is useful when one wants to abort an action or quit from the
|
||||||
|
* main screen by pressing a single key.
|
||||||
|
*/
|
||||||
|
bool CheckKeyPress (int keycode);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -72,6 +72,7 @@
|
||||||
* todos within the code have a look at the \ref todo.
|
* todos within the code have a look at the \ref todo.
|
||||||
*
|
*
|
||||||
* \todo [high] Create a simple racing or asteroids game
|
* \todo [high] Create a simple racing or asteroids game
|
||||||
|
* \todo [high] Since introduction of the IMGUI pressing 'space' in the menu crashes the game
|
||||||
* \todo [med] Clear all references of EntityVisualState and EntityGameState
|
* \todo [med] Clear all references of EntityVisualState and EntityGameState
|
||||||
* \todo [med] Clarify functionalities of CreateEntity, KillEntity, RegisterEntity, UnregisterEntity (which frees memory, which does only change the state of the Model?)
|
* \todo [med] Clarify functionalities of CreateEntity, KillEntity, RegisterEntity, UnregisterEntity (which frees memory, which does only change the state of the Model?)
|
||||||
* \todo [med] Add basic networking
|
* \todo [med] Add basic networking
|
||||||
|
|
Loading…
Reference in New Issue