Java/Tutorials/Konstante Spielgeschwindigkeit

Aus Scientia
Version vom 24. Januar 2011, 13:09 Uhr von Alexis Hiemis (Diskussion | Beiträge)

(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Wechseln zu: Navigation, Suche

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);
    }
 
}