2

ゲーム内には、マリオのようなスピナーがあります。

ゲームが遅れていない場合、スピナーは完全に機能し、一定の速度で 360 度完全に回転します。

ただし、遅延が発生すると (Android バージョンでよく発生します)、異なる発射体の間にギャップが現れ始め、円形に回転することさえなくなり、歪んだ楕円形のパターンで回転します

これがSpinnerのJavaコードです

         helper += speedVariable * 1f;
         speedY = (float) (speedVariable *helper2 * Math.cos(Math.toRadians(helper)));
         speedX = (float) (speedVariable * -1 * helper2 * Math.sin(Math.toRadians(helper)));


    setX(getX() + (speedX * delta) + ((Background.bg.getSpeedX() * 5) * delta));
    setY(getY() + (speedY * delta));

float ヘルパーは、スピナーを回転させる余弦関数と正弦関数の内側にあるフィールドです。

speedVariable は回転速度を制御します

helper2 は、回転する半径を設定します

私は何か間違ったことをしていますか?ありがとう!

4

1 に答える 1

3

前の位置を基準にして新しい位置を設定しないでください。中心点の周りの円にとどまりたいので、その点から位置を確実に計算する方がはるかに簡単です:

setX(getCenterX() + xFromCenter + (Background.bg.getSpeedX() * 5));
setY(getCenterY() + yFromCenter);

(背景の部分が何なのかはわかりませんが、保持する必要があると思いました。)

xFromCenteryFromCenterは、回転のコサインとサインです。元のコードでは で回転していたhelperので、そのままにしておきましょう。ただしdelta、同じ秒数で同じ量の角度を回転させたいので、その増分に適用する必要があります。

helper += speedVariable * delta;

次のように考えてください: デルタは、x 軸と y 軸上で移動する量ではなく、回転する量に直接影響する必要があります (これらの値は時間とともに線形に変化しないため)。

次に、取得xFromCenterしたとおりに取得できますがspeedX、現在は速度が必要ないことを除いて、Y についても同じことを行います。X を cos で、Y を sin で設定しますが、その逆ではありません。これが典型的な使用法です。角度は右側が 0 から測定されます。(違いは90度回転しただけです。)

また、小さな問題:計算時に関数MathUtils.sinDeg()cosDeg()関数を使用できるため、ラジアンに変換して結果を float にキャストする必要はありません。もう少し読みやすいです。

コード全体:

helper += speedVariable * delta;
xFromCenter = helper2 * MathUtils.cosDeg(helper));
yFromCenter = -1 * helper2 * MathUtils.sinDeg(helper));

setX(getCenterX() + xFromCenter + (Background.bg.getSpeedX() * 5));
setY(getCenterY() + yFromCenter);

定数 (helper2、speedVariable、-1 の乗算) をいじる必要があるかもしれませんし、X と Y のスワップを元に戻して、必要なものを正確に取得する必要があるかもしれませんが、これにより、すべての条件下でオブジェクトが円上に保たれるはずです。

于 2014-05-03T14:41:43.077 に答える