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 LogLevel irr_loglev_conv
[] = {
90 LL_VERBOSE
, // ELL_DEBUG
91 LL_INFO
, // ELL_INFORMATION
92 LL_WARNING
, // ELL_WARNING
93 LL_ERROR
, // ELL_ERROR
96 assert(event
.LogEvent
.Level
< ARRLEN(irr_loglev_conv
));
97 g_logger
.log(irr_loglev_conv
[event
.LogEvent
.Level
],
98 std::string("Irrlicht: ") + (const char*) event
.LogEvent
.Text
);
101 /* always return false in order to continue processing events */
105 bool IsKeyDown(const KeyPress
&keyCode
) const
107 return keyIsDown
[keyCode
];
110 // Checks whether a key was down and resets the state
111 bool WasKeyDown(const KeyPress
&keyCode
)
113 bool b
= keyWasDown
[keyCode
];
115 keyWasDown
.unset(keyCode
);
132 rightclicked
= false;
133 leftreleased
= false;
134 rightreleased
= false;
137 middle_active
= false;
138 right_active
= false;
146 #ifdef HAVE_TOUCHSCREENGUI
147 m_touchscreengui
= NULL
;
162 #ifdef HAVE_TOUCHSCREENGUI
163 TouchScreenGUI
* m_touchscreengui
;
167 // The current state of keys
169 // Whether a key has been pressed or not
175 Separated input handler
178 class RealInputHandler
: public InputHandler
181 RealInputHandler(IrrlichtDevice
*device
, MyEventReceiver
*receiver
):
183 m_receiver(receiver
),
187 virtual bool isKeyDown(const KeyPress
&keyCode
)
189 return m_receiver
->IsKeyDown(keyCode
);
191 virtual bool wasKeyDown(const KeyPress
&keyCode
)
193 return m_receiver
->WasKeyDown(keyCode
);
195 virtual v2s32
getMousePos()
197 if (m_device
->getCursorControl()) {
198 return m_device
->getCursorControl()->getPosition();
204 virtual void setMousePos(s32 x
, s32 y
)
206 if (m_device
->getCursorControl()) {
207 m_device
->getCursorControl()->setPosition(x
, y
);
210 m_mousepos
= v2s32(x
,y
);
214 virtual bool getLeftState()
216 return m_receiver
->left_active
;
218 virtual bool getRightState()
220 return m_receiver
->right_active
;
223 virtual bool getLeftClicked()
225 return m_receiver
->leftclicked
;
227 virtual bool getRightClicked()
229 return m_receiver
->rightclicked
;
231 virtual void resetLeftClicked()
233 m_receiver
->leftclicked
= false;
235 virtual void resetRightClicked()
237 m_receiver
->rightclicked
= false;
240 virtual bool getLeftReleased()
242 return m_receiver
->leftreleased
;
244 virtual bool getRightReleased()
246 return m_receiver
->rightreleased
;
248 virtual void resetLeftReleased()
250 m_receiver
->leftreleased
= false;
252 virtual void resetRightReleased()
254 m_receiver
->rightreleased
= false;
257 virtual s32
getMouseWheel()
259 return m_receiver
->getMouseWheel();
264 m_receiver
->clearInput();
267 IrrlichtDevice
*m_device
;
268 MyEventReceiver
*m_receiver
;
272 class RandomInputHandler
: public InputHandler
280 rightclicked
= false;
281 leftreleased
= false;
282 rightreleased
= false;
285 virtual bool isKeyDown(const KeyPress
&keyCode
)
287 return keydown
[keyCode
];
289 virtual bool wasKeyDown(const KeyPress
&keyCode
)
293 virtual v2s32
getMousePos()
297 virtual void setMousePos(s32 x
, s32 y
)
299 mousepos
= v2s32(x
, y
);
302 virtual bool getLeftState()
306 virtual bool getRightState()
311 virtual bool getLeftClicked()
315 virtual bool getRightClicked()
319 virtual void resetLeftClicked()
323 virtual void resetRightClicked()
325 rightclicked
= false;
328 virtual bool getLeftReleased()
332 virtual bool getRightReleased()
334 return rightreleased
;
336 virtual void resetLeftReleased()
338 leftreleased
= false;
340 virtual void resetRightReleased()
342 rightreleased
= false;
345 virtual s32
getMouseWheel()
350 virtual void step(float dtime
)
353 static float counter1
= 0;
355 if (counter1
< 0.0) {
356 counter1
= 0.1 * Rand(1, 40);
357 keydown
.toggle(getKeySetting("keymap_jump"));
361 static float counter1
= 0;
363 if (counter1
< 0.0) {
364 counter1
= 0.1 * Rand(1, 40);
365 keydown
.toggle(getKeySetting("keymap_special1"));
369 static float counter1
= 0;
371 if (counter1
< 0.0) {
372 counter1
= 0.1 * Rand(1, 40);
373 keydown
.toggle(getKeySetting("keymap_forward"));
377 static float counter1
= 0;
379 if (counter1
< 0.0) {
380 counter1
= 0.1 * Rand(1, 40);
381 keydown
.toggle(getKeySetting("keymap_left"));
385 static float counter1
= 0;
387 if (counter1
< 0.0) {
388 counter1
= 0.1 * Rand(1, 20);
389 mousespeed
= v2s32(Rand(-20, 20), Rand(-15, 20));
393 static float counter1
= 0;
395 if (counter1
< 0.0) {
396 counter1
= 0.1 * Rand(1, 30);
397 leftdown
= !leftdown
;
405 static float counter1
= 0;
407 if (counter1
< 0.0) {
408 counter1
= 0.1 * Rand(1, 15);
409 rightdown
= !rightdown
;
413 rightreleased
= true;
416 mousepos
+= mousespeed
;
419 s32
Rand(s32 min
, s32 max
)
421 return (myrand()%(max
-min
+1))+min
;