Macht das SFML Snake-Spiel schneller auf Tastendrücke?

8

Ich habe ein SFML C ++ - Schlangenspiel gefunden und ich habe damit herumgespielt und ein paar Dinge verändert, aber eines der Dinge, die ich nicht herausfinden kann, ist, wie man es mit dem Drücken der Pfeiltasten sanfter macht . Momentan benutzt es enum Direction {Up, Down, Left, Right}; mit

%Vor%

Es ist frustrierend, momentan zu spielen, weil ich mich nicht so präzise bewegen kann, wie ich es möchte. Gibt es eine Möglichkeit, die Steuerelemente reaktionsfähiger zu machen oder reagiert sie bereits so schnell auf Tastendrücke, wie es mit meiner Hardware möglich ist?

Ich bin ein absoluter Anfänger für OOP und SFML, also habe ich ein paar Probleme damit, die Uhr zu verstehen und auch Schlangenspiele in anderen Sprachen zu betrachten, um es zu übersetzen. Ich kann den gesamten Code bei Bedarf veröffentlichen.

Also ich weiß, es ist nicht schön, aber hier ist der gesamte Code:

%Vor%     
Austin 31.07.2015, 04:32
quelle

3 Antworten

4

Also habe ich die Steuerelemente aus der Timing-Schleife entfernt, aber stattdessen eine zweite Bewegungsvariable gesteuert. Die ursprüngliche Bewegung wird dann auf die zweite Bewegungsvariable innerhalb der Zeitschleife eingestellt. Dadurch wurde der Fehler beseitigt und eine gute Reaktionsfähigkeit beibehalten.

    
Austin 04.08.2015, 23:05
quelle
6

Wenn ich richtig gelesen habe, sind Ihre Ziele:

  

Gibt es eine Möglichkeit, die Steuerelemente reaktionsfähiger zu machen?

     

Zum Beispiel ist es sehr schwierig, eine enge Kehrtwendung (wo kein zusätzlicher Platz benötigt wird) konsistent zu machen.

(1) Folgendes: (Fügen Sie eine Aktualisierungsfunktion ein, die jeden Frame aufgerufen wird)

%Vor%

implementiert reibungslose Bewegung hat hier angezeigt. Hier ist auch ein kleiner Artikel , der einige interessante Einblicke in "Event- Überprüfen "vs" isKeyPressed () ".

(2) Wenn das nicht funktioniert, dann könnte es möglicherweise etwas mit:

%Vor%

Wenn "inputClock" Ihre Fähigkeit, sich wieder zu bewegen, verzögert, könnte jede Barriere (selbst die kleine Schrittweite von 0,07) zu einer unerwünschten Ausgabe führen.

Stellen Sie andernfalls mehr Code zur Verfügung, damit ich es selbst testen kann, oder lassen Sie mich wissen, was Sie von meinen Vorschlägen erhalten.

    
Donald 03.08.2015 00:00
quelle
2

Sie haben zwei Fehler in Ihrem Code, die ich in Ihrem ursprünglichen Beispielcode sehen kann:

  1. Sie achten nicht darauf, ob das Ereignis ein KeyPressed- oder KeyReleased-Ereignis ist, wenn Sie entscheiden, wie Sie sich bewegen sollen.
  2. Sie verwenden dann einen Timer, um dies zu umgehen, indem Sie andere Ereignisse für eine bestimmte Zeit ignorieren, nachdem eine Bewegungstaste gedrückt wurde.

Sie müssen nur auf die KeyPressed-Ereignisse reagieren und dann die Timing-Logik vollständig entfernen.

Wenn ich mir die restlichen Spuren ansehe, glaube ich nicht, dass beide Bugs sofort behoben wurden ...

Das Entfernen der Timing-Logik (wie in den Kommentaren beschrieben) würde zu einem scheinbar bizarren Verhalten führen, bei dem das Loslassen der Bewegungstasten die Richtung Ihrer Schlange ändern könnte, abhängig von der Reihenfolge Ihrer Mehrfach-Tastendrücke.

Das Überprüfen von isKeyPressed (gemäß @ Donalds Antwort) löst stattdessen das Problem der Presse \ Veröffentlichung, aber Sie müssen auch entscheiden, was zu tun ist, wenn mehrere gleichzeitig gedrückt werden. Dies wird wahrscheinlich Ihren Code übermäßig komplizieren, wenn die Ereignisse das für Sie auflösen, indem Sie eine chronologische Reihenfolge dessen zurückgeben, was gedrückt wurde.

Ihr aktuelles vollständiges Programm scheint das KeyPressed-Problem behoben zu haben, aber den Timer nicht entfernt. Dies verhindert, dass die Tasten so schnell reagieren, wie Sie benötigen.

    
Peter Brittain 04.08.2015 22:59
quelle

Tags und Links