LWJGL Update Schleife (Snake)

JUserToto

Aktives Mitglied
Hallo zusammen,

testweise schreibe ich gerade eine sehr einfache Version von Snake - nur um die grundlegenden Dinge zu begreifen.
Tutorials habe ich mir einige angesehen. Das Problem was ich im Moment habe ist folgendes: Da die Schlange sich ja nicht zu schnell bewegen soll, muss ich den Thread in der Update Schleife schlafen legen. Gleichzeitig muss ich ja aber trotzdem alle Tastatur eingaben abfangen. Gerade weil bei Snake kein einziger Tastendruck ignoriert werden darf.

Die Schleife sieht nun bei mir so aus:

Java:
    while (!Display.isCloseRequested()) {
      checkKeyboard(); /*Tastatureingaben werden verarbeitet */
      bewegeSchlange(); /* Schlange wird um die aktuelle Richtung fortbewegt */
			this.render(); /* Alles wird gezeichnet */
      try {
        Thread.sleep(120); /* Thread wird schlafen gelegt */
      } catch (InterruptedException inte) {
        inte.printStackTrace();
      }
      Display.update(); /* Display wird geupdated */
}

Die checkKeyboard sieht so aus:

Java:
public void checkKeyboard() {
    if (Keyboard.isCreated()) {
      while (Keyboard.next()) {
        int k = Keyboard.getEventKey();
        if (direction != RECHTS &&
                k == Keyboard.KEY_RIGHT && direction != LINKS) {
          direction = RECHTS;
        } else if (direction != LINKS &&
                 k == Keyboard.KEY_LEFT && direction != RECHTS) {
          direction = LINKS;
        } else if (direction != OBEN
                &&  k == Keyboard.KEY_UP && direction != UNTEN) {
          direction = OBEN;

        } else if (direction != UNTEN
                &&  k == Keyboard.KEY_DOWN && direction != OBEN) {
          direction = UNTEN;
        } else if (k == (Keyboard.KEY_ESCAPE)) {
          init();
        }
      }
    }
  }

Die Steuerung funktioniert zwar, ist aber so ungenau, dass man sich kaum traut dem Bildschirmrand näher zu kommen... woran könnte das liegen?

lg Toto
 

Ruzmanz

Top Contributor
Java:
    if (Keyboard.isCreated()) {

Die Abfrage ist relativ unnötig, da man ohne Tastatur in Snake sowieso verloren hat.

Java:
int k = Keyboard.getEventKey();

Sofern dein Compiler den Code nicht optimiert, wird bei jedem Schleifendurchlauf im Speicher ein Platz für den Integer reserviert und wieder freigegeben. Das "int k" sollte vor der Schleife stehen, so muss dieser nur einmal reserviert / freigegeben werden.

Java:
direction != RECHTS

Verbraucht mMn mehr Zeit, als wenn du den Wert einfach nochmal überschreiben würdest:

Java:
        if (k == Keyboard.KEY_RIGHT && direction != LINKS) {
          direction = RECHTS;
        } else if (k == Keyboard.KEY_LEFT && direction != RECHTS) {
          direction = LINKS;
        } else if (k == Keyboard.KEY_UP && direction != UNTEN) {
          direction = OBEN;
        } else if (k == Keyboard.KEY_DOWN && direction != OBEN) {
          direction = UNTEN;
        } else if (k == Keyboard.KEY_ESCAPE) {
          init();
        }

Deine Schlafzeit scheint mir ziemlich lange zu dauern. Sofern dein Spiel optimal läuft, wären das max. 8 Bilder pro Sekunde.

Java:
Thread.sleep(120); /* Thread wird schlafen gelegt */
 

JUserToto

Aktives Mitglied
Hallo,

danke für die Antwort.
Die Sleep Zeit von 120ms bedeutet, dass die Schlange sich in einer Sekunde 8 Felder weiter bewegt. Das ist schon verdammt schnell.
Gleichzeitig ist das aber auch genau das Problem: Da mit dem Display.update() auch die Tastatureingaben gepollt werden, ist die Verzögerung zwischen Tastatureingabe und Bewegung der Schlange im schlimmsten Fall wirklich 120ms. Und genau da liegt ja mein Problem: Ich habe keine Ahnung, wie man das anders lösen sollte. Wenn ich garkein Sleep benutze bewegt sie dich Schlange bei jedem Schleifendurchlauf ein Feld vorwärts (Das macht die Methode bewegeSchlange()). Also in unspielbarer Geschwindigkeit.
Der Sleep wiederum verzögert die Tastatureingaben...

lg Toto
 

Ruzmanz

Top Contributor
Du musst die Zeit seit deinem letzten Schleifendurchlauf ermitteln, sodass dein Code von der Zeit abhängig ist und nicht von deinem Computer. Nehmen wir mal an mein PC ist sehr schlecht und ich bräuchte für die einzelnen Methoden 200ms + die 120ms = 320ms für einen Schleifendurchlauf. Dein PC ist viel besser und benötigt für die einzelnen Methoden 10ms + die 120ms = 130ms. Dann bewegt sich deine Schlage wesentlich schneller als meine ;)

Unter "Delta JLWGL" findest du einiges. Z.B. LWJGL Basics 4 (Timing) | NinjaCave

PS: Ich würde das "Display.update(); /* Display wird geupdated */" übrigens direkt nach dem Render aufrufen und ganz zum Schluss deine Schleife schlafen schicken.
 
Zuletzt bearbeitet:

dekka

Mitglied
Ich habe das selbe Problem.
1.Das Sleep(120) wendest du auf das gesamte Programm an. Das ist keine Lösung.
2.Die delta Time ist für ein Snake nutzlos, da man die Tails immer schrittweise aus der Liste ausliest.

In C# gibt es einer Klasse DispatcherTimer. An dessen Objekt kann man einem Delegate.
Also eine Funktion wird bsp. alle 120ms aufgerufen.

Hier so :
timer =new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(200);
timer.IsEnabled = true;
timer.Tick += function;

Das ist einfach top an C#.
Ich glaube Java ist da technisch einfach hinterher.
Ich habe jetzt auch keine Lust irgendwie Sender/Listener selbst zu bauen.
Oder umständlich die Schlange in einem eigenen Thread laufen zu lassen.

Ich suche genauso eine einfach Lösung wie in C#.
 

dekka

Mitglied
Hier stand die Diskussion sei erledigt. Das ist lächerlich, wenn die Lösung, die Benutzung der Delta Time sein soll. Die Delta Time funktioniert ja nicht mehr, wenn bei jedem Tick(Update) der Körper z,b. +10 Pixel bewegt werden soll.

So ich lasse den Mosch(die SnakeKlasse) jetzt doch in einem extra Thread laufen und führe die Aktualisierung der Liste(tail) in der run() Methode aus und darin kann dann auch der Sleep verwendet werden. Aber bitte nicht das ganze Programm einschläfern ! Das ist kein Basic.

Anderseits ist der DispatcherTimer in C# ist auch nur eine abgeleitete Threadklasse.

ROtz Java. Wo ein Thread ist, braucht man gleich mehrere.

C# ist einfach durchdachter.
 
Zuletzt bearbeitet:

dekka

Mitglied
So hab jetzt die wirklich endgültige Lösung gefunden.

Es gibt für Java die TimerTask Klasse aus dem util paket.
In der Hauptklasse:

Java:
      schlange=new schlange();
      time=new Timer();
      time.schedule(schlange, 0, 300); // ab 0 und dann alle 300ms periodisch wiederholen

Schlange erbt dann noch von TimerTask und implementiert die run() Methode, in der dann die Listenaktualisierungen vorgenommen werden. fertig.

bei mir sieht die zu implementierende run() so aus:

Java:
Point p=schlangeliste.get(0);  // schlangekopf
			
			int x=p.getX()+direction.getX();
			int y=p.getY()+direction.getY();
			
			schlangeliste.add(0, new Point(x,y));
			schlangeliste.remove(schlange.size()-1);

der andere Rest kann dann mit 60fps durchrattern.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
B LWJGL Display.update() ist langsam Spiele- und Multimedia-Programmierung 5
coolian lwjgl glfw window zeigt nur grau an Spiele- und Multimedia-Programmierung 0
coolian slick lwjgl text darstellen mit UnicodeFont funktoniert nicht? Spiele- und Multimedia-Programmierung 11
F OpenGL (LWJGL) Shader Programmierung GLSL Spiele- und Multimedia-Programmierung 2
Meeresgott LWJGL 3 Problem mit einer Texture Spiele- und Multimedia-Programmierung 4
V LWJGL GUI Spiele- und Multimedia-Programmierung 1
V GUI in LWJGL 2 erstellen Spiele- und Multimedia-Programmierung 6
C GLSL Shaderprogrammierung in LWJGL 3 Spiele- und Multimedia-Programmierung 12
G Low Poly 3D LWJGL Shader Problem Spiele- und Multimedia-Programmierung 4
B LWJGL OpenGL SIGSEGV auf Linux (Verzweiflung :/) Spiele- und Multimedia-Programmierung 8
G LWJGL .obj .mtl loader Spiele- und Multimedia-Programmierung 3
G 2D animationen LWJGL Spiele- und Multimedia-Programmierung 0
pcfreak9000 "Allgemeine" Performance verbessern (LWJGL 2) Spiele- und Multimedia-Programmierung 2
G LWJGL Rendert nicht Spiele- und Multimedia-Programmierung 3
G lwjgl verwendung Spiele- und Multimedia-Programmierung 6
R [LWJGL] Skeletal Animation Spiele- und Multimedia-Programmierung 5
E LWJGL glGenVertexArrays() erzeugt doppelte IDs Spiele- und Multimedia-Programmierung 3
G Java 2D Spiel mit LWJGL verbinden Spiele- und Multimedia-Programmierung 1
Streeber Problem mit Transparenz/TextDrawing in LWJGL/Slick2d (OpenGL) Spiele- und Multimedia-Programmierung 1
K No Lwjgl Spiele- und Multimedia-Programmierung 2
T LWJGL 2.9.2: Seltsamer Effekt beim Rendern (VertexShader Problem?) Spiele- und Multimedia-Programmierung 3
T LWJGL: Terrain-Texturen / 2D-Array in Shader? Spiele- und Multimedia-Programmierung 2
S 2D-Render Probleme LWJGL 2 (Java) Spiele- und Multimedia-Programmierung 1
P java lwjgl Game Spiele- und Multimedia-Programmierung 0
T [LWJGL] Textur / File wieder freigeben Spiele- und Multimedia-Programmierung 4
F [LWJGL] Skeletal Animation 3D Spiele- und Multimedia-Programmierung 1
C Generelle Hilfe zur lwjgl Spiele- und Multimedia-Programmierung 0
D LWJGL gluLookAt "Umschauen" Problem Spiele- und Multimedia-Programmierung 0
D Problem mit Würfelanimierung in LWJGL Spiele- und Multimedia-Programmierung 7
RalleYTN LWJGL Vignette Spiele- und Multimedia-Programmierung 2
E LWJGL Switchen zwischen gluOrtho und gluPerspective Spiele- und Multimedia-Programmierung 0
RalleYTN LWJGL Rotation Spiele- und Multimedia-Programmierung 1
C LWJGL Color Picking Textures deaktivieren Spiele- und Multimedia-Programmierung 0
K FBO Framebuffer object [LWJGL] 2D tutorial gesucht Spiele- und Multimedia-Programmierung 2
K [LWJGL] 2D Tunneler Hintergrund Spiele- und Multimedia-Programmierung 7
S LWJGL 3d-spieleentwicklung Spiele- und Multimedia-Programmierung 3
H LWJGL-Renderfail Spiele- und Multimedia-Programmierung 1
Seikuassi LWJGL - Texturen flackern Spiele- und Multimedia-Programmierung 2
Androbin LWJGL - Kollisions-Bug (Fallen) Spiele- und Multimedia-Programmierung 14
K Schiessen in 2D (LWJGL) Spiele- und Multimedia-Programmierung 2
S LWJGL Kamera Problem - Alles verzerrt Spiele- und Multimedia-Programmierung 4
U Kann nur ein Objekt mit LWJGL rendern Spiele- und Multimedia-Programmierung 2
X LWJGL | Parent.isDisplayable() must be true | wie kann man das zu true machen? Spiele- und Multimedia-Programmierung 0
X [LWJGL] Binden von Texturen per PNG File und Texture Sheet Spiele- und Multimedia-Programmierung 1
X LWJGL - Anklick baren Button erstellen aber wie? Spiele- und Multimedia-Programmierung 6
U Quadrate anklicken LWJGL Spiele- und Multimedia-Programmierung 3
B LWJGL / OPENGL Kriege Depth-Test nicht hin :( Spiele- und Multimedia-Programmierung 0
B LWJGL Manche Seiten werden transparent angezeigt Spiele- und Multimedia-Programmierung 2
T LWJGL VBO's funktionieren nicht, geben aber auch keinen Fehler Spiele- und Multimedia-Programmierung 0
U Komische fragmente bei LWJGL Spiele- und Multimedia-Programmierung 6
B LWJGL StackOverFlow Problem nach 30sekunden. (Pong) Spiele- und Multimedia-Programmierung 2
Q LWJGL - Alpha-Probleme Spiele- und Multimedia-Programmierung 2
S [LWJGL] Zweimal selbe Textur trotz unterschiedlicher IDs Spiele- und Multimedia-Programmierung 3
O LWJGL AWTGLCanvas Tiefe auf 1 beschränkt Spiele- und Multimedia-Programmierung 5
Seikuassi LWJGL-Problem Spiele- und Multimedia-Programmierung 2
S [LWJGL] schwarzer Bildschrim beim rendern von .obj Model Spiele- und Multimedia-Programmierung 2
S [lwjgl] Renderbug bei mehreren Objekten Spiele- und Multimedia-Programmierung 2
R LWJGL: OpenGL Fehler - weitere Informationen auslesen möglich? Spiele- und Multimedia-Programmierung 2
S LWJGL Kamera Koordinaten invertiert. Spiele- und Multimedia-Programmierung 2
M LWJGL Text rendern Spiele- und Multimedia-Programmierung 3
B LWJGL Mauskoordinaten Spiele- und Multimedia-Programmierung 1
R LWJGL: Performance glBegin, drawList, ... Spiele- und Multimedia-Programmierung 16
R LWJGL: Object Loader -> .obj, .c4d, ... laden Spiele- und Multimedia-Programmierung 3
R LWJGL: Textur -> unsichtbare Stellen, wie erzeugen? Spiele- und Multimedia-Programmierung 4
A LwJGL - Animation Stockt Spiele- und Multimedia-Programmierung 5
R [lwjgl] Cursor -> versetzt Zeichnen / Bild ist umgedreht Spiele- und Multimedia-Programmierung 2
R LWJGL: 3D Picking Spiele- und Multimedia-Programmierung 4
F LWJGL: Textur ändern mit GL11.readPixels Spiele- und Multimedia-Programmierung 5
F LWJGL: Licht und GL_LINES funktioniert nicht Spiele- und Multimedia-Programmierung 6
A [LWJGL] BMP Textur wird nicht richtig dargestellt Spiele- und Multimedia-Programmierung 8
S LWJGL Rechteck wird nicht gezeichnet Spiele- und Multimedia-Programmierung 6
F LWJGL: Is undefined? Spiele- und Multimedia-Programmierung 7
F LWJGL Kamerabug Spiele- und Multimedia-Programmierung 2
F LWJGL Problem mit Erstellen eines Objekts und der Kamera Spiele- und Multimedia-Programmierung 5
F LWJGL Dreidimensionaler Würfel Spiele- und Multimedia-Programmierung 15
P LWJGL oder OpenGL (C++) Spiele- und Multimedia-Programmierung 7
P "Tiefe" in Objekten - LWJGL Spiele- und Multimedia-Programmierung 12
T LWJGL 3D Objekt Collision: Wie? Spiele- und Multimedia-Programmierung 11
S LWJGL Kamera Frage Spiele- und Multimedia-Programmierung 2
V Komischer Fehler in LWJGL Spiele- und Multimedia-Programmierung 18
Z lwjgl oder jogl nutzen Spiele- und Multimedia-Programmierung 9
Y LWJGL Hintergrund Spiele- und Multimedia-Programmierung 7
Creylon [LWJGL] Textur wird falsch angezeigt Spiele- und Multimedia-Programmierung 12
Creylon [LWJGL] Spiel Exportieren Spiele- und Multimedia-Programmierung 2
Creylon [LWJGL] 2D Sprite Rotieren/Drehen Spiele- und Multimedia-Programmierung 6
CookieSoft LWJGL Ubuntu 12.04 Fehler Spiele- und Multimedia-Programmierung 7
E [LWJGL] Karusell, mehrere Objekte drehen sich um einen Mittelpunkt Spiele- und Multimedia-Programmierung 31
F lwjgl - Skysphere Spiele- und Multimedia-Programmierung 3
CookieSoft Slick und LWJGL Texture lag Spiele- und Multimedia-Programmierung 13
U OpenGl 1.1 (LWJGL GL11.*) und weiter? Spiele- und Multimedia-Programmierung 7
0 Grafikfehler LWJGL Spiele- und Multimedia-Programmierung 2
A LWJGL 3D Objekte Kollision Spiele- und Multimedia-Programmierung 3
Luk10 (LWJGL) Aufwendiges Animieren von Texturen Spiele- und Multimedia-Programmierung 16
S (LWJGL) VertexBufferObjects Spiele- und Multimedia-Programmierung 20
T LWJGL Grafik meines Projektes läuft nicht korrekt auf meinem iMac Spiele- und Multimedia-Programmierung 19
B LWJGL/OpenGL rendert manche Objekte nicht Spiele- und Multimedia-Programmierung 6
H LWJGL: Fragen zum Verständnis Spiele- und Multimedia-Programmierung 7
T LWJGL Gui erstellen Spiele- und Multimedia-Programmierung 7
Kenan89 lwjgl Exception Spiele- und Multimedia-Programmierung 3
Z Anfängerfrage: Text anzeigen mit LWJGL Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben