Rundenstrategiespiel - Problem beim Drehen eines Bildes

Status
Nicht offen für weitere Antworten.

Neolity

Aktives Mitglied
Hallo,

ich beschäftige mich zur Zeit ein wenig mit einem kleinen Rundenstrategiespiel.
Dabei bin ich im Augenblick so weit, dass eine Einheit (ein .png Bild) über ein schachbrettartiges Spielfeld gesteuert wird.
(gesteuert wird über mehrere Buttons, die Pfeilbilder als ImageIcons haben, damit man die Richtung erkennen kann)
Nun wollte ich es so machen, dass die Einheit nicht nur in eine Richtung schaut, sondern sich immer passend zur "Fahrtrichtung" dreht. Mein erster Gedanke war einfach 8 Bilder der Einheit für alle Richtungen zu erstellen. Das würde mir aber bei mehreren Einheiten etwas zu aufwendig. Daher mein Gedanke das Bild einfach zu drehen.
Der Code Abschnitt dafür sieht im Augenblick so aus:
Code:
		eins.img = getToolkit().getImage("images/Einheiten/Panzer/Panzer.png");
  		Graphics2D g2d = (Graphics2D) g;
  		AffineTransform aft = new AffineTransform();
  		aft.rotate(Math.toRadians(90));
		g2d.drawImage(eins.img, aft, null);
(eins ist die Instanz meiner "Einheit" Klasse)
Das Problem ist, dass ich vorher bei drawImage die Koordinaten für die Position der Einheit angegeben habe.
Die Frage ist nun, wie ich das jetzt machen soll, sprich gleichzeitig rotieren und Positionsangabe?

Vielen Dank!
 

w00t

Aktives Mitglied
Normalerweise kann man ein 2D bild nicht drehen. Du kannst es natürlich vertikal und horizontal drehen, aber so wie ich das verstanden habe brauchst du ein Bild, sagen wir von einem Pferd, von vorne, hinten, links, rechts, und die anderen 4 richtungen. Das geht nicht mit einem Bild, da in einem normalen Bild diese Informationen nicht verfügbar sind, wegen: 2D, nicht 3D
 

LoN_Nemesis

Bekanntes Mitglied
Wenn es ein schachbrettartiges Spielfeld ist, dann denke ich mal dass man es aus einer Art Vogelperspektive betrachtet. Wenn das so ist, dann macht Rotieren durchaus Sinn, allerdings sehe ich das Problem irgendwie nicht. Die Position deiner Einheit verändert sich doch nicht, wenn du das Bild drehst.

Vielleicht kannst du nochmal einen Screenshot oder Code zeigen, auf dem dein Problem deutlich wird.

EDIT: Ach jetzt verstehe ich dein Problem. Du malst dein Bild oben im Code mit
Code:
g2d.drawImage(eins.img, aft, null);
Und da gibst du nur die Transformation an, aber keine Koordinaten mehr.

Die Lösung dafür ist folgendes. Du musst das Bild 2mal malen. Einmal temporär in ein Zwischenimage, dort drehst du dann. Und dann zeichnest du dieses gedrehte Bild wieder auf den Bildschirm.

Wenn du magst, kannst du auch einfach die Klasse benutzen, die ich am Ende des Threads 2D Projektil Flugbahn gepostet habe. Die macht das alles für dich.
 

Neolity

Aktives Mitglied
hmm, ich hab mir mal deine Klasse angeschaut! :)
Aber ich werde da im Grunde gar nicht schlau draus! :(
Ich habe bisher das hier zusammengecodet:
eins.img = getToolkit().getImage("images/Einheiten/Panzer/Panzer.png");
BufferedImage temp_neues_bild = new BufferedImage(50, 50, BufferedImage.TYPE_INT_ARGB);
BufferedImage neues_bild = new BufferedImage(50, 50, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = (Graphics2D) g;
AffineTransform aft = new AffineTransform.getRotateInstance(Math.toRadians(90), 25, 25);
Graphics2D g1 = temp_neues_bild.createGraphics();
g1.drawImage(eins.img, 25, 25, null);
Graphics2D g2 = neues_bild.createGraphics();
g2.setTransform(aft);
g2d.drawImage(neues_bild, eins.x, eins.y, this);
Einziges Proglem dabei: Es funktioniert nicht!
Zum einen bekomme ich eine Fehlermeldung, dass er "getRotateInstance" nicht kennt und zum anderen tut sich auf dem Bildschirm einfach gar nichts. Da wird kein einziges Bild ausgegeben! :(
 

LoN_Nemesis

Bekanntes Mitglied
Ich hatte das Problem auch am Anfang, eigentlich sollte es so gehen aber tut es nicht. Versuch mal statt getToolkit().getImage("images/Einheiten/Panzer/Panzer.png"); das Bild mit der ImageIO zu laden, dann bekommst du gleich ein BufferedImage
Code:
ImageIO.read("images/Einheiten/Panzer/Panzer.png");
. Eigentlich sollte es auch gehen, wenn du erst das normale Image in ein BufferedImage reinmalst, aber das funktionierte bei mir auch nicht.

Edit: es kann sein, dass es .getRotateInstance erst ab Java 1.5 gibt
 

Neolity

Aktives Mitglied
hmm, ich hab es jetzt so gemacht:
Code:
		try
		{
			eins.img =  ImageIO.read("images/Einheiten/Panzer/Panzer.png");
		}
		catch (IOException e)
		{

		}
		BufferedImage temp_neues_bild = new BufferedImage(50, 50, BufferedImage.TYPE_INT_ARGB);
		BufferedImage neues_bild = new BufferedImage(50, 50, BufferedImage.TYPE_INT_ARGB);
  		Graphics2D g2d = (Graphics2D) g;
  		AffineTransform aft = new AffineTransform.getRotateInstance(Math.toRadians(90), 25, 25);
  		Graphics2D g1 = temp_neues_bild.createGraphics();
  		g1.drawImage(eins.img, 25, 25, null);
  		Graphics2D g2 = neues_bild.createGraphics();
		g2.setTransform(aft);
		g2d.drawImage(neues_bild, eins.x, eins.y, this);
Er findet aber angeblich die Methode read nicht.
Dabei hab ich folgendes eingebunden:
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.geom.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.IOException;
 

LoN_Nemesis

Bekanntes Mitglied
Sorry mein Fehler, der read Methode muss man entweder ein File, einen InputStream oder eine URL übergeben, einfach nur ein String geht nicht.

P.S.: Hast du eigentlich Java 1.5? Wenn nicht lohnt es sich vielleicht upzudaten.
 

Neolity

Aktives Mitglied
Aber mein Bild ist doch ein File?!
Wie bekomme ich das Bild denn in ein File bzw. einen InputReader bzw. ganz platt gefragt, was muss ich tun? :)
 

LoN_Nemesis

Bekanntes Mitglied
Du schreibst einfach:

Code:
eins.img =  ImageIO.read(new URL("images/Einheiten/Panzer/Panzer.png"));
 

Neolity

Aktives Mitglied
Vielen Dank schon mal! :)

Es sieht jetzt so aus:
Code:
		try
		{
			eins.img =  ImageIO.read(new URL("images/Einheiten/Panzer/Panzer.png"));
		}
		catch (IOException e)
		{

		}
		BufferedImage temp_neues_bild = new BufferedImage(50, 50, BufferedImage.TYPE_INT_ARGB);
		BufferedImage neues_bild = new BufferedImage(50, 50, BufferedImage.TYPE_INT_ARGB);
  		Graphics2D g2d = (Graphics2D) g;
  		AffineTransform aft = new AffineTransform.getRotateInstance(Math.toRadians(90), 25, 25);
  		Graphics2D g1 = temp_neues_bild.createGraphics();
  		g1.drawImage(eins.img, 25, 25, null);
  		Graphics2D g2 = neues_bild.createGraphics();
		g2.setTransform(aft);
		g2d.drawImage(neues_bild, eins.x, eins.y, this);

Aber es funktioniert immer noch nicht. Ich hab immer noch den Fehler, dass er getRotateInstance nicht findet... :(
 

LoN_Nemesis

Bekanntes Mitglied
Das macht nichts, du kannst das ersetzen durch:

Code:
AffineTransform aft = new AffineTransform();
        aft.rotate(Math.toRadians(90), 25, 25);

Sollte völlig identisch sein.
 

LoN_Nemesis

Bekanntes Mitglied
Probier mal nur eins.img zu zeichnen, nachdem du es mit ImageIO eingelesen hast, also ohne irgendwelche Transformationen, klappt das denn?
 

Neolity

Aktives Mitglied
Nein, das alleine funzt schon ned!

Der Code Abschnitt sieht so aus:
Code:
		try
		{
			eins.img =  ImageIO.read(new URL("images/Einheiten/Panzer/Panzer.png"));
		}
		catch (IOException e)
		{
 

LoN_Nemesis

Bekanntes Mitglied
Versuch mal folgendes:


Code:
eins.img =  ImageIO.read(new File("./images/Einheiten/Panzer/Panzer.png"));

natürlich auch wieder im try/catch Block
 

Neolity

Aktives Mitglied
hmm, ohne irgendwas zu drehen funktioniert das mit dem File laden. Wenn ich aber rotiere, dann wird gar kein Bild mehr angezeigt... :(

Sieht jetzt insgesamt so aus:

Code:
		try
		{
			eins.img =  ImageIO.read(new File("images/Einheiten/Panzer/Panzer.png"));
		}
		catch (IOException e)
		{

		}
		BufferedImage temp_neues_bild = new BufferedImage(50, 50, BufferedImage.TYPE_INT_ARGB);
		BufferedImage neues_bild = new BufferedImage(50, 50, BufferedImage.TYPE_INT_ARGB);
  		Graphics2D g2d = (Graphics2D) g;
  		AffineTransform aft = new AffineTransform();
  		aft.rotate(Math.toRadians(90), 25, 25);
  		Graphics2D g1 = temp_neues_bild.createGraphics();
  		g1.drawImage(eins.img, 25, 25, null);
  		Graphics2D g2 = neues_bild.createGraphics();
		g2.setTransform(aft);
		g2d.drawImage(neues_bild, eins.x, eins.y, this);
 

LoN_Nemesis

Bekanntes Mitglied
Versuchs mal damit:

Code:
		try
		{
			eins.img =  ImageIO.read(new File("images/Einheiten/Panzer/Panzer.png"));
		}
		catch (IOException e)
		{

		}
		BufferedImage temp_neues_bild = new BufferedImage(50, 50, BufferedImage.TYPE_INT_ARGB);
		BufferedImage neues_bild = new BufferedImage(50, 50, BufferedImage.TYPE_INT_ARGB);
  		Graphics2D g2d = (Graphics2D) g;
  		AffineTransform aft = new AffineTransform();
  		aft.rotate(Math.toRadians(90), 25, 25);
  		Graphics2D g1 = temp_neues_bild.createGraphics();
  		g1.drawImage(eins.img, 0, 0, null);
  		Graphics2D g2 = neues_bild.createGraphics();
		g2.setTransform(aft);
		g2.drawImage(temp_neues_bild, 0, 0, null);
		g2d.drawImage(neues_bild, eins.x, eins.y, this);

Btw: die 2 neuen BufferedImages brauchst du nur, wenn du nicht um vielfache von 90° drehst, denn dann hat dein Endbild eine andere Grösse als das Ausgangsbild.
 

Neolity

Aktives Mitglied
Wenn ich diese Zeile noch einfüge:
Code:
      	g2.drawImage(temp_neues_bild, 0, 0, null);
dann erscheint ein kleiner Teil des Bildes auf dem Bildschirm. Ändere ich die beiden nullen aber in eins.x oder eins.y oder irgendwelche Zahlenwerte ab, dann passiert nichts! ???:L
 

LoN_Nemesis

Bekanntes Mitglied
Ja das ist genau das Problem mit dem Rotieren, deswegen habe ich mir die genannte Klasse geschrieben. Die berechnet diese Verschiebungen und zeigt das Bild (so gut wie) immer richtig an.

Code:
g2.drawImage(temp_neues_bild, 0, 0, null);

Diese Nullen darf du nicht in eins.x, eins.y ändern. Hier malst du nur das Bild gedreht in ein Zwischenbild.

Code:
g1.drawImage(eins.img, 25, 25, null);

Hier sollten auch 0, 0 stehen meiner Meinung nach statt 25,25. Zumindest wenn du nur in 90° Winkeln drehst.

Code:
g2d.drawImage(neues_bild, eins.x, eins.y, this);

Erst hier malst du das eigentlich sichtbare Bild, deswegen muss hier eins.x, eins.y stehen.

Wenn du magst kannst du auch einfach meine Klasse komplett kopieren und bei dir benutzen. Ich glaube du willst ja im Endeffekt für jede Einheit 8 verschiedene Richtungen, wenn ich das richtig verstanden habe? Dann brauchst du auch 45° Winkel und da fangen die wirklichen Probleme erst an. Denn dann reicht es nicht dein BufferedImage so gross wie das Original zu machen, es muss größer sein.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Textbasiertes Rundenstrategiespiel Spiele- und Multimedia-Programmierung 33
A [HILFE] - Minecraft-Problem! Spiele- und Multimedia-Programmierung 1
C Plugin Problem Spiele- und Multimedia-Programmierung 2
J JLayer Problem Spiele- und Multimedia-Programmierung 1
Meeresgott LWJGL 3 Problem mit einer Texture Spiele- und Multimedia-Programmierung 4
G Low Poly 3D LWJGL Shader Problem Spiele- und Multimedia-Programmierung 4
O Problem beim Aufrufen des Spiels von einem Menü Spiele- und Multimedia-Programmierung 7
G LIBGDX Texturen Problem Spiele- und Multimedia-Programmierung 1
G LIBGDX Problem beim resizen des Frames Spiele- und Multimedia-Programmierung 3
C AutoClicker Problem Spiele- und Multimedia-Programmierung 2
S OOP Logik Problem Spiele- und Multimedia-Programmierung 5
G LIBGDX Viewport Problem Spiele- und Multimedia-Programmierung 3
J Problem mit Game Of Life Spiele- und Multimedia-Programmierung 3
N Problem mit 2D Spiel Spiele- und Multimedia-Programmierung 17
C Minecraft Minecraft Plugin Problem Spiele- und Multimedia-Programmierung 17
R Pong Spiel Problem Spiele- und Multimedia-Programmierung 1
V Problem mit BufferStrategy Spiele- und Multimedia-Programmierung 2
Streeber Problem mit Transparenz/TextDrawing in LWJGL/Slick2d (OpenGL) Spiele- und Multimedia-Programmierung 1
E A-Stern Algorithmus Problem und Implementierung einer Map Spiele- und Multimedia-Programmierung 6
T LWJGL 2.9.2: Seltsamer Effekt beim Rendern (VertexShader Problem?) Spiele- und Multimedia-Programmierung 3
W Generelles Problem: Entscheidungsfindung Spiele- und Multimedia-Programmierung 4
T Problem bei Kollisionsabfrage Spiele- und Multimedia-Programmierung 4
C Vier Gewinnt Problem mit Ordnerstruktur Spiele- und Multimedia-Programmierung 2
T Problem mit Eclipse (java)-(minecraft) Spiele- und Multimedia-Programmierung 3
I Textbasiertes Spiel - Umsetzungsfrage & Schleifen Problem Spiele- und Multimedia-Programmierung 26
M Sound Problem Spiele- und Multimedia-Programmierung 3
T Problem beim Aufbau des Spielfelds Spiele- und Multimedia-Programmierung 18
M Sound Engin Problem 2 Spiele- und Multimedia-Programmierung 2
J Problem bei der GUI - Zu viele Spielbretter Spiele- und Multimedia-Programmierung 2
D LWJGL gluLookAt "Umschauen" Problem Spiele- und Multimedia-Programmierung 0
D Problem mit Würfelanimierung in LWJGL Spiele- und Multimedia-Programmierung 7
C Zeldaklon Problem mit Wand-Kollision Spiele- und Multimedia-Programmierung 8
0 Boxen übereinander stapelt Problem Spiele- und Multimedia-Programmierung 5
D Textfield im Game ,Problem: while-Schleife Spiele- und Multimedia-Programmierung 3
R 2D platformer - enemy damage -> TIMER PROBLEM Spiele- und Multimedia-Programmierung 3
S LWJGL Kamera Problem - Alles verzerrt Spiele- und Multimedia-Programmierung 4
B LWJGL StackOverFlow Problem nach 30sekunden. (Pong) Spiele- und Multimedia-Programmierung 2
Seikuassi LWJGL-Problem Spiele- und Multimedia-Programmierung 2
L Minecraft Minecraft Plugin programmieren (Craftbukkit 1.7.2) Problem Spiele- und Multimedia-Programmierung 4
B Minecraft mehr Ram zuweißen Problem Spiele- und Multimedia-Programmierung 0
K Bukkit Plugin Problem Spiele- und Multimedia-Programmierung 3
Y Problem mit repaint() in run() Spiele- und Multimedia-Programmierung 2
X Kleines Problem mit Java Reflections und einem eigenen Eventhandler Spiele- und Multimedia-Programmierung 1
T Problem mit Kollisionsabfrage der NPC Spiele- und Multimedia-Programmierung 1
J Minecraft Problem mit dem JRE - Minecraft Spiele- und Multimedia-Programmierung 3
TheSorm Problem mit 2 classen NullPointerException Spiele- und Multimedia-Programmierung 1
S Problem mit 4 gewinnt(MinMax Algorithmus) Spiele- und Multimedia-Programmierung 2
N Problem in der Main.class Spiele- und Multimedia-Programmierung 1
J Blöcke, Hitboxen, Koolisionsabfrage - Problem Spiele- und Multimedia-Programmierung 8
S Problem mit 3d-Polygon Spiele- und Multimedia-Programmierung 2
A Problem mit Sound Spiele- und Multimedia-Programmierung 5
C Nxt Duell Problem Spiele- und Multimedia-Programmierung 4
F LWJGL Problem mit Erstellen eines Objekts und der Kamera Spiele- und Multimedia-Programmierung 5
ruerob Problem bei Fade-Out von Sounds Spiele- und Multimedia-Programmierung 3
L [Slick2D] Problem bei Speicherfreigabe Spiele- und Multimedia-Programmierung 2
M Bukkit Plugin Problem Spiele- und Multimedia-Programmierung 22
T Java3D Rendering Problem Spiele- und Multimedia-Programmierung 7
J Problem bei pixelgenauer Kollisionsabfrage Spiele- und Multimedia-Programmierung 10
F Problem mit dem Abspielen von byte[] (Audioprogrammierung) Spiele- und Multimedia-Programmierung 2
C Problem mit Abspielen von Audio-Dateien Spiele- und Multimedia-Programmierung 3
R Problem bei Farbe ändern/4Gewinnt Spiele- und Multimedia-Programmierung 5
R StringIndexOutOfBoundsException - Problem Spiele- und Multimedia-Programmierung 2
S Problem mit Sichtfeld/Licht in einem Raster Spiele- und Multimedia-Programmierung 5
G Acht-Damen-Problem HILFE! Spiele- und Multimedia-Programmierung 11
A TileMap KeyListener - Problem Spiele- und Multimedia-Programmierung 2
J Problem mit Threads Spiele- und Multimedia-Programmierung 8
N Problem mit Kollisionsabfrage beim Fallen Jump & Run Spiele- und Multimedia-Programmierung 5
S Problem mit Zeitsteuerung der Game Loop Spiele- und Multimedia-Programmierung 4
Fu3L Problem mit 3D Noise Spiele- und Multimedia-Programmierung 4
L Problem beim Rätsellöser Spiele- und Multimedia-Programmierung 3
D Problem beim bewegen einer Figur Spiele- und Multimedia-Programmierung 2
T Problem bei LinkedList / JPanel Spiele- und Multimedia-Programmierung 4
T Problem mit ClassLoader und LWJGL Spiele- und Multimedia-Programmierung 5
M Scrolling Repaint Problem Spiele- und Multimedia-Programmierung 2
Samake03 [Problem] layeredPane bzw. Viewport Spiele- und Multimedia-Programmierung 3
Helgon glTexParameter / glTexImage2D Problem Spiele- und Multimedia-Programmierung 11
T Jmonkey opengl problem Spiele- und Multimedia-Programmierung 13
M Problem mit Kamera (glMultMatrix (OpenGL/ LWJGL)/ Quaternionen) Spiele- und Multimedia-Programmierung 5
M Problem mit Gameserver / Datensynchronisation Spiele- und Multimedia-Programmierung 10
G Mein erstes minigame -> problem mit Methode Spiele- und Multimedia-Programmierung 3
X Geometry Wars Clone Problem Spiele- und Multimedia-Programmierung 4
H Problem mit JMonkeyEngine3 und OgreXML Spiele- und Multimedia-Programmierung 3
D [JOGL 2.0] Kleines Problem mit freier Flugsteuerung Spiele- und Multimedia-Programmierung 3
A JAVA3D TransformGroup <--> Group Problem Spiele- und Multimedia-Programmierung 3
U [JOGL 1.1.1a]Kleines Problem mit Text Overlays: Spiele- und Multimedia-Programmierung 19
T Problem mit JnR-Steuerung / KeyListener Spiele- und Multimedia-Programmierung 6
D Problem Mit Miensweeper Clone & rekursive Methode Spiele- und Multimedia-Programmierung 4
M Performance Problem bei BufferedImage Spiele- und Multimedia-Programmierung 7
T Problem mit Speicherverbrauch Spiele- und Multimedia-Programmierung 5
S Programmstruktur Problem! Spiele- und Multimedia-Programmierung 8
BattleMaster246 Problem mit Jogl Spiele- und Multimedia-Programmierung 14
C MP3 Handler-Problem Spiele- und Multimedia-Programmierung 13
C [gelöst] MP3-Codec-Problem Spiele- und Multimedia-Programmierung 2
K Schiebepuzzle Array Zufallszahlen Problem Spiele- und Multimedia-Programmierung 8
J Java 3D Problem Spiele- und Multimedia-Programmierung 2
G Eclipse Problem mit Java3d Spiele- und Multimedia-Programmierung 3
H Repaint-Problem mit Quaxlis Tutorial Spiele- und Multimedia-Programmierung 2
C Java Sound API Clip.Close() Problem Spiele- und Multimedia-Programmierung 1
K Problem beim Anzeigen von Bildern Spiele- und Multimedia-Programmierung 5
D Problem mit Überprüfung beim Lottospiel Spiele- und Multimedia-Programmierung 6

Ähnliche Java Themen

Neue Themen


Oben