Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Nico

Frischling

  • »Nico« ist der Autor dieses Themas

Beiträge: 82

Wohnort: Nürnberg

  • Private Nachricht senden

1

23.11.2007, 16:50

DInput Wrapper, Problem mit der Tastensuche.

So, erstmal klatsch ich euch Code um die Ohren :D.

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 :D.
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