2013-04-21 2 views
0

플레이어 이미지가 마우스 커서를 향하게합니다. 위쪽자바 : 마우스 커서를 가리 키도록 이미지 회전

+0

당신이 상점을 수행 할 작업, 위치를 변경하지 않고 축에서 움직이는 이미지를하지 이잖아 연루 회전, 당신은 커서와 동일한 위치로 이미지를 이동하려면? –

+0

아니, 선수 이미지가 마우스 커서를 마주보고 싶다. – programmer

답변

2

당신은 회전 각도를 계산하기 위해 trigonometry을 사용해야합니다 기본 플레이어 이미지 포인트 :

private int cursorX = MouseInfo.getPointerInfo().getLocation().x; 
private int cursorY = MouseInfo.getPointerInfo().getLocation().y; 

참고 : 나는 마우스 커서의 위치보다를 얻기 위해이 코드를 사용합니다. 이를 위해 먼저 이미지와 커서의 위치를 ​​알아야합니다. 이미지의 위치를 ​​얻는 방법이 다를 수 있으므로이를 말할 수는 없습니다. (here에서 적응)이 예를 들어, 나는 imageX 가정합니다 및 imageY은 이미지의 xy 위치입니다 : (X

float xDistance = cursorX - imageX; 
float yDistance = cursorY - imageY; 
double rotationAngle = Math.toDegrees(Math.atan2(yDistance, xDistance)); 
+0

g2D.drawImage (image, x, y, this)에서 어떻게 구현하면 기본 이미지 대신 회전 된 이미지를 그릴 수 있을까? 다른 방법은? – programmer

+0

'을 사용하십시오.rotate (rotationAngle); ' –

+0

이미지 클래스 im에 회전이 없습니다. – programmer

2

은 좌표 (0,0)에서 각도를 찾으려면 다른 좌표로를 , y), 삼각 함수 tan^-1 (y/x)를 사용할 수 있습니다.

Math 자바 클래스 (또한, 따라서 "ATAN」, 「아크 탄젠트 '라고도 함)을 황갈색^-1 함수로서 작용하는 정적 메소드를 지정하고 atan2 라디안의 각도를 반환한다.

"플레이어"의 좌표에서 마우스 커서의 좌표까지의 각도를 찾기 위해 (나는 가정합니다.)

double theta = Math.atan2(cursorY - player.getY(), cursorX - player.getX()); 

제로 라디안의 각도가 마우스에 직접 있음을 나타내는 것이라고 주 또한이 "플레이어는"당신은, 우리가 이런 일을 할 필요) x 및 y 좌표를 가지고 언급을 오른쪽입니다. "기본 플레이어 이미지"가 위쪽을 가리킨다 고합니다. 회전하기 전에 플레이어의 이미지가 위쪽을 향하고 있다면, 기하학과 Java 구현 인 atan2의 경우 플레이어가 "기본적으로"오른쪽을 향하게하는 것이 더 일반적입니다. 당신이 창에서 마우스 위치를 계속 업데이트하려면 마우스를해야하는 경우이 2 년 전에 질문을 받았다지만

+0

Math.atan2를 확장하고 그것을 사용하거나'theta = Math.atan2'를 쓰는 것을 의미하는 클래스를 생성해야합니까? 어떻게 이것을'g2D.drawImage (image, x, y, this);에 구현하겠습니까? ', 다른 방법으로 구현해야합니까? – programmer

+0

내 실수. 예, 'Math.atan2 (...)'을 써서 각도를 찾을 수 있습니다. 정적 메소드입니다. 나는 그것을 반영하기 위해 나의 대답을 편집했다. 'Math.atan2'를 확장 한 클래스를 작성하지 않을 것입니다. Graphics2D와 함께 사용하려면'g2D.rotate (theta) '메소드를 호출하고 이미지를 _then_ 그립니다. – sleeparrow

+0

atan2()는 각도가 아닌 라디안을 반환합니다. – MCMastery

0

...

, mouseMotionListener를 참조하십시오. 마우스 위치를 가져 오는 데 사용하는 현재는 화면 전체에 상대적입니다. 그 점을 명심하십시오.

그렇지 않으면, 여기 내가 사용하는 방법,

public double angleInRelation(int x1, int y1, int x2, int y2) { 
    // Point 1 in relation to point 2 
    Point point1 = new Point(x1, y1); 
    Point point2 = new Point(x2, y2); 
    int xdiff = Math.abs(point2.x - point1.x); 
    int ydiff = Math.abs(point2.y - point1.y); 
    double deg = 361; 
    if ((point2.x > point1.x) && (point2.y < point1.y)) { 
     // Quadrant 1 
     deg = -Math.toDegrees(Math.atan(Math.toRadians(ydiff)/Math.toRadians(xdiff))); 

    } else if ((point2.x > point1.x) && (point2.y > point1.y)) { 
     // Quadrant 2 
     deg = Math.toDegrees(Math.atan(Math.toRadians(ydiff)/Math.toRadians(xdiff))); 

    } else if ((point2.x < point1.x) && (point2.y > point1.y)) { 
     // Quadrant 3 
     deg = 90 + Math.toDegrees(Math.atan(Math.toRadians(xdiff)/Math.toRadians(ydiff))); 

    } else if ((point2.x < point1.x) && (point2.y < point1.y)) { 
     // Quadrant 4 
     deg = 180 + Math.toDegrees(Math.atan(Math.toRadians(ydiff)/Math.toRadians(xdiff))); 

    } else if ((point2.x == point1.x) && (point2.y < point1.y)){ 
     deg = -90; 
    } else if ((point2.x == point1.x) && (point2.y > point1.y)) { 
     deg = 90; 
    } else if ((point2.y == point1.y) && (point2.x > point1.x)) { 
     deg = 0; 
    } else if ((point2.y == point2.y) && (point2.x < point1.x)) { 
     deg = 180; 
    } 
    if (deg == 361) { 
     deg = 0; 
    } 
    return deg; 
} 

즉, 아래 그림과 같이 θs 각의 각도를 얻고 X 또는 Y가 0 인 경우 확인하고 특별한을이다 그 사건.

원점은 그림의 중간이며 각 점 (손으로 그린 ​​십자 표시)은 마우스 위치입니다.

picture in relation to mouse position

관련 문제