Fehler in SDL-Tastaturauslesung
-
Hi,
ich hatte mit SDL ein kleines Spiel nicht objekt-orientiert geschrieben, dessen Steuerung funktionierte. Das Spiel war nicht ganz fertig, als ich anfing es objekt-orientiert neu zu schreiben. Ich habe die Befehle der Steuerung im Grunde direkt übernommen, jedoch hat das Spiel nun, wo ich es das erste Mal wieder soweit habe, dass ich eine grafische Ausgabe hat, abgesehen von dutzenden schweren Fehlern keinerlei Steuerung. Hier die entsprechenden Teile:Die Funktion für die Steuerung:
void Game::Spieler::SpielerSteuerung(bool& laeuft, const int& SpielfeldX, const int& SpielfeldversatzY, const int& SpielfeldY) { //Eingabenauslesung Uint8 *keys; keys = SDL_GetKeyState(NULL); bool tastegedrueckt = false; //Hierhin kommt es noch if (keys[SDLK_UP] || keys[SDLK_w]) {printf ("Pfeil hoch gedrückt"); dSpeedY = 1; tastegedrueckt = true; } if (keys[SDLK_DOWN] || keys[SDLK_s]) {printf ("Pfeil runter gedrückt"); dSpeedY = -1; tastegedrueckt = true; } if (keys[SDLK_ESCAPE]) {printf ("Escape gedrückt"); laeuft = false; } ...ab hier irrelevant }
Der Aufruf:
while(laeuft) { Aktuelle = SDL_GetTicks(); Zeitspanne = (Aktuelle - Letzte) / 3.0 * Geschwindigkeit; Letzte = Aktuelle; //Steuerung des Spielers1 if (Spieler1.GetAILevel() == 0) { Spieler1.SpielerSteuerung(laeuft, SpielfeldX, SpielfeldversatzY, SpielfeldY); } else { Spieler1.BotSteuerung(laeuft, SpielfeldversatzX, SpielfeldX, SpielfeldversatzY, SpielfeldY, Ball); } Spieler1.Abdecken(screen); Spieler1.PositionBerechnen(Geschwindigkeit, Zeitspanne); Spieler1.Darstellen(screen); //Steuerung des Spielers2 if (Spieler2.GetAILevel() == 0) {//printf ("Spieler 2 isn Mensch. "); Spieler2.SpielerSteuerung(laeuft, SpielfeldX, SpielfeldversatzY, SpielfeldY); } else { Spieler2.BotSteuerung(laeuft, SpielfeldversatzX, SpielfeldX, SpielfeldversatzY, SpielfeldY, Ball); } Spieler2.Abdecken(screen); Spieler2.PositionBerechnen(Geschwindigkeit, Zeitspanne); Spieler2.Darstellen(screen);
Die Ausgaben in der Funktion werden nie aufgerufen. Dort wo nun der Kommentar steht, dass es soweit kommt, stand vorher eine Ausgabe, diese wurde noch ausgegeben. Wenn jemand den Fehler wo anders vermutet etc. sagt nur, falls ihr noch was anderes gepostet haben wollt.
-
Hi,
Der Keystate muss bei jedem Durchlauf ueberhaupt erstmal per zB SDL_PumpEvents() gesetzt werden, sonst aendert sich an dem Statearray nichts.
Fuege also vor dem GetKeyState(NULL); eine Zeile mit SDL_PumpEvents(); ein.
-
Danke, wenigstens eine Sache die jetzt problemlos geht^^. Wenn man das Programm jederzeit beenden kann, geht die weitere Fehlersuche schonmal schneller.