2011-05-13 7 views
2

MousePos로 이미지 회전?

으로 초기화 된

로 초기화 된 java 이미지를 회전하고 싶습니다.

  Graphics2D g = buffer.createGraphics(); 
    g.drawImage(playerimage, player.getX(), player.getY(), null); // Draw Player 

자 이제 내 마우스로 회전하여 내 마우스를 찾고 싶습니다. 어떻게하면 좋을까요?

+0

당신이 원하는 마십시오에 * 정확하게 마우스를 향해 항상 * 얼굴, 또는 플레이어가 마우스를 이동하면 있도록, 그것은 제한된 속도로 마우스를 향해 켜시겠습니까 너무 빠르면 순간적으로 이미지를 따라 잡습니다. – Wyzard

답변

1

먼저해야 할 일은 마우스 위치와 플레이어 위치를 같은 좌표계로 가져 오는 것입니다. 마우스 위치를 잡았을 때 플레이어가 자신의 '월드 코즈 (World Coords)'공간에있을 때 일반적으로 화면 좌표로 표시됩니다. 플레이어 위치가 픽셀에 직접 연결되어 있으면 건너 뛸 수 있습니다. 같은 COORD 시스템에서 일단

세계 좌표로 마우스 위치를 변환

..

mouseWorld.X = (mouseScreen.X/screenWidth) * worldWidth; 

당신이 회전하는 데 필요한 각도를 찾아야합니다. 이 방정식은 플레이어 아트가 어떤 방향으로 향하고 있는지에 따라 변경되며 위치가 X 축 방향을 향하고 있다고 가정합니다. 그런 다음 내적을 사용하여 플레이어가 향하고있는 지점과 지점이 가리키는 지점 사이의 각도를 찾을 수 있습니다.

The dot product is A(dot)B = mag(A) * mag(B) * cos (theta) 
mag = magnitude of the vector 
theta = angle between the two vectors 
So if you normalize the vectors (make them length 1) then.. 
A(dot)B = 1 * 1 * cos(theta) 
A(dot)B = cos(theta) 
acos(A(dot)B) = theta 

그래서

Vector mouseVec(mouseWorld.X, mouseWorld.Y); 
Vector playerVec(playerWorld.X, playerWorld.Y); 

//You want to find the angle the player must turn, so pretend the player pos it the origin 
mouseVec -= playerVec; 

//Create a vector that represents which way your player art is facing 
Vector facingVec(1, 0); 

mouseVec.Normalize(); //Make their length 1 
facingVec.Normalize(); 

double dotProd = mouseVec.dot(facing); 
double angBetween = acos(dotProd); 
다음 '회전'호출하고 angBetween 전달 ... 코드를 수행 할 수 있습니다!

단위가 올바른지 두 번 확인하십시오. 종종 acos가 '라디안'을 반환하고 회전 기능이 '도'를 사용하여 변환해야합니다.

더 많은 벡터 정보 : Vector Info

+0

자, 이제 막 Java를 시작했는데,이 코드에서 어떤 일이 벌어지고 있는지, 그리고 어떻게 사용하는지 전혀 알지 못합니다. – Stan

+1

코드 예제에서 사용한'java.util.Vector' 클래스는 링크 된'Vector' 클래스가 아닙니다. Java의 '벡터'는 목록이며 기하 벡터가 아닙니다. 당신은 X와 Y 좌표로 하나를 만들 수없고'Normalize()'메소드도 없다. – Wyzard

+0

@Wyzard - 죄송합니다. 하단의 '벡터 정보'에 링크 된 벡터 클래스를 참조하십시오. – TurqMage