2017-01-02 14 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

당신은, 당신이에 충돌 테스트를하고있는 다각형을 회전하지 않은 :

여기에 지금까지 내 코드입니다.

단순한 솔루션으로 다각형 테스트를 사용하기 전에 다각형을 회전 할 수 있습니다. 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() 사용을 고려한 적이 없으며 이전 모양을 새로운 모양으로 완전히 전달한 것입니다. 훌륭한! – ScrubbyDew