Grafik rotieren

Maxim6394

Bekanntes Mitglied
ich versuche hier die ganze zeit eine einfache grafik zu rotieren.
hier der code:

Code:
public void paint(Graphics g)
	{
		Graphics2D g2=(Graphics2D)g;
		img=getToolkit().getImage("C:\\projekte\\project2\\src\\pfeil.gif");	
	
		
		g2.rotate(90,82,82);
	
		g2.drawImage(img,50,50,this);
	}
egal was ich mache, es wird nie so rotiert wie es soll. es ist immer irgendwie schräg, aber nicht 90° wie ich es bei rotate angegeben hab. die grafik ist 64 pixel breit und hoch.
kann mir jemand erklären wie es geht?
 
Nebenbei: Das Bild bei jedem neuzeichnen neu zu laden ist :autsch: Man sollte es einmal im Konstruktor laden, und in der paint-Methode möglichst NUR zeichnen.
 
ich verstehs immernoch nicht. was für ein bogenmaß soll ich wo benutzen? ich hab da nur eine grafik deren höhe und breite ich kenne.
 
hab grad rausgefunden dass man mit Math.toRadians() es einfach von grad in bogenmaß umrechnen kann, damit funktioniert es dann endlich wie es soll.
 
noch ein kleines Problem:
ich hab 2 oder mehr verschiedene bilder die ich auf dem JPanel darstellen will. irgendwie klappt es aber nicht so richtig beide einzelnd zu rotieren.
das eine rotiert das andere immer mit, obwohl ich für jedes der beiden bilder ein anderes Graphics2D objekt erstellt hab.

in einer for schleife hab ich zuerst das:
Code:
Graphics2D missile=(Graphics2D)g;
		missile m=(missile)ms.get(i);	
		missile.rotate(Math.toRadians(playerRotation),m.getX(),m.getY());
 		missile.drawImage(m.getImg(),m.getX(),m.getY(),null);

die rotation funktioniert schonmal.
danach wird noch das andere bild gezeichnet:

Code:
 Graphics2D g2d2=(Graphics2D)g;
	g2d2.rotate(Math.toRadians(playerRotation),p.getX()+p.getBounds().width/2,p.getY()+p.getBounds().height/2);

	g2d2.drawImage(p.getImg(),p.getX(),p.getY(),null);

das zweite wird also durch den rotationsbefehl vom ersten bild mit rotiert.
wie kann man das lösen?
 
Mit '=' wird bei Objekten nur die Referenz, aber nicht das Objekt selber editiert, was heisst, du hast 3 Referenzen (g, missile, g2d2),
die alle auf das selbe Objekt verweisen. Die Transformation zurücksetzen kannst du soviel ich weiss mit
Code:
missile.setTransform(new Affine Transform());
 
Die Transformation zurücksetzen kannst du soviel ich weiss mit ...

Nein... Siehe die Doku dazu. Die setTransform ist NUR um eine vorher gespeicherte Transform wiederherzustellen.

Um die Dinger einzeln zu drehen, kann man entweder die Transform speichern und später wieder herstellen, oder neue Graphics-Objekte verwenden, also grob entweder
Java:
AffineTransform original = g.getTransform();
g.rotate(...);
g.drawImage(firstImage...);
g.setTransform(original);
g.rotate(...);
g.drawImage(secondImage...);
g.setTransform(original);
oder
Java:
Graphics2D temp0 = g.create();
temp0.rotate(...);
temp0.drawImage(firstImage...);
temp0.dispose();

Graphics2D temp1 = g.create();
temp1.rotate(...);
temp1.drawImage(secondImage...);
temp1.dispose();

Was "besser" ist, hängt auch davon ab, was dort noch alles gemacht wird. Für einfaches Rotieren würde es wohl das erste tun.
 
es besteht trotzdem noch das problem dass ich nicht schaffe die geschosse von der figur korrekt zu rotieren.
da ist eine arraylist wo alle geschosse gespeichert werden sobald space gedrückt wird. sie werden immer in eine der vier himmelsrichtungen norden, osten, süden und western abgeschossen. die richtung wird dabei beim erstellen eines missile objekts per string übergeben.
das abfeuern der dinger funktioniert soweit gut, das einzige was noch fehlt ist die korrekte rotation. sie sollen entweder um 0,90,180 oder -90 grad rotiert werden. jemand ne idee?
 
ich hab die methode hier veruscht, die ich irgendwo gefunden hab:
Code:
	 public static BufferedImage rotateImage(BufferedImage src, double degrees) {
	        AffineTransform affineTransform = AffineTransform.getRotateInstance(
	                Math.toRadians(degrees),
	                src.getWidth() / 2,
	                src.getHeight() / 2);
	        BufferedImage rotatedImage = new BufferedImage(src.getWidth(), src
	                .getHeight(), src.getType());
	        Graphics2D g = (Graphics2D) rotatedImage.getGraphics();
	        g.setTransform(affineTransform);
	        g.drawImage(src, 0, 0, null);
	        return rotatedImage;
	    }

die höhe des bildes ist 8,wie es auch korrekt ausgegeben wird. trotzdem seh ich bei jedem ausgegeben bild nicht mehr als einen pixel.
 

Zurück
Oben