从精灵的位置和旋转中获取位置偏移

时间:2017-11-07 10:40:04

标签: c++ rotation position cocos2d-x

我正在使用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);

但是在播放器旋转后,该位置不会跟随喷枪的喷嘴。

这是一个显示我的问题的GIF:

Issue

如何考虑玩家的旋转以找到喷枪的喷嘴位置?

1 个答案:

答案 0 :(得分:1)

每个角度的偏移位置应该不同。

据我所知:

  • 如果角度为0,则偏移量应为(58,-10)
  • 如果角度为90,则偏移量应为(10,58)
  • 如果角度为180,则偏移量应为(-58,10)
  • 如果角度为270,则偏移量应为(-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;