C
Chris4512
Gast
Hi,
Also mein Problem ist folgendes:
Ich versuche mit folgendem Quellcode mein Panel beim "spiel start" oder nach einem "Spielzug" neu zu bemalen, angefangen bei einer weissen Fläche..
Mein Programm macht folgendes:
- Ich klick auf Neues Spiel
-- Mein Programm erzeugt n 640*600 großes weißes Rechteck und positioniert darauf (zb) 10 Gegner und einen Spieler
- Ich klicke wieder auf Neues Spiel
-- Mein Programm ergänzt das alte Spielfeld mit den bisherigen Figuren um 10 neue Figuren
-- Mein Programm soll allerdings das voherige Spielfeld einmal "ausradieren" und dann alle figuren neu zeichnen.
Wenn ich via Maus auf nen Button klicke, der ihm einzeln sagt, dass das Spielfeld gelöscht werden soll, dann klappts.. was mich also interessiert: Wie verhindere ich, dass alle repaint() Anweisungen direkt ausgeführt werden, so dass mein Hintergrund einmal über die alten Grafiken gezeichnet wird?
Also schonmal Danke im Vorraus für mögliche Ideen!
Also mein Problem ist folgendes:
Ich versuche mit folgendem Quellcode mein Panel beim "spiel start" oder nach einem "Spielzug" neu zu bemalen, angefangen bei einer weissen Fläche..
Mein Programm macht folgendes:
- Ich klick auf Neues Spiel
-- Mein Programm erzeugt n 640*600 großes weißes Rechteck und positioniert darauf (zb) 10 Gegner und einen Spieler
- Ich klicke wieder auf Neues Spiel
-- Mein Programm ergänzt das alte Spielfeld mit den bisherigen Figuren um 10 neue Figuren
-- Mein Programm soll allerdings das voherige Spielfeld einmal "ausradieren" und dann alle figuren neu zeichnen.
Wenn ich via Maus auf nen Button klicke, der ihm einzeln sagt, dass das Spielfeld gelöscht werden soll, dann klappts.. was mich also interessiert: Wie verhindere ich, dass alle repaint() Anweisungen direkt ausgeführt werden, so dass mein Hintergrund einmal über die alten Grafiken gezeichnet wird?
Also schonmal Danke im Vorraus für mögliche Ideen!
Code:
public class SpielfeldPanel extends JPanel {
private static final long serialVersionUID = 1L;
private Image gegnerGrafik = null;
private Image spielerGrafik = null;
private Image crash = null;
private Image multiplikator = null;
private Image image = null;
public SpielfeldPanel() {
super();
image = new BufferedImage(640,600, BufferedImage.TYPE_INT_ARGB);
initialize();
}
private void initialize() {
this.setSize(640, 600);
this.setLayout(null);
this.setOpaque(true);
gegnerGrafik = Spiel.createImageIcon("Klasse/"+Spiel.einstellungen.getGegnerString()+".png").getImage();
multiplikator = Spiel.createImageIcon("Klasse/Multiplikator.png").getImage();
spielerGrafik = Spiel.createImageIcon("Klasse/Fussball.png").getImage();
crash = Spiel.createImageIcon("Klasse/Wolke.png").getImage();
// Erzeugt einmalig einen weißen Grund als Spielfläche
Graphics g = image.getGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, 640, 600);
repaint();
}
public void neuMalen(LinkedList<Gegner> gegner, Spieler spieler){
Graphics g = image.getGraphics();
g.setColor(Color.WHITE);
g.fillRect(0, 0, 640, 600);
// An dieser Stelle sollte das voherige Spielfeld eigentlich übermalt werden! :-(
//paintImmediately(0, 0, 640, 600);
// Iteriere durch alle Gegner + Spieler und male diese neu
g.drawImage(spielerGrafik, spieler.getX()*16, spieler.getY()*20,this);
for (Gegner enemy : gegner){
System.out.println(enemy.getX() + " - " + enemy.getY());
g.drawImage(gegnerGrafik, enemy.getX()*16, enemy.getY()*20,this);
}
g.dispose();
repaint();
}
public void paintComponent(Graphics g)
{
g.drawImage(image,0,0,this);
}
}