Как повернуть объект Arc2d без передачи ссылки на объект Graphics2d

#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 и поверните это — проблема — вы не сможете раскрасить их в разные цвета. В качестве альтернативы вы можете использовать a AffineTransform#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); }