Bewegendes Viereck ruckelt

acine123

Mitglied
Hallo,
Ich habe ein Programm geschrieben in dem sich in einem einzelnen Thread ein kleines Viereck bewegt. Das ganze lasse ich mir mit einer Bufferstrategy mit 3 Stufen anzeigen. Die FPS Begrenzung und das Abprallen an den Wänden funktioniert einwandfrei. Nur wenn man ein bisschen auf das Viereck schaut erkennt man dass es ca jede halbe Sekunde einen leichten Ruckler macht. Habe die Datei auch schon Exportiert und dann gestartet, aber es kam das selbe Ergebnis. Am Monitor liegt es auch nicht weil ich das selbe Programm in Javascript gemacht habe und es dort prima funktioniert. An was könnte des liegen??

Hier die Main Klasse von der aus ich den Thread starte:
Java:
public class Control {

    public static void main(String[] args) {
        Game window = new Game("Game");
        window.start();
    }
}

Hier die Klasse in der das Fenster und der Rest gemacht wird:
Java:
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;

import javax.swing.JFrame;

public class Game extends Canvas implements Runnable {
  
    JFrame frame;
    Thread thread;
    Dimension resolution = new Dimension(800,600);
    boolean runs = false;
    double lasttime;
    double time;
    double diff;
    double fps = 60;
    double millitime =1000/fps;
    int xpos = 10;
    int ypos = 10;
    BufferStrategy bs;
    Graphics g;
    int xstep = 1;
    int ystep = 1;
    int width = 100;
    int height = 100;
  
    //constructor
    public Game(String title){
        super.setBounds(0,0,resolution.width,resolution.height);
        super.setBackground(Color.GRAY);
        super.setVisible(true);
      
        frame = new JFrame(title);
        frame.setSize(resolution);
        frame.setResizable(false);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(this);
        frame.setVisible(true);
        System.out.println("Window created");
      
    }
  

    //Gameloop
    @Override
    public void run() {
            //looooop
        while(runs){
            //aktuelle Zeit
            time = System.currentTimeMillis();
          
            //Vorgang
            drawStuff();
          
            //So wie es sein sollte
            time+=millitime;
            //Schlafenszeit durch so wie es sein sollte - unterschied
            double sleeptime = time-System.currentTimeMillis();
            if(sleeptime>=0){
                try{
                    thread.sleep((long) sleeptime);
                  
                }catch(Exception e){
                    System.out.println("PC is too slow to get max fps :D");
                }
            }
          
        }
      
    }
    //starts the thread
    public void start(){
        if(runs==true){
            System.out.println("Thread läuft bereits");
        }else{
            runs = true;
            thread = new Thread(this);
            thread.start();
        }
    }
    private void drawStuff(){
        bs = this.getBufferStrategy();
        if(bs==null){
            this.createBufferStrategy(3);
            return;
        }
        g = bs.getDrawGraphics();
        //Draw here
        g.clearRect(0, 0, 800, 600);
        g.fillRect(xpos, ypos, width, height);
      
        g.dispose();
        bs.show();
        calcCoord();
    }
    //stops the thread
    public void stop(){
        runs = false;
        try{
            thread.join();
            System.out.println("Thread closed");
        }catch(Exception e){
            System.out.println("Couldn't join the Thread");
        }
    }
  
    private void calcCoord(){
        if(xpos+width>getWidth()||xpos<0){
            xstep*=-1;
        }
        if(ypos+height>getHeight()||ypos<0){
            ystep*=-1;
        }
        xpos+=xstep;
        ypos+=ystep;
    }
}
 
Zuletzt bearbeitet von einem Moderator:

Major_Sauce

Bekanntes Mitglied
An CalcCood einfach mal die Zeit übergeben, die seit dem letzten Update vergangen ist. Dann xStep * diese Zeit nehmen, * ein beliebiger Modifier (0.1) um das ganze ein bisschen langsamer zu machen, dann sollte das ganze ein wenig flüssiger laufen.

mfg Major
 

Ähnliche Java Themen

Neue Themen


Oben