#java #graphics2d
#java #graphics2d
Вопрос:
В настоящее время я анимирую Java-игру с базовым игровым циклом. У меня есть объекты Arc2d и Line2d, расположенные так, чтобы они выглядели как лук. У меня нет ссылки Graphics2d для использования метода rotate(), но мне нужно повернуть объект Arc2d и объект Line2d вместе, чтобы они продолжали сохранять ту же форму и отношение друг к другу, следуя указателю мыши.
Я попытался изменить параметры start и extent для объекта Arc2d, но он не смог сохранить свою форму и, очевидно, переместился относительно объекта Line2d. Я также пытался найти способ использовать метод Graphics2d.rotate(), но я не вижу способа передать объект Graphics2d для поворота.
Это класс, в котором я пытаюсь повернуть объект.
import controller.Main;
import java.awt.*;
import java.awt.geom.Arc2D;
import java.awt.geom.Line2D;
public class Shooter extends GameFigure {
public final int BOW_STRING_SIZE = 40;
public final int ARROW_LEN = 30;
public final int UNIT_MOVE = 10;
public Arc2D.Float bow;
public Line2D.Float arrow;
public Color color = Color.YELLOW;
public double rad;
public Shooter(int x, int y) {
super(x, y);
bow = new Arc2D.Float(x - BOW_STRING_SIZE / 2, y - 15, BOW_STRING_SIZE, BOW_STRING_SIZE, 0, 180, Arc2D.CHORD);
arrow = new Line2D.Float(x, y, x, y - ARROW_LEN);
}
@Override
public void render(Graphics2D g2) {
g2.setColor(color);
g2.setStroke(new BasicStroke(7));
g2.draw(arrow);
g2.draw(bow);
}
@Override
public void update() {
MousePointer mousePointer = (MousePointer) Main.gameData.fixedObjects.get(Main.INDEX_MOUSE_POINTER);
float tx = mousePointer.location.x;
float ty = mousePointer.location.y;
rad = Math.atan2(ty - super.location.y, tx - super.location.x);
/*float barrel_y = (float) (ARROW_LEN * Math.sin(rad));
float barrel_x = (float) (ARROW_LEN * Math.cos(rad));
arrow.x1 = super.location.x;
arrow.y1 = super.location.y;
arrow.x2 = super.location.x barrel_x;
arrow.y2 = super.location.y barrel_y;*/
}
В настоящее время стрелка на стрелке поворачивается вместе с указателем мыши, но сам лук этого не делает.
Комментарии:
1. Объедините две фигуры в
Area
и поверните это — проблема — вы не сможете раскрасить их в разные цвета. В качестве альтернативы вы можете использовать aAffineTransform#createTransformedShape
для создания нового экземпляра фигуры, повернутой так, как вам нужно. Проблемы здесь заключаются в попытке перевести и повернуть фигуру вокруг общего ядра2. В качестве альтернативы, вы могли бы не просто вращать фигуру, а вместо этого, когда дело доходит до ее рисования, применить вращение в этой точке
3. @MadProgrammer Я внес следующие изменения, но объект стрелки не рисуется. public Shooter(int x, int y) { super(x, y); bow = new Arc2D.Float(x — BOW_STRING_SIZE / 2, y — 15, BOW_STRING_SIZE, BOW_STRING_SIZE, 0, 180, Arc2D.АККОРД); arrow = new Line2D.Float(x, y, x,y — ARROW_LEN); s1 = новая область (лук); s2 = новая область (стрелка); sf = новая область (); sf.add(s1); sf.add(s2); }