Hallo, ich habe da ein etwas komplizierteres Problem:
Ich habe mir eine Klasse img erstellt, in der ein Bild und die dazugehörigen Werte gespeichert werden:
In meiner Panel Klasse wird dann ein Bild (hier wichtig: kanonen_rohr) erstellt und es gibt eine Methode zum rotieren:
In der Klasse Draw wird dann gezeichnet:
So jetzt habe ich das Kanonenrohr gezeichnet. Nun möchte ich, dass man dieses durch das Bewegen der Maus rotieren kann, sprich: wird die Maus nach oben bewegt, soll sich das Rohr gegen den Uhrzeigersinn drehen, bewegt man die Maus nach unten, so soll das Rohr mit dem Uhrzeigersinn gedreht werden. Dabei soll es sich um den Punkt der Halterung (Kreis in der Mitte drehen). Bild im Anhang. Bisher kann man das Bild, wenn man es nur einmal rotiert, zwar drehen, es rotiert aber um den falschen Punkt. Rotiert man es mehrfach, wird es immer kleiner unter verschwindet irgendwann.
Mein MouseMotionHandler:
Es tut mir leid, dass das jetzt so viel ist, ich bin aber wirklich am verzweifeln. Falls jemand eine funktionierende Rotation hat, würde ich diese natürlich auch gerne nehmen.
Vielen Dank!
EDIT: Ich habe die Klassen Panel und MouseMotionHandler jetzt so umgeschrieben, dass eine Rotation statfindet. Ich habe aber noch das Problem, dass die Seitenverhältnisse nicht stimmen und dann es nicht um den richtigen Punkt rotiert (Stand 12.12.2018, 17:23Uhr).
Ich habe mir eine Klasse img erstellt, in der ein Bild und die dazugehörigen Werte gespeichert werden:
Code:
package Data;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
public class img {
private int xPos, yPos, width, height;
private BufferedImage image;
private String path;
public img(int x, int y, int w, int h, String p) {
xPos = x;
yPos = y;
width = w;
height = h;
path = p;
try {
image = ImageIO.read(new File(this.path));
} catch (IOException e) {
System.out.println("ERROR! DAS BILD " + this.path + " KONNTE NICHT GELADEN WERDEN!");
}
}
public img(int x, int y, int w, int h, BufferedImage i) {
xPos = x;
yPos = y;
width = w;
height = h;
image = i;
}
public int x() {
return xPos;
}
public void setX(int xPos) {
this.xPos = xPos;
}
public int y() {
return yPos;
}
public void setY(int yPos) {
this.yPos = yPos;
}
public int width() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int height() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public BufferedImage image() {
return image;
}
public void setImage(BufferedImage image) {
this.image = image;
}
public String path() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}
In meiner Panel Klasse wird dann ein Bild (hier wichtig: kanonen_rohr) erstellt und es gibt eine Methode zum rotieren:
Code:
package Gui;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
import Data.img;
public class Panel extends JPanel {
private static final long serialVersionUID = 1L;
private img kanone_gestell = new img(20, 390, 120, 70, "rsc/img/kanone_gestell.png");
private img kanone_rohr = new img(20, 390, 120, 70, "rsc/img/kanone_rohr.png");
private double angle = 0;
BufferedImage kanone_rohr_base;
private img test = new img(20, 390, 120, 70, rotateImageX(kanone_rohr.image(), 19));
Draw draw = new Draw(this, kanone_gestell, kanone_rohr);
public Panel() {
try {
kanone_rohr_base = ImageIO.read(new File("rsc/img/kanone_rohr.png"));
} catch (IOException e) {
System.out.println("ERROR! DAS BILD " + "rsc/img/kanone_rohr.png" + " KONNTE NICHT GELADEN WERDEN!");
}
setSize(1100,820);
setLayout(null);
setVisible(true);
repaint();
}
public void paintComponent(Graphics g) {
draw.draw_main(g);
//g.drawImage(test.image(), test.x(), test.y(), test.image().getWidth(), test.image().getHeight(), null);
repaint();
}
public BufferedImage rotateImageX(BufferedImage img, double angle) {
double sin = Math.abs(Math.sin(Math.toRadians(angle)));
double 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);
int 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) / 2, (newh - h) / 2);
g.rotate(Math.toRadians(angle), w / 2, h / 2);
g.drawRenderedImage(img, null);
g.dispose();
return bimg;
}
public img getKanoneGestell() { return kanone_gestell; }
public img getKanoneRohr() { return kanone_rohr; }
public double getAngle() { return angle; }
public void setAngle(double a) { angle = a; }
public BufferedImage getKanone_Rohr_Base() { return kanone_rohr_base; }
}
In der Klasse Draw wird dann gezeichnet:
Code:
package Gui;
import java.awt.*;
import Data.img;
public class Draw {
private Panel p;
private img kanone_gestell, kanone_rohr;
private img meer = new img(0, 0, 3300, 800, "rsc/img/meer.png");
private img brett = new img(0, 700, 1100, 80, "rsc/img/brett.png");
private img felsen = new img(0, 350, 300, 400, "rsc/img/felsen.png");
public Draw(Panel panel, img kanone_gestell, img kanone_rohr) {
p = panel;
this.kanone_gestell = kanone_gestell;
this.kanone_rohr = kanone_rohr;
}
public void draw_main(Graphics g) {
g.drawImage(meer.image(), meer.x(), meer.y(), meer.width(), meer.height(), null);
g.drawImage(kanone_gestell.image(), kanone_gestell.x(), kanone_gestell.y(), kanone_gestell.width(), kanone_gestell.height(), null);
g.drawImage(felsen.image(), felsen.x(), felsen.y(), felsen.width(), felsen.height(), null);
g.drawImage(brett.image(), brett.x(), brett.y(), brett.width(), brett.height(), null);
g.drawImage(kanone_rohr.image(), kanone_rohr.x(), kanone_rohr.y(), kanone_rohr.width(), kanone_rohr.height(), null);
}
}
So jetzt habe ich das Kanonenrohr gezeichnet. Nun möchte ich, dass man dieses durch das Bewegen der Maus rotieren kann, sprich: wird die Maus nach oben bewegt, soll sich das Rohr gegen den Uhrzeigersinn drehen, bewegt man die Maus nach unten, so soll das Rohr mit dem Uhrzeigersinn gedreht werden. Dabei soll es sich um den Punkt der Halterung (Kreis in der Mitte drehen). Bild im Anhang. Bisher kann man das Bild, wenn man es nur einmal rotiert, zwar drehen, es rotiert aber um den falschen Punkt. Rotiert man es mehrfach, wird es immer kleiner unter verschwindet irgendwann.
Mein MouseMotionHandler:
Code:
package Action;
import java.awt.event.*;
import Gui.Panel;
public class MouseMotionHandler implements MouseMotionListener {
private Panel p;
private int mouseY = 0;
private int rangle = 2;
public MouseMotionHandler(Panel panel) {
p = panel;
}
@Override
public void mouseDragged(MouseEvent e) {
}
@Override
public void mouseMoved(MouseEvent e) {
if(e.getY() > mouseY) {
p.getKanoneRohr().setImage(p.rotateImageX(p.getKanone_Rohr_Base(), p.getAngle()));
p.setAngle(p.getAngle()-rangle);
p.repaint();
} else if(e.getY() < mouseY){
p.getKanoneRohr().setImage(p.rotateImageX(p.getKanone_Rohr_Base(), p.getAngle()));
p.setAngle(p.getAngle()+rangle);
p.repaint();
}
mouseY = e.getY();
}
}
Es tut mir leid, dass das jetzt so viel ist, ich bin aber wirklich am verzweifeln. Falls jemand eine funktionierende Rotation hat, würde ich diese natürlich auch gerne nehmen.
Vielen Dank!
EDIT: Ich habe die Klassen Panel und MouseMotionHandler jetzt so umgeschrieben, dass eine Rotation statfindet. Ich habe aber noch das Problem, dass die Seitenverhältnisse nicht stimmen und dann es nicht um den richtigen Punkt rotiert (Stand 12.12.2018, 17:23Uhr).
Anhänge
Zuletzt bearbeitet: