0

問題: プレーヤー モデルは、最後のマウス クリックの方向に回転するはずですが、ゆっくりと回転するのではなく、考えられるすべての方法で回転します (ゲームにはアイソメトリック ビューがあり、モデルは Y 軸を中心にのみ回転するはずですが、回転します) X 軸と Z 軸の周りも)。

次のメソッド (render() で呼び出される) は、モデルの回転動作を担当します。

public static void turnUnit(){
    if(Gdx.input.isButtonPressed(Input.Buttons.LEFT)){
        mX = Gdx.input.getX();
        mY = Gdx.input.getY();
        angle = (float) (180+Math.atan2(mX-Gdx.graphics.getWidth()/2, mY-Gdx.graphics.getHeight()/2)*(180/Math.PI));

        newAngle = ((((currentAngle - angle) % 360) + 540) % 360) - 180;
        turning = newAngle/60*turnRate;

        currentAngle = currentAngle-turning;
    }
    TestGround.player.transform.setToRotation(Vector3.Y, currentAngle).setTranslation(posX,0,posZ);
}

そして移動方法(render()でも呼び出されます):

public static void movement(){
    if(northM==true){
        TestGround.player.transform.trn(0,0,-1f);
    }
    if(southM==true){
        TestGround.player.transform.trn(0,0,1f);
    }
    if(westM==true){
        TestGround.player.transform.trn(-1f,0,0);
    }
    if(eastM==true){
        TestGround.player.transform.trn(1f,0,0);
    }

    posX = TestGround.player.transform.getTranslation(Vector3.X).x;
    posY = TestGround.player.transform.getTranslation(Vector3.Y).y;
    posZ = TestGround.player.transform.getTranslation(Vector3.Z).z;

}

最後の行で「回転」を使用しようとしましたが、回転が速くなります。

また、これは私には意味がありませんが、いくつかのテストの後、移動方法が回転方法と何らかの形で干渉しているようです(特定の方向に移動すると、モデルが特定の方法で回転します)。

ここで根本的に間違ったことをしていますか?

追加情報:

  • もともと、単純なポーリングを使用して、すべてのキーボードとマウスの入力を取得しました
  • 1 つの大きなメソッドで移動/回転を計算し、すべてが正常に機能しました
  • libgdx の入力プロセッサを使用して、コードをより読みやすく、自由に記述できるようにすることにしました。
4

1 に答える 1

0

このMatrix4#getTranslation(Vector3)メソッドは、指定されたベクトルを行列の平行移動コンポーネントに設定し、連鎖のために返します。これが意味することは、メソッドの引数として指定したベクトルが、モデル インスタンスの移動 (位置) にTestGround.player.transform.getTranslation(vector)設定 (読み取り:上書き) されるということです。

したがって、次の呼び出しの場合:

TestGround.player.transform.getTranslation(Vector3.Y)

これにより、実質的にVector3.Y変数がデフォルトから[x:0, y:1, z:0]、行列の変換コンポーネントが設定されているものに変更されます。これにより、Vector3.Y変数を使用する他の呼び出し ( への呼び出しなどsetToRotation) が異なる動作をするようになります。

これを修正するには、最後の数行を次のように変更します。

Vector3 pos = new Vector3();
TestGround.player.transform.getTranslation(pos);
posX = pos.x;
posY = pos.y;
posZ = pos.z;

の作成をメソッドの外に移動する必要があることに注意してください。そのため、メンバーを優先して、、およびメンバーをVector3削除することもできます。posXposYposZpos

したがって、次の 2 つの質問を疑問に思うかもしれません。

getTranslationメソッドが引数を変更するのはなぜですか? これは、libGDX がガベージの作成を回避するように設計されているためです。これは、Android などの一部のプラットフォームでヒックアップが発生するためです。したがってVector3、メソッドが呼び出されるたびに新しいものを作成する代わりに、再利用したいそのクラスのインスタンスを指定できます。この理由により、ライブラリ全体の複数の場所でこのパターンが見られます。

を変更Vector3.Yして役に立たなくし、あらゆる種類の問題を引き起こすのはなぜですか? これは、Vector3クラスが変更可能であり、そのメンバーをカプセル化しないためです。したがって、実際にはvector.x += 3;、強制的に呼び出す代わりに、それを行うことができますvector.setX(vector.getX() + 3);。これは、読みやすさとパフォーマンスの両方の理由によるものです (ただし、後者はターゲット プラットフォームによって異なる場合があります)。また、Java は に匹敵するものをサポートしていませんconst

于 2016-03-30T21:42:37.007 に答える