Java/Tutorials/Karteneditor II Kapitel 6
In diesen Abschnitt kommen wir nun zur eigentlichen Spielschleife, in dieser werden alle unsere Tastatur eingaben und später auch Event und Scriptauslöser eingebaut. Die Strikte Trennung für Logic und Grafik sorgt dafür das alles schön übersichtlich ist und das es es keine Pausen bei Animationen gibt. Wir erstellen die Klasse SpielSchleife und implementieren hierfür die Methode Runnable. Weiterhin werden wir uns einige Klassenvariable aus der SpielFenster Klasse hohlen um uns schreibarbeit zu ersparen, dies währen die Karten- und Steuerungs-Klasse sowie unseren Karten Punkt. Wir werden auch wieder die run()-Methode aus dem Vorrangegangen Kapitel implementieren um eine Konstante Spielegeschwindigkeit zu erreichen.
public class SpielSchleife implements Runnable{ SpielFenster fenster; Karte karte; Steuerung steuerung; Point punkt; int MAX_GAME_SPEED=33; public SpielSchleife(SpielFenster f) { fenster=f; karte=fenster.karte; steuerung=fenster.steuerung; punkt=fenster.ansichtsPunkt; } public void run() { while(true) { float START = System.currentTimeMillis(); float AUSFUEHR = System.currentTimeMillis()-START; if(MAX_GAME_SPEED>AUSFUEHR) { try { Thread.sleep(MAX_GAME_SPEED-(int)AUSFUEHR); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
Nun fügen wir die eigentlich Steuerung hinzu, hierfür Fragen wir die Steuerung ab, welche Pfeiltaste gerade gedrückt wird und verschieben jeweils unseren ansichtsPunkt bzw. punkt um jeweils eine stelle.
public class SpielSchleife implements Runnable{ SpielFenster fenster; Karte karte; Steuerung steuerung; Point punkt; int MAX_GAME_SPEED=33; public SpielSchleife(SpielFenster f) { fenster=f; karte=fenster.karte; steuerung=fenster.steuerung; punkt=fenster.ansichtsPunkt; } public void run() { while(true) { float START = System.currentTimeMillis(); if(steuerung.hoch == true) { punkt.y--; } else if(steuerung.runter == true) { punkt.y++; } else if(steuerung.links == true) { punkt.x--; } else if(steuerung.rechts == true) { punkt.x++; } float AUSFUEHR = System.currentTimeMillis()-START; if(MAX_GAME_SPEED>AUSFUEHR) { try { Thread.sleep(MAX_GAME_SPEED-(int)AUSFUEHR); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
Kommen wir nun zu den Kollisionsabfragen, also so das wir keine ArrayIndexOutRange Fehlermeldung erhalten. Dafür fragen wir die Position ab, wenn ein Wert unter 0 kommt, wird der jeweilige wert wieder erhöht. Damit unser Punkt nicht über die zugelassene Karten Höhe/Breite kommt bauen wir eine if Abfrage ein und wie bei der 0 Abfrage wird auch der Wert wieder zurück gesetzt, hierbei wird der Wert verringert. Das Abziehen von 20 und 15, hat den grund, da unser Punkt ja die linke obere Ecke repräsentiert und wir ja wollen das unser Bildschirm immer und Vollständig mit Tile gefühlt ist.
public class SpielSchleife implements Runnable{ SpielFenster fenster; Karte karte; Steuerung steuerung; Point punkt; int MAX_GAME_SPEED=33; public SpielSchleife(SpielFenster f) { fenster=f; karte=fenster.karte; steuerung=fenster.steuerung; punkt=fenster.ansichtsPunkt; } public void run() { while(true) { float START = System.currentTimeMillis(); if(steuerung.hoch == true) { punkt.y--; } else if(steuerung.runter == true) { punkt.y++; } else if(steuerung.links == true) { punkt.x--; } else if(steuerung.rechts == true) { punkt.x++; } if(punkt.x > karte.breite-20) { punkt.x--; } else if(punkt.y > karte.höhe-15) { punkt.y--; } else if(punkt.x < 0) { punkt.x++; } else if(punkt.y < 0) { punkt.y++; } float AUSFUEHR = System.currentTimeMillis()-START; if(MAX_GAME_SPEED>AUSFUEHR) { try { Thread.sleep(MAX_GAME_SPEED-(int)AUSFUEHR); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
Anmerkung:Ich möchte hierbei noch Anmerken, das dieser Bewegungsablauf den aus den Spiel Lufio 2 entspricht. Was zu bedeuten hat, das unsere Figur niemals den Rand zu nahe kommt.
Fügen wir nun unsere Spielschleife in unser SpielFenster ein.
public class SpielFenster extends JFrame{ Point ansichtsPunkt=new Point(0,0); SpielAnsicht ansicht; Steuerung steuerung; SpielerSprite spieler; SpielSchleife schleife; Karte karte; public SpielFenster() { steuerung=new Steuerung(); addKeyListener(steuerung); spieler=new SpielerSprite("Char.png",this); karte=Karte.ladeKarte("1.karte"); ansicht=new SpielAnsicht(this); schleife=new SpielSchleife(this); add(ansicht); setSize(new Dimension(640,480)); setTitle("Spiel"); setVisible(true); } }