2017-11-07 23 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); 

しかし、プレイヤーが回転した後は、銃のノズルに追従しません。ここで

は私の問題を示すGIFです:

Issue

私はガンのノズル位置を見つけるために、プレイヤーの回転を考慮に入れることができますどのように?

答えて

1

各角度ごとにオフセット位置が異なる必要があります。私が理解するため

  • 角度がオフセット0である場合に角度オフセット90である場合に角度が180である場合(10、58)
  • なければならない
  • (-10、58)であるべきですオフセット角は270がオフセットしている場合には(-10、-58)

である必要がありますので、オフセットは次のように計算されるべきである(-58、10)

  • すべきである:

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

    動作するかどうかを教えてください。

    EDIT(符号付きの間違いをしました)解答用

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

    ありがとう!私はこのコードを試して、プレーヤーの中心で回転を行いましたが、あなたの答えのコードから 'gunNozzlePos'を取り出しました。この奇妙な結果が出ました。https://i.gyazo.com/4537125ff68cd6ee7ed106893b4dc46c.gif – Acidic

    +0

    Wait Nevermind 、私はラジアンに変換しませんでした! – Acidic

    +0

    私はそれを正しくしましたが、ドットは先端にあまり追いつかないが、それは非常に近い。 https://i.gyazo.com/0ff76e0da961dd8158b1ac853ed25bd8.gif – Acidic