Hallo zusammen
Ich programmiere Animationen für die Java-Version eines Brettspiels. Grundsätzlich geht es darum, einen Bauern per Mausklick auswählen zu können, um diesen danach zu bewegen. Da der Mausklick aber nur genau auf der Spielfigur das ensprechende Event auslösen soll, hab ich an ein Polygon gedacht, das die Form der Spielfigur hat.
Mein Problem ist nun, dass ich die Bewegung dieses Bauern-Polygons auf meiner GUI (die auch JPanels enthält) nicht graphisch ansprechbar hinkriege. Als ich den Bauern noch in einem JLabel hatte, funktioniert alles prima. Beim Polygon flackert jedoch alles wild - da die Animation alle 10-100 ms einen Schritt macht, sieht man sie bisweilen gar nicht mehr.
Ich habe diverse Sachen wie Doppel-Pufferung etc. schon probiert, habs aber leider bis jetzt nicht hingekriegt.
Ich programmiere das erste Mal eine GUI in Java und bin für hilfreiche Tips dankbar (auch falls jemand eine komplett andere Lösung für mein Problem hat... ich mag die Polygone eh nicht so )
Danke!
Code:
Ich programmiere Animationen für die Java-Version eines Brettspiels. Grundsätzlich geht es darum, einen Bauern per Mausklick auswählen zu können, um diesen danach zu bewegen. Da der Mausklick aber nur genau auf der Spielfigur das ensprechende Event auslösen soll, hab ich an ein Polygon gedacht, das die Form der Spielfigur hat.
Mein Problem ist nun, dass ich die Bewegung dieses Bauern-Polygons auf meiner GUI (die auch JPanels enthält) nicht graphisch ansprechbar hinkriege. Als ich den Bauern noch in einem JLabel hatte, funktioniert alles prima. Beim Polygon flackert jedoch alles wild - da die Animation alle 10-100 ms einen Schritt macht, sieht man sie bisweilen gar nicht mehr.
Ich habe diverse Sachen wie Doppel-Pufferung etc. schon probiert, habs aber leider bis jetzt nicht hingekriegt.
Ich programmiere das erste Mal eine GUI in Java und bin für hilfreiche Tips dankbar (auch falls jemand eine komplett andere Lösung für mein Problem hat... ich mag die Polygone eh nicht so )
Danke!
Code:
Java:
package bufferedImage;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Paint;
import java.awt.Point;
import java.awt.Polygon;
import java.awt.TexturePaint;
import java.awt.image.BufferedImage;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class AnimationBI extends JFrame {
//linkes Panel
JPanel mainPanel;
//rechtes Panel
JPanel secondPanel;
ImageIcon farmer;
Point farmerPosition;
//Für Doppelpufferung
Image dbImage;
Graphics dbGraphics;
Container cont;
Polygon polygon;
//Polygonpunkte
int[] polygonX;
int[] polygonY;
//TexturePaint um Bild auf Polygon zu legen
Paint tpaint;
//BufferedImage um Bild auf Polygon zu legen
BufferedImage buImg;
private Timer timer;
public AnimationBI() {
try {
farmer = new ImageIcon(getClass().getResource("blue_farmer.png"));
buImg = ImageIO.read(getClass().getResource("blue_farmer.png"));
} catch (Exception e) {
//nichts
}
farmerPosition = new Point(100, 100);
mainPanel = new JPanel();
mainPanel.setLayout(null);
mainPanel.setBounds(20, 20, 200, 400);
mainPanel.setBackground(Color.GREEN);
mainPanel.setVisible(true);
cont = getContentPane();
add(mainPanel);
// Zweites Panel
secondPanel = new JPanel();
mainPanel.setLayout(null);
add(secondPanel);
secondPanel.setBounds(240, 20, 200, 400);
secondPanel.setBackground(Color.BLACK);
secondPanel.setVisible(true);
setBounds(0, 0, 600, 480);
setVisible(true);
// Polygon
polygonX = new int[] { 100, 110, 173, 183, 183, 100 };
polygonY = new int[] { 110, 100, 100, 110, 214, 214 };
polygon = new Polygon(polygonX, polygonY, 6);
tpaint = new TexturePaint(buImg, polygon.getBounds2D());
timer = new Timer();
timer.scheduleAtFixedRate(new ScheduleTask(), new Date(), 3);
}
public void paint(Graphics g) {
// super.paint(g);
Graphics2D g2d = (Graphics2D) g.create();
tpaint = new TexturePaint(buImg, polygon.getBounds2D());
g2d.setPaint(tpaint);
g2d.drawPolygon(polygon);
g2d.fillPolygon(polygon);
}
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(0, 0, this.getSize().width, this.getSize().height);
// Vordergrund zeichnen
dbGraphics.setColor(getForeground());
paint(dbGraphics);
// Offscreen anzeigen
g.drawImage(dbImage, 0, 0, this);
}
class ScheduleTask extends TimerTask {
public ScheduleTask() {
}
public void run() {
for (int i = 0; i < 20; i++) {
polygon.translate(10, 10);
repaint();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// nichts
}
}
}
}
}