Hallo,
ich programmiere zur Zeit an einem kleinem 2D-Game. Spielfiguren werden dabei durch Rechtecke repräsentiert und sollen mit AffineTransform bewegt werden (nur Translation und Rotation). Das habe ich soweit hinbekommen, bin dabei aber auf ein Problem gestoßen.
So scheint die Transformation lediglich den Umriss des Rechtecks zu verändern. Drehe ich also um 30° und bewege dann ein Stück nach vorne wird das schön gezeichnet, die Koordinaten meines Spielobjektes bzw. Rechtecks bleiben aber unangerührt. Jetzt bin ich bisher erfolglos auf der Suche nach einer Möglichkeit die Koordinaten des Spielobjektes beim transformieren aktuell zu halten. Google und die API habe ich schon heftigst bemüht aber auf keine konkretes Ergebnis gestoßen, vielleicht sehe ich aber auch nur den Wald vor lauter Bäumen nicht mehr^^
Ich habe mal ein kleines Beispiel gecoded, das das Problem nochmal deutlich macht. Das rote Rechteck ist das Spielobjekt vor der Transformation dar, das gründe danach. Die Ausgabe der Koordinaten bleibt allerdings die Selbe.
EDIT: Achso, Sinn und Zweck der Sache ist übrigens eine simple Kollisionserfrage mit intersects() zu ermögliche. Wenn jemand eine andere Methode zur Kollisionserkennung kennt, die nicht auf die Koordinaten angewiesen ist, ist das auch eine Hilfe nehme ich an.
ich programmiere zur Zeit an einem kleinem 2D-Game. Spielfiguren werden dabei durch Rechtecke repräsentiert und sollen mit AffineTransform bewegt werden (nur Translation und Rotation). Das habe ich soweit hinbekommen, bin dabei aber auf ein Problem gestoßen.
So scheint die Transformation lediglich den Umriss des Rechtecks zu verändern. Drehe ich also um 30° und bewege dann ein Stück nach vorne wird das schön gezeichnet, die Koordinaten meines Spielobjektes bzw. Rechtecks bleiben aber unangerührt. Jetzt bin ich bisher erfolglos auf der Suche nach einer Möglichkeit die Koordinaten des Spielobjektes beim transformieren aktuell zu halten. Google und die API habe ich schon heftigst bemüht aber auf keine konkretes Ergebnis gestoßen, vielleicht sehe ich aber auch nur den Wald vor lauter Bäumen nicht mehr^^
Ich habe mal ein kleines Beispiel gecoded, das das Problem nochmal deutlich macht. Das rote Rechteck ist das Spielobjekt vor der Transformation dar, das gründe danach. Die Ausgabe der Koordinaten bleibt allerdings die Selbe.
EDIT: Achso, Sinn und Zweck der Sache ist übrigens eine simple Kollisionserfrage mit intersects() zu ermögliche. Wenn jemand eine andere Methode zur Kollisionserkennung kennt, die nicht auf die Koordinaten angewiesen ist, ist das auch eine Hilfe nehme ich an.
Java:
import javax.swing.SwingUtilities;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.BorderFactory;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
public class Main {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
private static void createAndShowGUI() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new MyPanel());
f.pack();
f.setVisible(true);
}
}
class MyPanel extends JPanel {
public MyPanel() {
setBorder(BorderFactory.createLineBorder(Color.black));
}
@Override
public Dimension getPreferredSize() {
return new Dimension(800, 600);
}
@Override
public void paintComponent(Graphics g) {
//Upcast --> mehr Funktionen in Graphics2D
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
//neue Transformation erstellen
AffineTransform tx = new AffineTransform();
//ein Testrechteck:
Rectangle2D.Double r = new Rectangle2D.Double(50, 50, 200, 200);
System.out.println("Rechteck rot: " + r);
//r vor Transformation:
g2d.setColor(Color.red);
g2d.fill(r);
//Transformationen konkatenieren
tx.rotate(60 * Math.PI / 180.0, r.getCenterX(), r.getCenterY());
tx.translate(100, 0);
//Transformation anwenden
g2d.transform(tx);
//r nach Transformation:
g2d.setColor(new Color(0, 180, 0, 200));
g2d.fill(r);
System.out.println("Rechteck grün: " + r);
}
}
Zuletzt bearbeitet: