2D-Spiele ruckeln auf JPanel

Leifa

Mitglied
Moin!

Ich möchte anfangen, 2D-Spiele zu programmieren. Dafür habe ich mich ein bisschen mit dem Tutorial von Quaxli beschäftigt. Das Tutorial gefällt mir sehr gut, die Gedankengänge sind sehr gut nachvollziehbar. Was mich allerdings stört, ist das Ergebnis: Die Sprites ruckeln (ein bisschen).

Ich habe daraufhin die Klasse GamePanel mit Minimalfunktionen nachprogrammiert und wollte ein Rechteck über den Bildschirm gleiten lassen, bei jedem repaint einen Pixel weiter. Aber es ruckelt, egal ob 10 FPS oder 140 oder irgendwas dazwischen. Ich frage mich jetzt, ob das Ruckeln nur auf meine Rechnerleistung zurückzuführen ist, oder ob sich bewegende Objekte auf einem JPanel der Grund sind. Bei ApoMario habe ich z.B. 140 FPS und so gut wie kein Ruckeln.

Meine Vermutung ist daher, dass ein JPanel gar nicht so gut geeignet ist, um Spiele mit Sprites zu programmieren. Was kann man stattdessen benutzen? Ich möchte auch keine fertige Engine nutzen, denn es geht mir ja gerade darum zu lernen und mir selbst die Klassen zu schreiben, die ich für ein 2D-Spiel brauche.

Hier noch die relevanten Methoden meines Programms, vielleicht mache ich ja irgendwas furchtbar falsch:

Java:
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        
        
        g.setColor(Color.RED);
        g.fillRect(x, x, 120, 40);
        
        if (showFps) {
            g.setColor(Color.GREEN);
            g.fillRect(5, 5, 120, 40);
            g.setColor(Color.RED);
            g.drawString("FPS: " + df.format(fps), 10, 20);
            g.drawString("DELTA: " + df.format((double) delta / 1000000) + " ms", 10, 35);
        }        
    }
    
    
    private void computeDelta() {
        delta = System.nanoTime() - last;
        last = System.nanoTime();
        fps = (1000000000.0) / delta;
    }
    
    
    @Override
    public void run() {
        while (running) {
            computeDelta();
            x++;
            repaint();            
            try {
                Thread.sleep(sleepTime);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }        
    }
 

Leifa

Mitglied
Ich bin gerade zu der Erkenntnis gekommen, dass das Nutzen eines JPanels nicht der Grund sein kann.

Denn dieses umfangreiche Beispiel hier verwendet ebenfalls JPanel und bekommt dabei mal eben 1000-mal aufwändigere Animationen angezeigt. Und es ruckelt bei mir kein bisschen.

Ein JPanel sollte daher für meinen Bedarf vollkommen ausreichen. Doch worin liegt der Grund für das Ruckeln?
 

Volvagia

Top Contributor
Ich glaube, dass ein Pixel einfach zu wenig Veränderung ist. Wenn du die Distanz veränderst, wird die Bewegung eventuell flüssiger wirken.
 

Leifa

Mitglied
Ich glaube, dass ein Pixel einfach zu wenig Veränderung ist. Wenn du die Distanz veränderst, wird die Bewegung eventuell flüssiger wirken.
Das bringt leider nichts. Das Bild ruckelt, egal mit welcher Veränderung, als würde das Bild nicht schnell genug gezeichnet werden.

Zu dem Beispiel von Java 2D gibt es übrigens hier den source code. Ich konnte ihn ohne größere Probleme kompilieren und sämtliche Effekte laufen flüssig ab. Allerdings möchte ich keine 15000 Zeilen durchsuchen, um den elementaren Unterschied in der Implementierung herauszufinden.
 

Volvagia

Top Contributor
Also das läuft bei mir schon mit ohne, dass es ruckelig wirkt:

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.util.concurrent.TimeUnit;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestPanel extends JPanel implements Runnable
{
	private static final long serialVersionUID = 1L;

	private int x = 0;
	private int y = 0;
	
	private boolean showFps = true;
	private boolean running = true;
	
	private long delta;
	private long last;
	private double fps;
	
	private long sleepTime = 10L;
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);

		g.setColor(Color.RED);
		g.fillRect(x, y, 120, 40);
		
		if (showFps) {
			g.setColor(Color.GREEN);
			g.fillRect(5, 5, 120, 40);
			g.setColor(Color.RED);
			g.drawString("FPS: " + fps, 10, 20);
			g.drawString("DELTA: " + (double) delta / 1000000 + " ms", 10, 35);
		}        
	}
	private void computeDelta() {
		delta = System.nanoTime() - last;
		last = System.nanoTime();
		fps = (1000000000.0) / (double)delta;
	}
	public void run() {
		while (running) {
			computeDelta();
			x+= 10;
			repaint();            

			try
			{
				TimeUnit.MILLISECONDS.sleep(sleepTime);
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args) {
		JFrame frame = new JFrame();
		frame.setSize(600, 600);
		frame.setVisible(true);

		TestPanel panel = new TestPanel();
		frame.add(panel);

		new Thread(panel).start();
	}
}
 

krazun

Bekanntes Mitglied
Also das Beispiel von Volvagia läuft bei mir auch ohne Ruckeln.

Was kann man stattdessen benutzen?

Eine andere Möglichkeit währe z.B. Active Rendering: GameDev.net -- Java Games: Active Rendering

Java:
import java.awt.*;
import java.util.Random;
import javax.swing.JFrame;

/*
 * This is an example of a simple windowed render loop
 */
public class SimpleWindowedGame {

  public static void main( String[] args ) {
		
    // Create game window...
    JFrame app = new JFrame();
    app.setIgnoreRepaint( true );
    app.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		
    // Create canvas for painting...
    Canvas canvas = new Canvas();
    canvas.setIgnoreRepaint( true );
    canvas.setSize( 640, 480 );
		
    // Add canvas to game window...
    app.add( canvas );
    app.pack();
    app.setVisible( true );
		
    // Create BackBuffer...
    canvas.createBufferStrategy( 2 );
    BufferStrategy buffer = canvas.getBufferStrategy();

    // Get graphics configuration...
    GraphicsEnvironment ge = 
        GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice gd = ge.getDefaultScreenDevice();
    GraphicsConfiguration gc = gd.getDefaultConfiguration();

    // Create off-screen drawing surface
    BufferedImage bi = gc.createCompatibleImage( 640, 480 );

    // Objects needed for rendering...
    Graphics graphics = null;
    Graphics2D g2d = null;
    Color background = Color.BLACK;
    Random rand = new Random();
		
    // Variables for counting frames per seconds
    int fps = 0;
    int frames = 0;
    long totalTime = 0;
    long curTime = System.currentTimeMillis();
    long lastTime = curTime;
		
    while( true ) {
      try {
        // count Frames per second...
        lastTime = curTime;
        curTime = System.currentTimeMillis();
        totalTime += curTime - lastTime;
        if( totalTime > 1000 ) {
          totalTime -= 1000;
          fps = frames;
          frames = 0;
        } 
        ++frames;

        // clear back buffer...
        g2d = bi.createGraphics();
        g2d.setColor( background );
        g2d.fillRect( 0, 0, 639, 479 );
				
        // draw some rectangles...
        for( int i = 0; i < 20; ++i ) {
          int r = rand.nextInt(256);
          int g = rand.nextInt(256);
          int b = rand.nextInt(256);
          g2d.setColor( new Color(r,g,b) );
          int x = rand.nextInt( 640/2 );
          int y = rand.nextInt( 480/2 );
          int w = rand.nextInt( 640/2 );
          int h = rand.nextInt( 480/2 );
          g2d.fillRect( x, y, w, h );
        }
				
        // display frames per second...
        g2d.setFont( new Font( "Courier New", Font.PLAIN, 12 ) );
        g2d.setColor( Color.GREEN );
        g2d.drawString( String.format( "FPS: %s", fps ), 20, 20 );
				
        // Blit image and flip...
        graphics = buffer.getDrawGraphics();
        graphics.drawImage( bi, 0, 0, null );
        if( !buffer.contentsLost() )
          buffer.show();
				
        // Let the OS have a little time...
        Thread.yield();
      } finally {
        // release resources
        if( graphics != null ) 
          graphics.dispose();
        if( g2d != null ) 
          g2d.dispose();
      }
    }
  }
}

mfg,
krazun
 

Leifa

Mitglied
Mit krazuns Beispiel läuft alles sehr flüssig, auch bewegte Objekte.
Vielen Dank!

Falls jemand noch eine Idee hat, was vorher das Ruckeln ausgelöst haben könnte: Ich bin immer noch interessiert!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Seltsame Exception bei Code eines Spiele-Tutorials Spiele- und Multimedia-Programmierung 6
N Escape the Room - Spiele Apps programmieren Spiele- und Multimedia-Programmierung 14
Noahscript 3D-Spiele Spiele- und Multimedia-Programmierung 7
mihe7 Wie man einfache Spiele programmieren kann Spiele- und Multimedia-Programmierung 23
N Spiele-Menü in Java Spiele- und Multimedia-Programmierung 9
T Neuronale Netze und Spiele Spiele- und Multimedia-Programmierung 4
H KI für Spiele Spiele- und Multimedia-Programmierung 1
H 3D Spiele mit Java - Diskussion Spiele- und Multimedia-Programmierung 35
D 2d Spiele Bibliothek Spiele- und Multimedia-Programmierung 9
M Spiele Tutorial.. Findet Bilddateien nicht Spiele- und Multimedia-Programmierung 6
K Casino Spiele UI Spiele- und Multimedia-Programmierung 7
J 2D Spiele - Inwiefern Vektorrechnung nötig? Spiele- und Multimedia-Programmierung 7
S Aufbau für 2D Spiele Spiele- und Multimedia-Programmierung 7
A Drawable und Moveable in Quaxli 2D Spiele Tutorial Spiele- und Multimedia-Programmierung 7
Gossi Probleme beim Laden der Images aus dem "Tutorial für Java-Spiele" Spiele- und Multimedia-Programmierung 4
X Gutes 2D Spiele Tutorial? Spiele- und Multimedia-Programmierung 9
B Spiele Tutorials Spiele- und Multimedia-Programmierung 9
F wie richtig spiele programmieren ? Spiele- und Multimedia-Programmierung 19
C Java für große Spiele geeignet ? Spiele- und Multimedia-Programmierung 101
B Spiele programmieren für ein Fenster? Spiele- und Multimedia-Programmierung 14
V Online-Spiele syncronisieren. Spiele- und Multimedia-Programmierung 5
J Suche Java Spiele Editor! Spiele- und Multimedia-Programmierung 2
Developer_X Java3D-Ungeeignet für 3D Spiele wegen Heap Space=? Spiele- und Multimedia-Programmierung 23
D Spiele Wuerfel 3D aber wie Spiele- und Multimedia-Programmierung 6
D Problem mit dem Spiele TUT Spiele- und Multimedia-Programmierung 16
H 2d- Spiele Entwicklung Spiele- und Multimedia-Programmierung 11
D sehr simple Java Spiele Platformübergreifend für Handys/PDAs Spiele- und Multimedia-Programmierung 3
Quaxli Welche Grafiksoftware nutzt Ihr für 2D-Spiele? Spiele- und Multimedia-Programmierung 6
D Welcher Image Typ am besten für 2D-Spiele geeignet? Spiele- und Multimedia-Programmierung 5
X JPCT 3d-Spiele Programmierung Tutorial Spiele- und Multimedia-Programmierung 40
X 3D Spiele Tutorial gewünscht? Spiele- und Multimedia-Programmierung 14
G Bekannte Spiele in Java programmiert Spiele- und Multimedia-Programmierung 9
R Spiele für den DVD Player Spiele- und Multimedia-Programmierung 6
F 2d Spiele Spiele- und Multimedia-Programmierung 4
J soundlösung zu langsam für spiele Spiele- und Multimedia-Programmierung 16
T Größeres Spiele Projekt - einige Fragen zur Umsetzung Spiele- und Multimedia-Programmierung 3
O soundlösung für spiele (mit lautstärke) Spiele- und Multimedia-Programmierung 4
Landei Entwicklungsumgebung für "Pseudo-3D"-Spiele? Spiele- und Multimedia-Programmierung 17
A Spiele kommentieren Spiele- und Multimedia-Programmierung 4
M Images/Sounds für Spiele Spiele- und Multimedia-Programmierung 3
A Werden "große Spiele" mal in Java programmiert? Spiele- und Multimedia-Programmierung 43
H Große Spiele in welcher Sprache Spiele- und Multimedia-Programmierung 33
R eure programmierten Spiele Spiele- und Multimedia-Programmierung 53
N Schlieren und Ruckeln, weiss nicht mehr weiter.... Spiele- und Multimedia-Programmierung 5
R JPanel wird erst im Fullscreen angezeigt Spiele- und Multimedia-Programmierung 1
P selectedItem aus einem Methodenerstellten JPanel auslesen. Spiele- und Multimedia-Programmierung 5
M JPanel mit Graphics2D Objekten mit JScrollpane Spiele- und Multimedia-Programmierung 6
K JPanel wechseln & Neu starten - SnakeSpiel Spiele- und Multimedia-Programmierung 2
A paintComponent in JPanel in JFrame Spiele- und Multimedia-Programmierung 7
N JPanel Inhalt aktualisiert nach Thread.sleep nicht Spiele- und Multimedia-Programmierung 2
S Thread und jpanel-paintcomponent kombinierbar?? Spiele- und Multimedia-Programmierung 14
E Animiertes JPanel dynamisch wechseln Spiele- und Multimedia-Programmierung 3
W Panel/JPAnel createImage() Exception Spiele- und Multimedia-Programmierung 2
R Probleme mit JPanel!KeyListener geht nicht Spiele- und Multimedia-Programmierung 6
T Problem bei LinkedList / JPanel Spiele- und Multimedia-Programmierung 4
C 2D Sprites an die JPanel Größe (Auflösung) anpassen/skalieren Spiele- und Multimedia-Programmierung 3
F Vektorgrafik in JPanel Spiele- und Multimedia-Programmierung 5
E Active Rendering im FSEM auf ein JPanel? Spiele- und Multimedia-Programmierung 4
A Mehrere geometrische Objekte in JPanel zeichnen Spiele- und Multimedia-Programmierung 4
X JPanel dynamisch (Koordinatensystem)? Spiele- und Multimedia-Programmierung 30
M Jpanel Graphik speichern Spiele- und Multimedia-Programmierung 6
DamienX Canvas vs JPanel Spiele- und Multimedia-Programmierung 15
S Problem mit JPanel bzw p a i n t Spiele- und Multimedia-Programmierung 6
K stringWidth bei Graphics von JPanel und Printer unterschiedl Spiele- und Multimedia-Programmierung 4
R SimpleUniverse in JPanel Spiele- und Multimedia-Programmierung 4
M 1. Menüleiste wird doppelt gezeichnet 2. awt auf ein jpanel Spiele- und Multimedia-Programmierung 4
M Jpanel mit Keylistener Spiele- und Multimedia-Programmierung 6
D 2D Graphic Objekte in ein JPanel einfügen Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben