diff options
author | Stijn Buys <ingar@osirion.org> | 2008-07-22 21:17:15 +0000 |
---|---|---|
committer | Stijn Buys <ingar@osirion.org> | 2008-07-22 21:17:15 +0000 |
commit | 540b500f2176966ebfb7f21ebd2c17ddfdcd34e6 (patch) | |
tree | e31bbf0046237b5134002f51d48c1b3f5b752f4f | |
parent | 9adc3720cd8fe2ba843d014dbbfe81bf936f9715 (diff) |
keyboard key repeat
-rw-r--r-- | doc/TODO | 9 | ||||
-rw-r--r-- | osirion.kdevelop | 16 | ||||
-rw-r--r-- | src/client/input.cc | 56 | ||||
-rw-r--r-- | src/client/key.cc | 1 | ||||
-rw-r--r-- | src/client/key.h | 5 | ||||
-rw-r--r-- | src/client/keyboard.cc | 9 | ||||
-rw-r--r-- | src/client/keyboard.h | 7 |
7 files changed, 85 insertions, 18 deletions
@@ -77,9 +77,9 @@ client: input handler switching (ok) key binds (ok) better crosshair bitmaps (ok) - - modifier key binds - keyboard repeat + keyboard repeat (ok) + + shift/ctrl/alt modifier key binds render: render pipeline (ok) @@ -88,7 +88,8 @@ render: texture registry (ok) add small camera light (ok) - text quads render pipe? (see model quads) + text quads render pipe? (see model quads) + - text can't be a in quadpipe -> gui layers test/fix? lighting without sun in world.ini sun light strenght diff --git a/osirion.kdevelop b/osirion.kdevelop index 58a8bfc..c31777e 100644 --- a/osirion.kdevelop +++ b/osirion.kdevelop @@ -16,7 +16,7 @@ <projectdirectory>./</projectdirectory> <absoluteprojectpath>false</absoluteprojectpath> <description>The OSiRiON Project is an SDL+OpenGL space game.</description> - <defaultencoding/> + <defaultencoding></defaultencoding> <versioncontrol>kdevsubversion</versioncontrol> </general> <kdevautoproject> @@ -140,7 +140,7 @@ <projectdoc> <docsystem>Doxygen documentatieverzameling</docsystem> <docurl>osirion.tag</docurl> - <usermanualurl/> + <usermanualurl></usermanualurl> </projectdoc> </kdevdocumentation> <substmap> @@ -196,7 +196,7 @@ <designerpluginpaths/> </qt> <creategettersetter> - <prefixGet/> + <prefixGet></prefixGet> <prefixSet>set</prefixSet> <prefixVariable>m_,_</prefixVariable> <parameterName>theValue</parameterName> @@ -228,11 +228,11 @@ </cppsupportpart> <kdevdebugger> <general> - <gdbpath/> - <dbgshell/> - <configGdbScript/> - <runShellScript/> - <runGdbScript/> + <gdbpath></gdbpath> + <dbgshell></dbgshell> + <configGdbScript></configGdbScript> + <runShellScript></runShellScript> + <runGdbScript></runGdbScript> <breakonloadinglibs>true</breakonloadinglibs> <separatetty>false</separatetty> <floatingtoolbar>false</floatingtoolbar> diff --git a/src/client/input.cc b/src/client/input.cc index f8d76f2..819ce27 100644 --- a/src/client/input.cc +++ b/src/client/input.cc @@ -23,6 +23,8 @@ namespace client { core::Cvar *input_mousecontrol = 0; +core::Cvar *input_keydelay = 0; +core::Cvar *input_keyrepeat = 0; namespace input { @@ -204,9 +206,15 @@ void init() SDL_WM_GrabInput(SDL_GRAB_ON); // SDL_EnableUNICODE(1); - input_mousecontrol = core::Cvar::get("input_mousecontrol", "1", core::Cvar::Archive); + input_mousecontrol = core::Cvar::get("input_mousecontrol", 1.0f, core::Cvar::Archive); input_mousecontrol->set_info("[bool] enable or disable mouse control"); + input_keydelay = core::Cvar::get("input_keydelay", 250.0f, core::Cvar::Archive); + input_keydelay->set_info("[int] keyboard delay time-out in milliseconds"); + + input_keyrepeat = core::Cvar::get("input_keyrepeat", 30.0f, core::Cvar::Archive); + input_keyrepeat->set_info("[int] keyboard repeat time-out in milliseconds"); + core::Func *func = 0; func = core::Func::add("ui_console", func_ui_console); @@ -270,7 +278,7 @@ void shutdown() SDL_ShowCursor(SDL_ENABLE); SDL_WM_GrabInput(SDL_GRAB_OFF); -// SDL_EnableUNICODE(0); +// SDL_DisableUNICODE(0); } @@ -447,6 +455,7 @@ void key_released(Key *key) void frame(float seconds) { + /* -- detect localcontrol() changes --------------- */ if (core::localcontrol() && (last_control != core::localcontrol()->id())) { local_direction = 0.0f; @@ -464,6 +473,7 @@ void frame(float seconds) render::reset(); } + /* -- poll SDL keyboard events -------------------- */ SDL_Event event; Key *key = 0; bool pressed = false; @@ -515,10 +525,50 @@ void frame(float seconds) key_released(key); } } + + /* -- handle key repeat --------------------------- */ + float delay = 250.0f; // key delay time-out in milliseconds + if (input_keydelay) { + delay = input_keydelay->value(); + math::clamp(delay, 50.0f, 500.0f); + } + + float repeat = 30.0f; // key repeat time-out in milliseconds + if (input_keyrepeat) { + repeat = input_keyrepeat->value(); + math::clamp(repeat, 10.0f, 250.0f); + } + + if (repeat > delay) { + float tmp = repeat; + repeat = delay; + delay = tmp; + } + if (input_keydelay) + (*input_keydelay) = delay; + if (input_keyrepeat) + (*input_keyrepeat) = repeat; + repeat /= 1000.0f; + delay /= 1000.0f; + + for (Keyboard::iterator it = keyboard->begin(); it != keyboard->end(); it++) { + key = (*it).second; + if (key && key->sym() < 512 && key->pressed()) { + while ((key->pressed()+delay < core::application()->time()) && (key->lastpressed()+repeat < core::application()->time())) { + if (key->lastpressed() > key->pressed()) + key->lastpressed() += repeat; + else + key->lastpressed() += delay; + key_pressed(key); + } + } + } + + /* -- process mouse movement ----------------------*/ mouse_control = false; mouse_deadzone = false; - + key->lastpressed() += repeat; if (core::application()->connected() && core::localcontrol()) { mouse_control = !console()->visible() && ((input_mousecontrol->value() > 0) || mouse_control_override); diff --git a/src/client/key.cc b/src/client/key.cc index 27ed22a..27d280f 100644 --- a/src/client/key.cc +++ b/src/client/key.cc @@ -14,6 +14,7 @@ Key::Key(const char *name, int keysym, char ascii, const char *bind) key_sym = keysym; key_ascii = ascii; key_pressed = 0; + key_lastpressed = 0; key_name.assign(name); diff --git a/src/client/key.h b/src/client/key.h index 6f190c0..d1a8e96 100644 --- a/src/client/key.h +++ b/src/client/key.h @@ -40,8 +40,12 @@ public: /// return the bind for a specific modifier std::string const & bind(Modifier mod) const; + /// first time the key was pressed since previous release inline float & pressed() { return key_pressed; } + /// last time the key was pressed + inline float & lastpressed() { return key_lastpressed; } + inline std::string const & name() const { return key_name; } inline char ascii() const { return key_ascii; } @@ -54,6 +58,7 @@ private: char key_ascii; float key_pressed; + float key_lastpressed; std::string key_bind; std::string key_bind_shift; diff --git a/src/client/keyboard.cc b/src/client/keyboard.cc index 410e76c..10d98ea 100644 --- a/src/client/keyboard.cc +++ b/src/client/keyboard.cc @@ -214,7 +214,7 @@ Keyboard::~Keyboard() { // clear key map for (iterator it = begin(); it != end(); it++) - delete(*it).second; + delete (*it).second; keys.clear(); // clear action list @@ -284,6 +284,7 @@ Key * Keyboard::release(unsigned int sym) } key->pressed() = 0; + key->lastpressed() = 0; return key; } @@ -294,8 +295,14 @@ Key * Keyboard::press(unsigned int sym) return 0; } + return press(key); +} + +Key * Keyboard::press(Key *key) +{ if (!key->pressed()) key->pressed() = core::application()->time(); + key->lastpressed() = core::application()->time(); return key; } diff --git a/src/client/keyboard.h b/src/client/keyboard.h index 9712009..e4995e6 100644 --- a/src/client/keyboard.h +++ b/src/client/keyboard.h @@ -61,15 +61,18 @@ public: Key *press(unsigned int sym); /// a key has been pressed + Key *press(Key *key); + + /// a key has been pressed Key *release(unsigned int sym); -private: typedef std::map<unsigned int, Key *>::iterator iterator; - + inline iterator begin() { return keys.begin(); } inline iterator end() { return keys.end(); } +private: void add_key(const char *name, const unsigned int keysym, const char ascii=0, const char *bind=0); void add_action(const char *name, Action::Identifier action, const char *info = 0); |