[SDL] Bestimmten Anweisungsblock ausführen solange Taste gedrückt ist
-
Servus,
Mit folgenden Code kann ich ein Bild auf dem Bildschirm mithilfe der Pfeiltasten bewegen:
//... while (SDL_PollEvent(&event)) { if (event.type == SDL_QUIT) { quit = true; } else if (event.type == SDL_KEYDOWN) { switch (event.key.keysym.sym) { case (SDLK_ESCAPE): quit = true; break; case (SDLK_UP): { playerPosY -= pixelPerPress; clear_surface(screen); apply_surface(playerPosX, playerPosY, player, screen); SDL_Flip(screen); break; } case (SDLK_DOWN): { playerPosY += pixelPerPress; clear_surface(screen); apply_surface(playerPosX, playerPosY, player, screen); SDL_Flip(screen); break; } case (SDLK_LEFT): { playerPosX -= pixelPerPress; clear_surface(screen); apply_surface(playerPosX, playerPosY, player, screen); SDL_Flip(screen); break; } case (SDLK_RIGHT): { playerPosX += pixelPerPress; clear_surface(screen); apply_surface(playerPosX, playerPosY, player, screen); SDL_Flip(screen); break; } } } } //...Nun, will ich aber, dass sich das Bild, welches sich auf der Surface "player" befindet, solange in eine Richtung bewegen, bis ich die betreffende Taste wieder auslasse.
Ich habe es schon mit einer while-Schleife versucht:
//... while (event.key.state != SDL_RELEASED) { case (SDLK_UP): { playerPosY -= pixelPerPress; clear_surface(screen); apply_surface(playerPosX, playerPosY, player, screen); SDL_Flip(screen); break; } } //...Das Ergebnis ist jedoch, dass ich die Surface erst garnicht nach oben bewegen kann.
Auch mit 'while (event.key.type != SDL_KEYUP)' ist es das Gleiche.
Was kann ich da machen?
Danke schonmal.mfg RungAaz
-
Hallo,
ich bin zwar nicht so mit SDL vertraut, aber du könntest evtl. ein bool Array anlegen, welches dir die Zustände speichert, in etwa so:
bool keys[4];Und dann, wenn eine Taste gedrückt wurde auf true setzen:
switch (event.key.keysym.sym) { case (SDLK_UP): { keys[0] = true; break; } case (SDLK_DOWN): { keys[1] = true; break; } ....und wenn sie wieder losgelassen wird (SDL_Released?), dann auf false setzen
while (event.key.state == SDL_RELEASED) { switch (event.key.keysym.sym) { case (SDLK_UP): { keys[0] = false; break; } .... }Danach kannst du ja einfache Abfragen, ob eine Taste derzeit gedrückt wird.
ps. du kannst auch enums, anstatt der Indizes benutzen ...
-
Erstmal Danke, für die Antwort.
Ich werds gleichmal ausprobieren, ich poste dann evtl. noch obs hinhaut, für Leute die unter Umständen das gleiche Problem haben.
[EDIT]
OK, ich muss gestehen, ich habe deine Lösung nicht ausprobiert, aber ich habe eine Lösung gefunden, und zwar in folgendem Tutorial:
http://lazyfoo.net/SDL_tutorials/lesson16/index.phpmfg rungaaz