3 Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #ifndef __INPUT_HANDLER_H__
21 #define __INPUT_HANDLER_H__
23 #include "irrlichttypes_extrabloated.h"
25 class MyEventReceiver : public IEventReceiver
28 // This is the one method that we have to implement
29 virtual bool OnEvent(const SEvent& event)
32 React to nothing here if a menu is active
34 if (noMenuActive() == false) {
35 #ifdef HAVE_TOUCHSCREENGUI
36 if (m_touchscreengui != 0) {
37 m_touchscreengui->Toggle(false);
40 return g_menumgr.preprocessEvent(event);
43 // Remember whether each key is down or up
44 if (event.EventType == irr::EET_KEY_INPUT_EVENT) {
45 if (event.KeyInput.PressedDown) {
46 keyIsDown.set(event.KeyInput);
47 keyWasDown.set(event.KeyInput);
49 keyIsDown.unset(event.KeyInput);
53 #ifdef HAVE_TOUCHSCREENGUI
54 // case of touchscreengui we have to handle different events
55 if ((m_touchscreengui != 0) &&
56 (event.EventType == irr::EET_TOUCH_INPUT_EVENT)) {
57 m_touchscreengui->translateEvent(event);
61 // handle mouse events
62 if (event.EventType == irr::EET_MOUSE_INPUT_EVENT) {
63 if (noMenuActive() == false) {
65 middle_active = false;
68 left_active = event.MouseInput.isLeftPressed();
69 middle_active = event.MouseInput.isMiddlePressed();
70 right_active = event.MouseInput.isRightPressed();
72 if (event.MouseInput.Event == EMIE_LMOUSE_PRESSED_DOWN) {
75 if (event.MouseInput.Event == EMIE_RMOUSE_PRESSED_DOWN) {
78 if (event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP) {
81 if (event.MouseInput.Event == EMIE_RMOUSE_LEFT_UP) {
84 if (event.MouseInput.Event == EMIE_MOUSE_WHEEL) {
85 mouse_wheel += event.MouseInput.Wheel;
88 } else if (event.EventType == irr::EET_LOG_TEXT_EVENT) {
89 static const enum LogMessageLevel irr_loglev_conv[] = {
90 LMT_VERBOSE, // ELL_DEBUG
91 LMT_INFO, // ELL_INFORMATION
92 LMT_ACTION, // ELL_WARNING
93 LMT_ERROR, // ELL_ERROR
94 LMT_ERROR, // ELL_NONE
96 assert(event.LogEvent.Level < sizeof(irr_loglev_conv));
97 log_printline(irr_loglev_conv[event.LogEvent.Level],
98 std::string("Irrlicht: ")
99 + (const char*) event.LogEvent.Text);
102 /* always return false in order to continue processing events */
106 bool IsKeyDown(const KeyPress &keyCode) const
108 return keyIsDown[keyCode];
111 // Checks whether a key was down and resets the state
112 bool WasKeyDown(const KeyPress &keyCode)
114 bool b = keyWasDown[keyCode];
116 keyWasDown.unset(keyCode);
133 rightclicked = false;
134 leftreleased = false;
135 rightreleased = false;
138 middle_active = false;
139 right_active = false;
147 #ifdef HAVE_TOUCHSCREENGUI
148 m_touchscreengui = NULL;
163 #ifdef HAVE_TOUCHSCREENGUI
164 TouchScreenGUI* m_touchscreengui;
168 // The current state of keys
170 // Whether a key has been pressed or not
176 Separated input handler
179 class RealInputHandler : public InputHandler
182 RealInputHandler(IrrlichtDevice *device, MyEventReceiver *receiver):
184 m_receiver(receiver),
188 virtual bool isKeyDown(const KeyPress &keyCode)
190 return m_receiver->IsKeyDown(keyCode);
192 virtual bool wasKeyDown(const KeyPress &keyCode)
194 return m_receiver->WasKeyDown(keyCode);
196 virtual v2s32 getMousePos()
198 if (m_device->getCursorControl()) {
199 return m_device->getCursorControl()->getPosition();
205 virtual void setMousePos(s32 x, s32 y)
207 if (m_device->getCursorControl()) {
208 m_device->getCursorControl()->setPosition(x, y);
211 m_mousepos = v2s32(x,y);
215 virtual bool getLeftState()
217 return m_receiver->left_active;
219 virtual bool getRightState()
221 return m_receiver->right_active;
224 virtual bool getLeftClicked()
226 return m_receiver->leftclicked;
228 virtual bool getRightClicked()
230 return m_receiver->rightclicked;
232 virtual void resetLeftClicked()
234 m_receiver->leftclicked = false;
236 virtual void resetRightClicked()
238 m_receiver->rightclicked = false;
241 virtual bool getLeftReleased()
243 return m_receiver->leftreleased;
245 virtual bool getRightReleased()
247 return m_receiver->rightreleased;
249 virtual void resetLeftReleased()
251 m_receiver->leftreleased = false;
253 virtual void resetRightReleased()
255 m_receiver->rightreleased = false;
258 virtual s32 getMouseWheel()
260 return m_receiver->getMouseWheel();
265 m_receiver->clearInput();
268 IrrlichtDevice *m_device;
269 MyEventReceiver *m_receiver;
273 class RandomInputHandler : public InputHandler
281 rightclicked = false;
282 leftreleased = false;
283 rightreleased = false;
286 virtual bool isKeyDown(const KeyPress &keyCode)
288 return keydown[keyCode];
290 virtual bool wasKeyDown(const KeyPress &keyCode)
294 virtual v2s32 getMousePos()
298 virtual void setMousePos(s32 x, s32 y)
300 mousepos = v2s32(x, y);
303 virtual bool getLeftState()
307 virtual bool getRightState()
312 virtual bool getLeftClicked()
316 virtual bool getRightClicked()
320 virtual void resetLeftClicked()
324 virtual void resetRightClicked()
326 rightclicked = false;
329 virtual bool getLeftReleased()
333 virtual bool getRightReleased()
335 return rightreleased;
337 virtual void resetLeftReleased()
339 leftreleased = false;
341 virtual void resetRightReleased()
343 rightreleased = false;
346 virtual s32 getMouseWheel()
351 virtual void step(float dtime)
354 static float counter1 = 0;
356 if (counter1 < 0.0) {
357 counter1 = 0.1 * Rand(1, 40);
358 keydown.toggle(getKeySetting("keymap_jump"));
362 static float counter1 = 0;
364 if (counter1 < 0.0) {
365 counter1 = 0.1 * Rand(1, 40);
366 keydown.toggle(getKeySetting("keymap_special1"));
370 static float counter1 = 0;
372 if (counter1 < 0.0) {
373 counter1 = 0.1 * Rand(1, 40);
374 keydown.toggle(getKeySetting("keymap_forward"));
378 static float counter1 = 0;
380 if (counter1 < 0.0) {
381 counter1 = 0.1 * Rand(1, 40);
382 keydown.toggle(getKeySetting("keymap_left"));
386 static float counter1 = 0;
388 if (counter1 < 0.0) {
389 counter1 = 0.1 * Rand(1, 20);
390 mousespeed = v2s32(Rand(-20, 20), Rand(-15, 20));
394 static float counter1 = 0;
396 if (counter1 < 0.0) {
397 counter1 = 0.1 * Rand(1, 30);
398 leftdown = !leftdown;
406 static float counter1 = 0;
408 if (counter1 < 0.0) {
409 counter1 = 0.1 * Rand(1, 15);
410 rightdown = !rightdown;
414 rightreleased = true;
417 mousepos += mousespeed;
420 s32 Rand(s32 min, s32 max)
422 return (myrand()%(max-min+1))+min;