オブジェクトの回転を任意の位置に簡単に(徐々に)移動しようとしています。回転角度は、Virtual Thumbstickクラスによって決定され、-1と1の間のX/Y座標を返します。もしthumbscick上に動きがなければ、私は0を指すように戻っています。スプライトの画像。回転イージングアルゴリズムがXNAで動作しない
私が抱えている問題は、このコードでは、連続回転ではなく約1.5回転(-3 * PIと3 * PIの間)しか許されないということです。サムスティックのX/Y座標でMath.Atan2を使用すると、返される角度は-PIとPIの間で制限されますが、連続回転が可能です。また、オブジェクトを一方向に回転させて親指を離すと、その方向から上に回転します。最短ルートで上に戻るようにしたい。
if (VirtualThumbsticks.LeftThumbstick.Length() > .2f)
{
double rotateTo = Math.Atan2(VirtualThumbsticks.LeftThumbstick.Y, VirtualThumbsticks.LeftThumbstick.X);
if (rotateTo > Rotation + Math.PI) rotateTo -= (Math.PI * 2);
if (rotateTo < Rotation - Math.PI) rotateTo += (Math.PI * 2);
Rotation += (rotateTo - Rotation) * 0.2;
}
else
{
Rotation += (-1.57079 - Rotation) *0.2;
}
私が話しているか知っている任意のフラッシュ/ ActionScriptのゲーム開発者がある場合は、私はC#のにそれを適用することができますようチャイムください。
ありがとうございます、皆さん!
EDIT:
このコードのチャンクはAS3で完璧に動作します。私は、問題を引き起こしている私の種類や型キャストに問題がある場合は疑問に思い始めている
function enterFrameHandler(e:Event):void
{
var curMouseX = Math.round(-(arrow.x - stage.mouseX));//(stage.stageWidth/2)-(stage.mouseX/2);
var curMouseY = Math.round(-(arrow.y - stage.mouseY));//(stage.stageHeight/2)-(stage.mouseY/2);
var angleTo:Number = Math.atan2(curMouseX, -curMouseY) * TO_DEGREES;
if (angleTo > arrow.rotation+180) angleTo -= 360;
if (angleTo < arrow.rotation-180) angleTo += 360;
tf_angle.text = angleTo.toString();
tf_mouseX.text = curMouseX.toString();
tf_mouseY.text = curMouseY.toString();
arrow.rotation += (angleTo - arrow.rotation) * 0.2;
}
。誰かがアイデアを持っている場合、あなたの入力は非常に高く評価されます。
ここで働いていませんか? – Tigran
@Tigran - 回転は連続していません。どちらの方向に1.5回回転して壁に当たってスナップバックします。また、親指を離すとき、それは来た方向から0(この場合は-1.57097)に戻ります。明確にするために質問を再度お読みください。 – ImKevinJones