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:
Hier die Klasse in der das Fenster und der Rest gemacht wird:
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: