SDL - Events
-
Hallo
Ich versuche mich nun immer noch an der SDL und bin auf ein neues, für mich scheinbar unlösbares, Problem gestoßen. Ich habe eine Schleife, die immer wieder durchlaufen wird. In dieser frage ich auch Ereignisse ab, die dazu führen, dass das Spiel abgebrochen wird:
Das ist die Funktion:
void CGameState::ProcessEvents(void) { SDL_Event event; while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_KEYDOWN: switch(event.key.keysym.sym) { case SDLK_ESCAPE: m_bGameRun = false; break; default: break; } break; case SDL_QUIT: m_bGameRun = false; break; default: break; } } }Die Schleife sieht so aus:
void CGame::Run(void) { while(m_bGameRun) { SDL::Framework->Clear(); SDL::Framework->Update(); ProcessEvents(); m_Mouse.Update(); Logfile->TextOut(ConvertToString(m_Mouse.GetPosX())); m_SpriteBackground.Render(); SDL::Framework->Flip(); } }Die Funktion m_Mouse.Update sieht folgendermaßen aus:
void CMouse::Update(void) { SDL_Event event; while(SDL_PollEvent(&event)) { switch(event.type) { case SDL_MOUSEMOTION: m_PosX = event.motion.x; m_PosY = event.motion.y; break; default: break; } } }Nun kommt es aber nie zu diesem Event. Wenn ich allerdings die Funktion ProcessEvents() rausnehme, läuft alles zufriedenstellend. Ich vermute, dass alle Ereignisse in der Funktion ProcessEvents bearbeitet werden und dann keine mehr für m_Mouse.Update zur Verfügung stehen. Wie kann man den dieses Probelem lösen?
Meine zweite Frage lautet: Wie kann ich den Mauszeiger aus- und anschalten?
Vielen Dank für eure Hilfe
chrische
-
Hast du ganz richtig erkannt und was man dagegen tun kann? Ganz einfach, alle Events an einer Stelle behandeln, bzw. je nach Event eben den entsprechenden event-handler aufrufen.
-
Die ProcessEvents-Funktion "saugt" alle Events ab. Deswegen kriegt die Maus-FUnktion keine Events mehr mit. Also wie User-- schon sagte entweder Mausposition in ProcessEvents() abfragen oder SDL_PumpEvents() in update() aufrufen, um Informationen von allen Eingabegeräten abzufragen. Dann werden Mausereignisse neu erzeugt. Ist aber eher suboptimal.
Zur Anzeige des Cursors: http://www.libsdl.org/cgi/docwiki.cgi/SDL_5fShowCursor
SDL_ShowCursor(SDL_DISABLE) aufrufen.
geloescht