2017-01-02 8 views
0

Я пытаюсь создать функциональность для базовой камеры безопасности в своей игре. Камера находится в правом верхнем углу холста и отображает луч света, который вращается подобно фотоаппарату безопасности (перемещается на 90 ° в одном направлении, затем на 90 ° назад). Функциональность, на которую я нацелен, заключается в том, что когда мышь касается луча, консоль выводит «касание».Как применить вращения, сделанные с помощью g2d.rotate, к координатам x треугольника?

До сих пор у меня есть луч камеры, вращающийся с использованием g2d.rotate, однако обнаружение попадания не перемещается с повернутым холстом. Я пробовал множество решений, включая теорему, используемую для перемещения точек многоугольника вокруг одной точки, но треугольник продолжал уменьшаться по размеру с каждым поворотом.

Вот мой код до сих пор:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.GradientPaint; 
import java.awt.Graphics2D; 
import java.awt.Point; 
import java.awt.Polygon; 
import java.awt.event.KeyEvent; 
import java.awt.event.MouseEvent; 
import java.awt.geom.AffineTransform; 
import java.awt.geom.Path2D; 
import java.awt.geom.Point2D; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 

import javax.imageio.ImageIO; 

public class Camera { 

    private BufferedImage img; 
    private int x; 
    private int y; 
    private boolean moving = false; 
    private double angle; 
    private boolean up; 
    private Graphics2D graphicsTemp; 
    private AffineTransform at; 
    private Polygon beam; 
    private Point p1; 
    private Point p2; 
    private Point p3; 
    private int[] xArray; 
    private int[] yArray; 

    public Camera(int x, int y, Point p1, Point p2, Point p3) { 
     try { 
      img = ImageIO.read(getClass().getResource("Camera.png")); 

     } catch (IOException e) { 
      System.out.println("NO IMAGE"); 
     } 
     this.x = x; 
     this.y = y; 
     this.p1 = p1; 
     this.p2 = p2; 
     this.p3 = p3; 
     angle = 0; 
     up = true; 
    } 

    public void update() { 
     xArray = new int[] { p1.x, p2.x, p3.x }; 
     yArray = new int[] { p1.y, p2.y, p3.y }; 
     beam = new Polygon(xArray, yArray, 3); 
    } 

    public void paint(Graphics2D g2d) { 
     if (up) { 
      angle += 0.2; 
     } else { 
      angle -= 0.2; 
     } 
     if (angle >= 90.0 || angle <= 0.0) { 
      up = !up; 
     } 
     g2d.rotate(Math.toRadians(angle), p1.x, p1.y); 
     g2d.setColor(color); 
     g2d.fillPolygon(beam); 
     g2d.setColor(Color.BLACK); 
     g2d.drawPolygon(beam); 
     g2d.rotate(-Math.toRadians(angle), p1.x, p1.y); 
    } 

    public void testTouch(int mouseX, int mouseY) { 
     if (beam.contains(mouseX, mouseY)) { 
      System.out.println("INSIDE"); 
     } else { 
      System.out.println("OUTSIDE"); 
     } 
    } 

ответ

1

Вы не вращали Polygon, что вы делаете удар тестирование, поэтому он будет использовать оригинальный неповёрнутый луч для попадания тестирования.

В качестве простого решения вы можете повернуть многоугольник, прежде чем использовать его для тестирования ударов. Graphics2D использует класс AffineTransform сделать его вращения, и поэтому вы можете:

public void testTouch(int mouseX, int mouseY) { 
    AffineTransform transform = AffineTransform.getRotateInstance(Math.toRadians(angle), p1.x, p1.y); 
    Shape rotatedBeam = transform.createTransformedShape(beam); 
    if (rotatedBeam.contains(mouseX, mouseY)) { 

Однако вы можете также сделать что повернута полигон непосредственно в методе paint; лучше повернуть его один раз и использовать повернутую форму как для тестирования на удар, так и для вашего метода рисования.

Обратите внимание, что также не рекомендуется обновлять свой угол в методе paint, так как вы не знаете, когда и как часто это называется. Если ваше окно было перекрыто, а затем открыто, ваш метод рисования также будет вызываться.

+0

Работали как очарование. Я никогда не рассматривал использование createTransformedShape(), а затем полностью передавал предыдущую форму в новую форму. Brilliant! – ScrubbyDew

 Смежные вопросы

  • Нет связанных вопросов^_^