Math_student
Grünschnabel
Hallo zusammen,
ich habe ein kleines Problem mit dem Double Buffering. Und zwar programmiere ich zurzeit ein kleines 2D Spiel und vor einiger Zeit hat es dann angefangen zu "flackern".. Ein bisschen im Internet gesucht und zum Schluss gekommen dass Double Buffering die Lösung sei. Das hab ich dann auch so einprogrammiert, aber meine Update Mathode für das JPanel wird irgendwie nicht durch repaint() aufgerufen..
Am besten ich poste mal das Programm..
Es sollte ein Labyrinthspiel werden indem es ein riesiges Spielfeld gibt und der Bildausschnitt mit dem Spieler mitwandert.
Ich weiß es gibt vermutlich einige Schönheitsfehler, ich bitte deshalb um etwas Nachsicht. .
Viele Grüße
ich habe ein kleines Problem mit dem Double Buffering. Und zwar programmiere ich zurzeit ein kleines 2D Spiel und vor einiger Zeit hat es dann angefangen zu "flackern".. Ein bisschen im Internet gesucht und zum Schluss gekommen dass Double Buffering die Lösung sei. Das hab ich dann auch so einprogrammiert, aber meine Update Mathode für das JPanel wird irgendwie nicht durch repaint() aufgerufen..
Am besten ich poste mal das Programm..
Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class World extends JPanel implements Runnable{
JFrame f;
Labyrinth l;
Player p;
long lastFrame=System.currentTimeMillis();
int obere_eckex=0;
int obere_eckey=0;
//DB=Double Buffering
private Image dbImage;
private Graphics dbGraphics;
World(int width, int height, Player p){
this.setSize(width, height);
f=new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(800, 600);
f.setVisible(true);
f.setResizable(false);
f.add(this);
l=new Labyrinth();
l.constructLab();
f.addKeyListener(p.key);
this.p=p;
p.l=l;
Thread th=new Thread(this);
th.start();
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
long thisFrame=System.currentTimeMillis();
float timesincelastframe=(float)(thisFrame-lastFrame)/1000f;
lastFrame=thisFrame;
repaint();
p.update(timesincelastframe);
for(int i=0;i<p.bullets.size();i++){
p.bullets.get(i).update(timesincelastframe);
}
try {
Thread.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//DB
public void update(Graphics g){
//Double Buffer initialisieren
if(dbImage==null){
dbImage=createImage(this.getSize().width, this.getSize().height);
dbGraphics=dbImage.getGraphics();
}
//Hintergrund löschen
dbGraphics.setColor(getBackground());
dbGraphics.fillRect(this.getX(), this.getY(), this.getSize().width, this.getSize().height);
//Vordergrund zeichnen
dbGraphics.setColor(getForeground());
paint(dbGraphics);
//Offscreen anzeigen
g.drawImage(dbImage, this.getX(), this.getY(), this);
}
public void paint(Graphics g){
super.paint(g);
if(p.posx>=400){
this.setBounds(-((int)p.posx-400),obere_eckey,8000,6000);
obere_eckex=-((int)p.posx-400);
}
if(p.posy>=300){
this.
setBounds(obere_eckex,-((int)p.posy-300),8000,6000);
obere_eckey=-((int)p.posy-300);
}
g.setColor(Color.WHITE);
g.fillRect(0, 0, 8000, 6000);
g.setColor(Color.gray);
for(int i=0;i<l.labyrinth.size();i++){
g.fillRect(l.labyrinth.get(i).x,l.labyrinth.get(i).y, l.labyrinth.get(i).width,l.labyrinth.get(i).height);
}
g.setColor(Color.red);
for(int i=0;i<p.bullets.size();i++){
g.fillOval((int)p.bullets.get(i).posx, (int)p.bullets.get(i).posy, p.bullets.get(i).width, p.bullets.get(i).height);
}
g.setColor(Color.BLACK);
g.fillRect((int)p.posx, (int)p.posy, p.width, p.height);
}
public static void main(String[] args){
Player p=new Player(1200,500,50,50);
new World(800,600,p);
}
}
Es sollte ein Labyrinthspiel werden indem es ein riesiges Spielfeld gibt und der Bildausschnitt mit dem Spieler mitwandert.
Ich weiß es gibt vermutlich einige Schönheitsfehler, ich bitte deshalb um etwas Nachsicht. .
Viele Grüße