Steuerung mit SDL "abgehackt"



  • Ich verwende einen eigenen, event basierten OOP-Layer über SDL mit OpenGL.
    Dazu verwende ich u.a. libsigc++.
    Das hier ist meine, verkürtzte, Event-Loop:

    while (true)
        {
            /************************************************************************/
            /* Input                                                                */
            /************************************************************************/
            SDL_Event evt;
            while (SDL_PollEvent(&evt))
            {         
                switch (evt.type)
                {
                    case SDL_KEYDOWN:
                    {					
    		    m_keyDownEvent(evt.key.keysym.sym);
                        break;
                    }
                    case SDL_KEYUP:
                    {
    		   m_keyUpEvent(evt.key.keysym.sym);
                        break;
                    }
                    case SDL_MOUSEBUTTONDOWN:
                    case SDL_MOUSEBUTTONUP:
                    {
                        mouseBState = (evt.button.state == SDL_PRESSED);
                        u8 key = evt.button.button;
                        m_keyEvent(key, mouseBState);
                        break;
                    }
                    case SDL_MOUSEMOTION:
                    {
                        u8 key = evt.button.button;
                        m_mousepos = NLVector2i((u32)evt.motion.x, (u32)evt.motion.y);
                        m_mouseEvent(evt.motion.x, evt.motion.y, key, mouseBState);
                        break;
                    }
                    case SDL_QUIT:
                    {
                        bool quit = false;
                        if (m_quitEvent.size() == 0)
                        {
                            quit = true;
                        }
                        else
                            quit = m_quitEvent.emit();
                        if ( quit )
                        {
                            SDL_Quit();
                            return;
                        }
                        break;
                    }
                }
            }       
        }
    

    Ich verwende SDL_EnableKeyRepeat um als Beispiel eine flüssige Bewegung hinzubekommen.
    Jetzt habe ich halt das Problem, dass wenn ich als Beispiel geradeaus laufe und dann eine andere Taste gleichzeitig drücke, dass dann die Spielfigur anhält. Oder rechts und nach oben nicht gleichzeitig möglich ist.



  • Hi,

    Also ich nutze für die Tastatureingaben SDL_GetKeyState(null). Man benutzt es außerhalb der Poll-Schleife und das liefert einfach ein Array aller besetzten Tasten zurück (byte mit 1 = true, 0 = false) und damit habe ich eigentlich sowohl flüssige als auch Mehrtasten-Abfragen. Vielleicht ist das was für Dich.



  • Warum machst du dir nicht eine einfache Input-Klasse. Diese speichert nichts weiteres als ein Array aus bools. Je nachdem welches Event kommt speicherst du die Änderung dort ab. Und voila kannst du es überall wo du willst abrufen und prüfen ob zwei Tasten gleichzeitig gedrückt sind. Einfach und unkompliziert. Über alternativen innerhalb der SDL kenne ich mich nicht aus.


Anmelden zum Antworten