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

Typ

Frischling

  • »Typ« ist der Autor dieses Themas
  • Private Nachricht senden

1

31.03.2016, 19:57

C++: SDL2: Tastatureingabe ohne ruckeln

Hallo,
ich bin mir echt nicht sicher, ob ich im richtigen Unterforum bin, da mein Problem eigentlich echt überall reinpasst. Wenn ich falsch bin, bitte verschieben :)

Also, zur Frage: Wenn man ganz normal mit "SDLK_w" und so arbeitet, und dann "w" drückt, bewegt sich die Figur ja erst ein mal, dann dauert es ganz kurz und dann bewegt sie sich erst normal vorwärts. Wie wenn man ein einem Texteditor eine Taste drückt und draufbleibt.
Wie macht man es, dass sich die Figur einfach normal und ohne ruckeln am Anfang bewegt, so wie in allen Spielen halt?

Hoffe ihr habt meine Frage verstanden :D

Mfg
Typ

Edit: Zur besseren Verständlichkeit ein kurzes Beispielprogramm, so wie ich es bisher immmer mach:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
while(SDL_PollEvent(&event)){
  if(event.type == SDLK_Keydown){
    switch(event.key.keysym.sym){
      case SDLK_w:
        xPos += 5;   break;
    }
  }
}

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Typ« (31.03.2016, 20:02)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

31.03.2016, 20:36

Guck mal hier, da wird genau dein Problem behandelt. Die Lösung sieht für mich erst mal ganz gut aus. Versuch das vielleicht erst mal.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

3

01.04.2016, 00:14

Deine Bewegung basiert auf Tastaturwiederholung, sollte aber Zeitbasiert sein (pos+=speed*framezeit, am besten mal was drüber nachlesen). Schorschs Link ist schon ok. Die Tastaturabfrage musst Du aber außerhalb der Eventschleife machen (das Gedrückthalten einer Taste löst kein Event aus, nur das Drücken und das Loslassen).

Typ

Frischling

  • »Typ« ist der Autor dieses Themas
  • Private Nachricht senden

4

01.04.2016, 01:32

@dr.hallo: Ja, das weiß ich, aber wenn ich es framebasiert mache, ändert das ja erstmal nichts an meinem Problem, oder?

@Schorsch: Danke für den Link! Funktioniert das dann, wenn ich

C-/C++-Quelltext

1
if (keys[SDL_SCANCODE_A])
durch

C-/C++-Quelltext

1
while (keys[SDL_SCANCODE_A])
ersetze?

Vielen Dank für eure Hilfe :)

5

01.04.2016, 01:55

versuchs mal, dann lernst du was ne endlos schleife ist ;)

6

01.04.2016, 10:23

@Typ: Doch, das würde Dein Problem lösen. Wenn Du es unbedingt mit Tastaturwiederholung machen willst, musst Du diese auf deinem Rechner anpassen, so das es keine erste Verzögerung gibt, falls das auf deinem System geht. Auf anderen Rechnern müssten die User die selbe Einstellung machen. Das ist nicht schön.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

01.04.2016, 11:48

Ich glaube er weiß gar nicht, was Tastaturwiederholung ist. Um das mal kurz zu erklären: Wenn Du eine Taste auf der Tastatur drückst, wird *ein* Event geschickt. Das verarbeitest Du. Bleibt die Taste gedrückt, wird kurz danach wieder ein Event geschickt. Und dann wieder eins. Genau wie hier im Editor, wenn Du eine Taste drückst und gedrückt hältst. Das Problem ist nun, dass diese Events viel seltener kommen, als Dein Spiel updated. Sagen wir die Tastatur schickt das Event 5mal pro Sekunde. Dein Spiel fährt aber 60 Updates (oder mehr) pro Sekunde. Das heißt, du machst jede Menge Updates, wo gar kein Event reintrudelt. Das willst Du ganz sicher nicht. Du willst ein Flag setzen, wenn die Taste gedrückt wird, dann bei jedem Update dieses Flag prüfen und das Flag wieder entfernen, wenn die Taste losgelassen wird.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige