Java/Tutorials/Konstante Spielgeschwindigkeit
Aus Scientia
Version vom 24. Januar 2011, 13:09 Uhr von Alexis Hiemis (Diskussion | Beiträge)
Inhaltsverzeichnis
Konstante Spielgeschwindigkeit einstellen
Wie einige von euch sicher wissen verwendet man in Java die paint() Methode zum Zeichnen von Objekten.
Um Bewegungen o.ä. darstellen zu können muss die paint() Methode immerwieder aufgerufen werden.
Diesen Aufruf erreicht man durch die implementierung der Runnable Schnittstelle, welche uns die Methode run() bereitstellt.
In der run() Methode werden wir nun mit einigen Tricks die Spielgeschwindigkeit einstellen.
Was ihr noch wissen müsst ist, dass eine Sekunde 1000 Millisekunden enthält und die Spielgeschwindigkeit sich somit aus
1000/x = FPS ergibt.
Beispiel
import java.awt.Dimension; import java.awt.Graphics; import javax.swing.JPanel; public class Beispiel extends JPanel implements Runnable { //Als erstes erstellen wir eine final Variable mit der wir unsere Spielgeschwindigkeit regeln. //Spielgeschwindigkeit = 1000/MAX_GAME_SPEED (1000 entspricht den mS den eine Sekunde hat) final int MAX_GAME_SPEED = 33; Dimension dim = new Dimension(640,480); public int FPS = 0; //Konstruktor unserer Klasse public Beispiel() { //Wir erzeugen einen neuen Thread, welches unsere run() Methode steuert. new Thread(this).start(); //Größe des Fensters setSize(dim); } //Unsere run Methode public void run() { //Spielschleife while(true) { try { //Als erstes holen wir uns die aktuelle Zeit und zwar in mS float START = System.currentTimeMillis(); //Dann wird die repaint() Methode aufgerufen, welche die paint() Methode aufruft. repaint(); //Nun holen wir uns wieder die aktuelle Zeit in mS und ziehen davon //unsere Startzeit ab. //Somit haben wir nun die Zeit, welche paint() für das Zeichnen gebraucht hat. float AUSFUEHR = System.currentTimeMillis()-START; //Als nächstes schauen wir nach ob die Ausführzeit unsere //eingestellte Spielgeschwindigkeit überschreitet. if(MAX_GAME_SPEED>AUSFUEHR) { //Wenn dies nicht der Fall ist pausieren wir unser Spiel Thread.sleep(MAX_GAME_SPEED-(int)AUSFUEHR); FPS = 1000/MAX_GAME_SPEED; } else { FPS = 1000/(int)AUSFUEHR; } } catch(Exception e) { //Fehlerhandling } } } //paint() Methode @Override public void paint(Graphics g) { //Zum Test geben wir unsere Spielgeschwindigkeit aus. g.drawString("FPS: "+FPS,dim.width/2-30,dim.height/2); } }
Sonstiges
Wer mit diesen Code aufrufen will und nicht genau weiss wie, hier mal die Klasse zum erzeugen eines Frames.
import javax.swing.JFrame; public class Main { public static void main(String[] args) { //Ein Frame erzeugen JFrame frame = new JFrame(); //Unser Panel erzeugen Beispiel bsp = new Beispiel(); //Einfügen des Panels in das Frame frame.add(bsp); //Framegröße einstellen frame.setSize(bsp.dim); //Das Frame soll man natürlich auch schließen können ;) frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //Sichtbar soll es auch sein. frame.setVisible(true); } }