Objekt durch Tasteneingabe mehrmals drehen

Hallo, ich möchte ein BufferedImage durch Tastendruck drehen.

Das klappt soweit auch, das Problem ist nur, dass ich das ganze nur 1x drehen kann.

Ich weiß auch mehr oder weniger woran es liegt und zwar daran, dass immer der gleiche x, y Parameter + die gleiche Rotationsgröße übergeben wird.


Das Problem ist nun, dass ich die Rotationsgröße ändern kann, dann wird das Bild aber ungleichmäßig gedreht. Es soll aber gleichmäßig gedreht werden.

Hier mal der Code:

Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.Transparency;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

public class Bewegung extends JFrame implements KeyListener {
	int richtung = 1;
	int x = 50;
	int y = 50;
	double i = 1;
	int neuesBild = 0;

	public Bewegung(String newTitel) {
		super.setTitle(newTitel);
		super.addKeyListener(this);
	}

	public static void main(String str[]) {
		Bewegung fenster = new Bewegung("a");
		fenster.setSize(500, 500);
		fenster.setVisible(true);
	}

	public void paint(Graphics g) {
		super.paint(g);
		BufferedImage myPicture = null;
		try {
			// switch (richtung) {
			// case 0:
			System.out.println("a");

			myPicture = ImageIO.read(new File(
					"D://dev//workspaces//ps//ST//src//car.jpg"));

			// AffineTransform at = new AffineTransform();
			// at.translate(getWidth() / 2, getHeight() / 2);
			// at.rotate(Math.PI / 4);
			// at.scale(0.5, 0.5); // evt entfernen
			// at.translate(-myPicture.getWidth()/2, -myPicture.getHeight()/2);

			/*
			 * break; case 1: myPicture = ImageIO.read(new File(
			 * "D://dev//workspaces//ps//ST//src//carD.jpg")); break; case 2:
			 * myPicture = ImageIO.read(new File(
			 * "D://dev//workspaces//ps//ST//src//carL.jpg")); break; case 3:
			 * myPicture = ImageIO.read(new File(
			 * "D://dev//workspaces//ps//ST//src//carU.jpg")); break; }
			 */
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if (richtung == 0) {
			AffineTransform at = new AffineTransform();
			at.translate(100, 100); // Position, wo das Bild gezeichnet wird
			at.rotate(Math.PI / 9); // Größe der Rotation
			// at.scale(0.5, 0.5); // evt entfernen
			// at.translate(-myPicture.getWidth()/2, -myPicture.getHeight()/2);

			Graphics2D g2d = (Graphics2D) g;
			g2d.drawImage(myPicture, at , null);
		} else {
			
			g.drawImage(myPicture, 100, 100, null);
		}
		// g.setColor(new Color(0, 0, 0));
		// g.drawOval(x, y, 100, 100);
	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
		System.out.println("A");

		if (e.getKeyCode() == e.VK_RIGHT) {
			x = x - 5;
			i = i + 0.1;
			richtung = 0;

		} else if (e.getKeyCode() == e.VK_LEFT) {
			x = x - 5;
			richtung = 2;
		} else if (e.getKeyCode() == e.VK_UP) {
			y = y - 5;
			richtung = 3;

		} else if (e.getKeyCode() == e.VK_DOWN) {
			y = y + 5;
			richtung = 1;
		}

		repaint();
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub

	}

}
 
S

SlaterB

Gast
nicht in der paint-Methode zig Mal (bei jedem Zeichnen!) das Bild neu laden, das mache einmal am Anfang im Konstruktor,
in einem Attribut merken

bisher unterscheidest du zwischen Richtung 0 = eine bestimmte Rotation vs. ansonsten keine Rotation, richtig?
und du suchst insgesamt 4 verschiedene Darstellungen, also noch zwei weitere Rotationen?

es ist nicht besonders ersichtlich was dabei dein Problem ist,
vorerst musst du gar nicht Position/ Tastendruck usw. verwenden, male doch einfach einfach testweise
das Bild an 4 Stellen in allen Varianten,
wie du rotieren hast kann ich vorerst selber nicht sagen, müsste ich testen,

zu bedenken ist vielleicht, dass um den 0-Punkt gedreht wird, also nach links oder oben außerhalb des sichtbaren Bereichs,
übe vielleicht doch lieber nur mit einem Bild, aber ein bisschen größeres,
teste nacheinander was (ohne translate() ) bei
at.rotate(1* Math.PI / 30);

at.rotate(2* Math.PI / 30);

at.rotate(2* Math.PI / 30);
usw. zu sehen ist, in welche Richtung sich das Bild dreht usw.,
danach/ daneben den Einfluss von translate() genau austesten,
Anleitungen zu lesen mag auch nicht verkehrt sein

falls ich mich gerade völlig verspekuliere und AffineTransform bekannt ist,
dann bitte mich neu zurechtweisen, wohin die Frage geht
 
Ah vielen Dank, das hat mir geholfen :).

Nun ist noch die Frage, wie bekomme ich den Mittelpunkt (Also der Punkt, wo sich das Objekt drum herum dreht) an eine andere Position.

Mein Image ist zb. ein Auto. Dann möchte ich nicht, dass der Mittelpunkt hinten links am Kofferraum (0,0 Koordinate) sondern in der Mitte des Kofferraums liegt.
 
S

SlaterB

Gast
ich schätze erst ein translate um paar Pixel,
es wird immer noch um 0,0 gedreht nur muss genau dort der richtige Pixel des Bildes sein,
dann ein rotate, und dann das große translate auf die Zielposition in der Zeichenfläche
 
Ok, also so ganz verstehen tu ichs nicht.

Java:
if (richtung == 0) {
			AffineTransform at = new AffineTransform();
			at.translate(100,100); // Position, wo das Bild gezeichnet wird
			at.rotate(x*Math.PI / 30); // Größe der Rotation
			//at.translate(50,50); // Position, wo das Bild gezeichnet wird

			// at.scale(0.5, 0.5); // evt entfernen
			// at.translate(-myPicture.getWidth()/2, -myPicture.getHeight()/2);

			Graphics2D g2d = (Graphics2D) g;
			g2d.drawImage(myPicture, at , null);
		} else {
			
			g.drawImage(myPicture, 100, 100, null);
		}

So hab ichs jetzt.

Er dreht sich auch an der richtigen Position.

Nur ist aber das Problem, dass mein Bild beim start nach rechts zeigt (Das ist auch richtig), wenn ich es aber drehe, dreht es sich nicht direkt nach rechts unten, sondern erst nach rechts oben und dann nach rechts unten.

praktisch so:

Startbild:
_

Erste Drehung:
/

Zweite Drehung:
_

Dritte Drehung

\

E: Ok Fehler gefunden (mehr oder weniger). Ich hab einfach das Startbild herausgenommen.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
mit "erst ein translate um paar Pixel, es wird immer noch um 0,0 gedreht nur muss genau dort der richtige Pixel des Bildes sein, " lag ich jedenfalls falsch,
genau andersrum ist besser, erst zu 100,100 gehen, dann rotieren lässt bei mir das Bild schön im Kreis drehen
(jede Taste erhöht Richtung um 1, rotate(richtung * Math.PI / 9) )

um nicht um den Punkt links oben vom Bild zu drehen, sondern dessen Mitte, geht bei mir anscheinend

Java:
 g2d.setTransform(at);
 g2d.drawImage(p, -p.getWidth(null)/2, -p.getHeight(null)/2, null);
mit Image 'p',
aufpassen dass danach at für den Rest des paints noch gesetzt ist..

aber allzu viel habe ich damit noch nicht gemacht
 
Wow, vielen Dank :).

Jetzt kommt die Große letzte Frage: Wie bringe ich das Objekt dazu sich nicht mehr zu drehen, sondern nach links und rechts zu bewegen (Blickrichtung ist egal, bewegen an sich soll es sich).

Weil dazu darf er das Bild ja nicht mehr drehe und muss die Position + Blickrichtung beibehalten.
 
S

SlaterB

Gast
wie gesagt wird anscheinend erst an der richtigen Position gedreht,
also kannst du statt zu 100,100 auch zu 100,155 translaten und dann wieder nach Süden drehen oder was auch immer
 
S

SlaterB

Gast
der Listener erhöht y um 1,
das paint, was immer von einer leeren Zeichenfläche beginnt, nicht vom vorherigen Bild (auch denkbar, ne andere Variante)
berücksichtigt im translate diese Positionsänderung, das Rotieren muss immer noch stattfinden
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Swing Durch Usereingabe neues Objekt AWT, Swing, JavaFX & SWT 2
F 2D-Grafik Objekt durch Einwirkung einer Kraft im Raum bewegen AWT, Swing, JavaFX & SWT 14
_user_q Objekt.setSelected(false), wenn es nicht mehr fokussiert wird AWT, Swing, JavaFX & SWT 2
B mit maus Objekt bewegen AWT, Swing, JavaFX & SWT 3
U Was genau ist das Objekt einer affinentransformation? AWT, Swing, JavaFX & SWT 1
U Was genau ist ein Shape-Objekt? AWT, Swing, JavaFX & SWT 3
DonBronson Objekt bewegen (Mausposition) AWT, Swing, JavaFX & SWT 3
B JavaFX Prüfen ob ein Objekt sich mehrmals in einer Liste befindet AWT, Swing, JavaFX & SWT 5
DonBronson Gezeichnetes Objekt verschwindet nachdem erneut gezeichnet wird AWT, Swing, JavaFX & SWT 8
U Was ist ein Shape, also klar ein Objekt, aber was ist damit gemeint (Graphics2d)? Und was sidn affinetransformationen AWT, Swing, JavaFX & SWT 1
Jose05 zugreifen auf ein Objekt eines GridPanes AWT, Swing, JavaFX & SWT 0
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
C Objekt an paintComponent weitergeben AWT, Swing, JavaFX & SWT 1
M Swing Objekt Array in GUI ausgeben AWT, Swing, JavaFX & SWT 1
A Objekt von einem Window erstellen? AWT, Swing, JavaFX & SWT 8
F Java FX Von der Fxml Datei zum Objekt AWT, Swing, JavaFX & SWT 8
K Color-Objekt erzeugen in CMYK AWT, Swing, JavaFX & SWT 2
T Frage zu GUI - Button soll Objekt erfassen AWT, Swing, JavaFX & SWT 2
A Swing Null Pointer Exception obwohl Objekt initialisiert AWT, Swing, JavaFX & SWT 21
J gezeichnetes Objekt anklicken AWT, Swing, JavaFX & SWT 10
thet1983 JavaFX TableView Objekt Daten anzeige AWT, Swing, JavaFX & SWT 2
Z Swing Variable eines Objekt aus Hashmap in JList anzeigen AWT, Swing, JavaFX & SWT 1
M Mouse Click Event ohne ein JComponent Objekt AWT, Swing, JavaFX & SWT 3
L JavaFX als eigenes Objekt AWT, Swing, JavaFX & SWT 3
M [JavaFX] Objekt um Zentrum rotieren (Camera) AWT, Swing, JavaFX & SWT 1
E JavaFx Screne mehr als ein "Objekt" zuordnen ? AWT, Swing, JavaFX & SWT 2
J Bilder als Variable an einem Objekt speichern AWT, Swing, JavaFX & SWT 3
B Event Handling MouseListener Behält seine Variablen, auch wenn ich ein neus Objekt erstelle AWT, Swing, JavaFX & SWT 2
C Graphics Objekt in Zeitschleife zeichnen AWT, Swing, JavaFX & SWT 4
P Event Handling Anfängerfrage: ActionEvent bekommt kein Zugriff auf Objekt AWT, Swing, JavaFX & SWT 3
R Array aus einem Objekt auslesen AWT, Swing, JavaFX & SWT 4
V 2D-Grafik Frage zum Graphics Objekt AWT, Swing, JavaFX & SWT 2
A AWT TTF-Datei zu Font-Objekt finden? AWT, Swing, JavaFX & SWT 5
E Swing Objekt zu Position (Point) bewegen AWT, Swing, JavaFX & SWT 2
T 3D-Grafik (Java3D) Aus einem Objekt einer Szene (Würfel, Ebene) die wichtigen Randkoordinaten auslesen AWT, Swing, JavaFX & SWT 3
K Action Listener implementieren über Objekt AWT, Swing, JavaFX & SWT 14
Java-Insel LayoutManager Ein GridBagLayout-Objekt für mehrere Panels? AWT, Swing, JavaFX & SWT 2
V Persistentes Objekt laden Progressbar AWT, Swing, JavaFX & SWT 7
F Canvas Objekt außerhalb des Frames zeichnen AWT, Swing, JavaFX & SWT 3
Furtano AWT paint braucht ein Graphics Objekt ? AWT, Swing, JavaFX & SWT 2
propra Schnittpunkt zwischen Objekt und Kante finden AWT, Swing, JavaFX & SWT 24
L Graphics Objekt - aus anderer Klasse aufrufen / übergeben AWT, Swing, JavaFX & SWT 5
S Objekt einmal laden zweimal anzeigen 3d AWT, Swing, JavaFX & SWT 6
I Swing Zugriff auf ein Objekt AWT, Swing, JavaFX & SWT 2
F Nur ein Objekt auf Canvas neu zeichnen AWT, Swing, JavaFX & SWT 4
R Möglichkeiten ein abgeleitetes Objekt zu erzeugen AWT, Swing, JavaFX & SWT 4
P Swing Wie bekomme ich eine Referenz auf ein Objekt das im EDT erzeugt wird? Und anderes... AWT, Swing, JavaFX & SWT 8
T Objekt in Kreisbahn bewegen AWT, Swing, JavaFX & SWT 5
B Zeichnen von Bildern auf JPanel aus eigenem Objekt AWT, Swing, JavaFX & SWT 19
V Parameter an Runnable-Objekt übergeben AWT, Swing, JavaFX & SWT 6
Dit_ Objekt mit ActionEvent übergeben AWT, Swing, JavaFX & SWT 2
S Unterscheiden ob ein Graphics-Objekt von einer JComponent oder einem BufferedImage kommt..? AWT, Swing, JavaFX & SWT 4
L Swing Auf unabhängiges Image-Objekt zeichnen AWT, Swing, JavaFX & SWT 8
A SWT SWT - Unbekannte Fläche (Objekt) erscheint im Composite AWT, Swing, JavaFX & SWT 6
D Objekt mit Button erstellen und mit anderem Button verwenden AWT, Swing, JavaFX & SWT 4
P Objekt kopieren AWT, Swing, JavaFX & SWT 2
M Graphics-Objekt aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2
U [MVC] Objekt bearbeiten AWT, Swing, JavaFX & SWT 9
O Swing JTable Colum Objekt AWT, Swing, JavaFX & SWT 6
Dit_ Ein Kreis als Graphics2D oder als Ellipse2D Objekt AWT, Swing, JavaFX & SWT 19
M Objekt im ActionListener ansprechen AWT, Swing, JavaFX & SWT 3
C Wie komme ich an ein Objekt aus einem JTree? AWT, Swing, JavaFX & SWT 10
R FlowLayout: 1 Objekt pro Zeile AWT, Swing, JavaFX & SWT 5
D Objekt (Map) in Textfeld ausgeben AWT, Swing, JavaFX & SWT 10
kirchrath Swing Aus ActionEvent Objekt herausfinden auf dem er ausgeführt wurde AWT, Swing, JavaFX & SWT 4
E Graphics2D: altes Objekt löschen, wenn repaint aufgerufen wird AWT, Swing, JavaFX & SWT 7
S Objekt wird während Endlosschleife nur einmal bewegt AWT, Swing, JavaFX & SWT 2
W Objekt-array als Raster visualisieren AWT, Swing, JavaFX & SWT 3
F Herausfinden, auf welchem Objekt der Fokus liegt AWT, Swing, JavaFX & SWT 2
G Tooltip Text für ein Shape Objekt AWT, Swing, JavaFX & SWT 2
D DnD ganzer Objekte(Objekt erstellen) AWT, Swing, JavaFX & SWT 2
G Wie ziehe ich ein Objekt aus einer JList? AWT, Swing, JavaFX & SWT 7
O JTable mit objekt-daten füllen AWT, Swing, JavaFX & SWT 4
B in jList feld aus einem objekt anzeigen AWT, Swing, JavaFX & SWT 2
R SWT color Objekt AWT, Swing, JavaFX & SWT 4
K Graphics-Objekt zeichnet nicht alle Bilder AWT, Swing, JavaFX & SWT 3
N Graphics Objekt "puffern" AWT, Swing, JavaFX & SWT 7
L Objekt in JComboBox einfügen AWT, Swing, JavaFX & SWT 2
S JComboBox, ein Renderer und das selektierte Objekt AWT, Swing, JavaFX & SWT 4
R Graphics Objekt ändern AWT, Swing, JavaFX & SWT 11
B actionPerformed reagiert nicht auf das Canvas-objekt AWT, Swing, JavaFX & SWT 11
J DocumentListener uebergibt Objekt; wie in JTextfield casten? AWT, Swing, JavaFX & SWT 3
B Objekt in "actionPerformed" erzeugen und nutzen AWT, Swing, JavaFX & SWT 3
P JSpinner Objekt anstatt Zahlen sollen man Namen auswählen AWT, Swing, JavaFX & SWT 2
B Ein Image Objekt drehen? AWT, Swing, JavaFX & SWT 2
G Referenz über MenuItem aus ActionListener auf das Objekt AWT, Swing, JavaFX & SWT 8
lin Welches Objekt für einen About-Dialog verwenden? AWT, Swing, JavaFX & SWT 2
R Selectable Graphics Objekt gesucht. AWT, Swing, JavaFX & SWT 5
Wildcard FontMetrics ohne Graphics-Objekt AWT, Swing, JavaFX & SWT 13
S objekt kann methode der aufrufenden klasse nicht aufrufen AWT, Swing, JavaFX & SWT 2
Y Objekt in JFrame AWT, Swing, JavaFX & SWT 3
M Objekt in TableCellRenderer packen, warum ein Fehler? AWT, Swing, JavaFX & SWT 2
K Objekt in eine bestimmte Zelle eines JTables legen AWT, Swing, JavaFX & SWT 3
D getResource() bei Image-Objekt AWT, Swing, JavaFX & SWT 9
A Problem mit dem graphics-Objekt AWT, Swing, JavaFX & SWT 8
D in neues Image-Objekt zeichnen AWT, Swing, JavaFX & SWT 3
E warum erkennt er das objekt nicht???? AWT, Swing, JavaFX & SWT 4
G Fehler bei BasicStroke Objekt AWT, Swing, JavaFX & SWT 2
G Zurgriff auf Objekt über event.getComponent AWT, Swing, JavaFX & SWT 3
P JTextfield Text durch Keylistener verändern AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben