0

こんにちは、私は最近 Java を学び、2D タイル ベースのゲームを作成しています。ゲームループとすべてのタイルベースのものを問題なくセットアップしましたが、これで頭を壁にぶつけています... 簡単に思えますが、私はそれで最も苦労しています. 4方向の動きを止めたいのですが、うまく動かないようです。このように使用すると、上下が停止しますが、側面衝突を追加するとすぐに上に移動します。なぜなら、x < x 誰かがより良い解決策やアルゴリズムを持っている場合は、私に知らせてください! ありがとう!

ここに私のセットアップに関するいくつかの詳細情報があります

ゲーム スレッド (ゲーム ループ) を開始するメイン スレッドがあります。ゲーム ループは、スクリーン マネージャー用の「部屋」を生成します。部屋を拡張する MapScreen というクラスがあります。この「部屋」には、タイル配列と Player クラスが含まれています。衝突は、部屋の更新メソッドをオーバーライドするメソッドで MapScreen で処理されるため、メインのゲーム ループがすべてを更新します。プレーヤーの瞬間は、プレーヤークラスのメソッドで制御されます。配列への参照をプレーヤーに渡すことができ、タイルがブロックされていないかどうかを確認するだけで、何か新しいことを試してみたいと思う前に、そのようなことをしました。

これが私の現在のコードです:

for (int x = 0; x < 50;x++){
        for (int y = 0; y < 50; y++){
            if (player.rect.intersects(tiles[x][y].rect) && tiles[x][y].blocked == true ){
                //Top
                if (player.rect.y < tiles[x][y].rect.y){
                    player.rect.y -= 10;
                }
                if (player.rect.y > tiles[x][y].rect.y){
                    player.rect.y += 10;
                }

            }
        }
    }

たとえば、ここにサイド (左) を追加しようとすると:

                if (player.rect.y < tiles[x][y].rect.y){
                    player.rect.y -= 10;
                }

                if (player.rect.y > tiles[x][y].rect.y){
                    player.rect.y += 10;
                }

                if(player.rect.x < tiles[x][y].rect.x ){
                    player.rect.x -= 10;
                }

上記のコードはちょっと動作します。-_-

4

2 に答える 2

1

次のような速度ベクトルを使用します。

Class Player {
    public float x, y; // velocity of player

    public void updatePosition() {
        // set x and y based on user inputs
        for (int i; i<50; i++) {
            for (int j; j<50; j++) {
                if (player.rect.intersects...) {
                    if (player.rect.y > tiles[i][j]) {
                        this.y = 0;
                    }
                    ...
                }
            }
        }
        // translate player by final velocity vector
    }
    ...
}
于 2013-07-24T09:58:30.423 に答える
0

'<=' を使用しないでください。まだ上に押し上げている場合は、'<' を使用してください。もう 1 つの質問は、ゲーム ループの速度です。ゲーム ループが遅すぎて、rect が衝突するまで変更を検出できない可能性があります。rect の高さと幅を指定し、それを使用してより正確な衝突検出を行う必要がある場合があります。

于 2013-07-24T09:29:45.403 に答える