2D-Grafik User-BufferedImage rotieren im Zentrum und ohne "anpassung"

Spytrycer

Mitglied
Hey Leute,

Ich hab das Problem das ich ein spezielles BufferedImage immer und solange die S taste gedrueckt ist rotieren will.

Ich verwende dafuer bisher folgenden Code

Java:
     public static BufferedImage rotateImageX(BufferedImage img, double angle) {
            double sin = Math.abs(Math.sin(Math.toRadians(angle))), cos = Math.abs(Math.cos(Math.toRadians(angle)));
            int w = img.getWidth(null), h = img.getHeight(null);
            int neww = (int) Math.floor(w * cos + h  * sin),newh = (int) Math.floor(h  * cos + w * sin);
            BufferedImage bimg = new BufferedImage(neww, newh,BufferedImage.TYPE_INT_ARGB);
            Graphics2D g = bimg.createGraphics();
            g.translate((neww - w) , (newh - h) );
            g.rotate(Math.toRadians(angle), w / 2, h / 2);
            g.drawRenderedImage(img, null);
            g.dispose();
            return bimg;
        }

Mein Bufferedimage lasse ich mit folgendem Code anzeigen

Code:
if (down)
 {
 g.drawImage(rotateImageX(ship_idle,rotation), (int)pos.xpos - width, (int)pos.ypos- height , width  , height , null);
                  rotation++;
}

Jedoch verschiebt sich mein BufferedImage (wird nicht im Zentrum rotiert UND wird beim drehen verkleinert:

Unrotiert:
image rotate.png
Wenn S gedrueckt wird:
image rotate2.png
zum vergleich basis und rotation:
image rotate3.png
 
Ich denke es ist viel einfacher, wenn du die Rotation "on the fly" machst, also beim Zeichnen. Das hat den Vorteil, dass du nicht jedesmal ein neues BufferedImage erstellen musst. Ich vermute es sieht dann auch flüssiger aus.
 
Am besten du hast einfach ein Objekt welches eine Koordinate hat und ein Winkel in Blickrichtung.
Der Winkel ist dann zwischen 0 und 2PI. Dann brauchst du nur eine Methode die das Objekt auf deinem Bildschirm darstellt. In jedem Frame wird das Bild neu gezeichnet und es wird immer die aktuelle Position und Blickrichtung gezeigt.
Das ganze solltest du dann am besten auf einem Canvas oder ähnlichen machen, statt mehrere Bilder übereinander zu zeichnen.
 

Zurück
Oben