2017-11-07 17 views
2

저는 C++ 및 Cocos2d-x를 사용하고 있으며 스프라이트가 항상 마우스 커서를 겨냥하도록하려고합니다. 나는이 일을 할 수 있었지만, 총의 배럴이 커서를 정확히 보지 않고, 플레이어의 중심이 아니라는 사실을 발견했습니다.스프라이트의 위치 및 회전으로부터 위치 오프셋 가져 오기

Vec2 playerPos = getPosition(); 
this->setRotation(-CC_RADIANS_TO_DEGREES((playerPos - targetPos).getAngle()) - 180); 

다음으로는이 playerPos 오프셋 추가 시도 다음 코드를 사용하여 총의 노즐의 위치를 ​​시도 :

Vec2 gunNozzlePos = getPosition() + Vec2(58, -10); // Added offset 
this->setRotation(-CC_RADIANS_TO_DEGREES((gunNozzlePos - targetPos).getAngle()) - 180); 

나는 플레이어가 커서를 따라하기 위해이 코드를 사용

그러나 플레이어를 회전 한 후에는 위치가 총의 노즐을 따라 가지 않습니다.

Issue

가 어떻게 총의 노즐의 위치를 ​​찾으려면 플레이어의 회전 고려 할 수 있습니다 여기에

은 GIF 내 문제를 보여주고있다?

답변

1

오프셋 위치는 모든 각도마다 달라야합니다. 대한

은 내가 이해 :

  • 각도가 있어야한다 오프셋이 0 인 경우 (58, -10)
  • 각도는 각도가 180 인 경우 (10, 58)
  • 해야 오프셋 (90)의 경우 각도이어야 오프셋 (270) 인 경우 (10 -58)이어야
  • 오프셋 (-10, -58) 따라서 오프셋

은 다음과 같이 계산되어야한다 :

Vec2 gunNozzleOffset = Vec2(58 * cos(yourAngleInRadians) - 10 * sin(yourAngleInRadians), -10 * cos(yourAngleInRadians) + 58 * sin(yourAngleInRadians)) 
Vec2 gunNozzlePos = getPosition() + gunNozzleOffset; 

작동 여부를 알려주십시오.

편집는 답변

Vec2 gunNozzleOffset = Vec2(58 * cos(yourAngleInRadians) + 10 * sin(yourAngleInRadians), -10 * cos(yourAngleInRadians) + 58 * sin(yourAngleInRadians)) 
Vec2 gunNozzlePos = getPosition() + gunNozzleOffset; 
+0

감사 (A 기호 실수를 했습니까)! 나는이 코드를 시도하고 플레이어의 중심에서 회전을 시켰지만 답안의 코드에서 'gunNozzlePos'를 가져 와서이 이상한 결과가 나왔다. https://i.gyazo.com/4537125ff68cd6ee7ed106893b4dc46c.gif – Acidic

+0

Wait Nevermind , 나는 라디안으로 변환하지 않았다! – Acidic

+0

그래, 올바르게 했어.하지만 그 점은 팁을 따라 가지 못했지만 아주 가깝다. https://i.gyazo.com/0ff76e0da961dd8158b1ac853ed25bd8.gif – Acidic