3

簡単な問題だと思うので、これで自分を打ち負かしてきましたが、どういうわけか解決策を見つけることができません。

タッチ移動イベントに応じて、アンカー ポイントを中心に CCSprite を回転させています。スプライトを回転させるために使用するコードは次のとおりです。

CGPoint previousLocation = [touch previousLocationInView:[touch view]];
CGPoint newLocation = [touch locationInView:[touch view]];

//preform all the same basic rig on both the current touch and previous touch
CGPoint previousGlLocation = [[CCDirector sharedDirector] convertToGL:previousLocation];
CGPoint newGlLocation = [[CCDirector sharedDirector] convertToGL:newLocation];

CCSprite *handle = (CCSprite*)[_spriteManager getChildByTag:HANDLE_TAG];

CGPoint previousVector = ccpSub(previousGlLocation, handle.position);
CGFloat firstRotateAngle = -ccpToAngle(previousVector);
CGFloat previousTouch = CC_RADIANS_TO_DEGREES(firstRotateAngle);

CGPoint currentVector = ccpSub(newGlLocation, handle.position);
CGFloat rotateAngle = -ccpToAngle(currentVector);
CGFloat currentTouch = CC_RADIANS_TO_DEGREES(rotateAngle);

float rotateAmount = (currentTouch - previousTouch);
handle.rotation += rotateAmount;

回転の方向、つまり時計回りまたは反時計回りの方向をどうにかして見つける必要があります。私は、rotateAmount 値に「if」条件を設定して、これを実行しようとしました。しかし、これは特定のケースでは機能しません。

たとえば。ユーザーがスプライトを時計回りに回転させている場合、この場合、rotateAmount 値は 0 ~ 359 の正の値になります。ユーザーが円を完成させようとしている瞬間に、条件が成立せず、方向が反時計回りに変わります。

回転方向を検出するより良い方法はありますか?

4

1 に答える 1

5

このラップアラウンド サニティ チェックを試してください。

float rotateAmount = (currentTouch - previousTouch);

if (rotateAmount > 180)
  rotateAmount -= 360;
else if (rotateAmount < -180)
  rotateAmount += 360;

handle.rotation += rotateAmount;
于 2013-04-08T18:47:59.220 に答える