So, erstmal klatsch ich euch Code um die Ohren
.
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
void dtInputManager::poll()
{
dtMouseInput* mouse = NULL;
dtByte* keys = NULL;
dtByte mod = 0;
if (this->isInitialized() && m_keyEvents != NULL)
{
// Obtain data
keys = dtKeyboard::getInstance().process();
mouse = dtMouse::getInstance().process();
// Handle Keys
if (keys != NULL)
{
// Look for modifiers
if (keys[DTKEY_LALT] & 0x80)
{
mod = DTKEY_LALT;
}
else if (keys[DTKEY_RALT] & 0x80)
{
mod = DTKEY_RALT;
}
else if (keys[DTKEY_RSHIFT] & 0x80)
{
mod = DTKEY_RSHIFT;
}
else if (keys[DTKEY_LSHIFT] & 0x80)
{
mod = DTKEY_LSHIFT;
}
else if (keys[DTKEY_RCONTROL] & 0x80)
{
mod = DTKEY_RCONTROL;
}
else if (keys[DTKEY_LCONTROL] & 0x80)
{
mod = DTKEY_LCONTROL;
}
// Cycle Keys and fire events
for (dtUint i = 0; i<dtKeybufferSize; i++)
{
if (m_keymask[i] & 0x80 && !(keys[i] & 0x80) )
{
m_keyEvents->onKeyUp(i);
m_keymask[i] = 0;
}
if (keys[i] & 0x80)
{
m_keyEvents->onKeyDown(i, mod);
m_keymask[i] = keys[i];
}
}
}
// Handle Mouse
if (mouse != NULL)
{
// Cycle Buttons and fire events
for (dtUShort i = 0; i<dtMouseButtonBuffer; i++)
{
if(m_mousemask.mousebtn[i] & 0x80)
{
m_mousemask.mousebtn[i] = 0;
m_mouseEvents->onMouseBtnUp(i);
}
if (mouse->mousebtn[i] & 0x80)
{
m_mousemask.mousebtn[i] = mouse->mousebtn[i];
m_mouseEvents->onMouseBtnDown(i);
}
}
m_mouseEvents->onMouseMove(mouse->X, mouse->Y);
}
}
}
|
So, wie man sieht, ist das ein ziemlicher Brocken. Das ist von meinem InputManager aus meiner OpenGL-Lib. Dieser wrappt DirectInput.
Es gibt 3 Klassen:
dtMouse ------
|
---> dtInputManager
|
dtKeyboard---
Es wird quasi erst die Mouse initialisiert, dann das Keyboard, je nach Vorgabe des Programmierers auch nur einzeln.
Der User bekommt auch nicht das komplette Array übergeben, wie man sieht, sondern eben nur den gedrückten (onKeyDown) oder nicht mehr gedrückten Key (onKeyUp). Danach kopiert der Code die Maus-Position und macht das selbe Spielchen mit den Maus-Tasten.
Es geht leider nicht anders, weil CEGUI einzelne Character haben will und eben kein Array. Genauso will die Lib KeyUp und Down-Events.
Das heisst ich komm mMn nicht um diese Schleife drumrum.
Hat jemand eine Idee ob es eleganter geht? Ich hab zwar im Windowed Mode atmo ~900FPS und im Fullscreen ~1300 FPS (bei Darstellung eines rotierenden und texturierten Cubes), aber ich glaub da geht noch was
.
Ausserdem schaut mir das a bissl doof aus...
Und wenn ich dran denke, dass ich evtl. nochmal iterieren muss, weil ich noch versch. Event-Handler zulassen möchte, dann glaub ich, dass das zu langsam wird.
lg