3

2D ゲーム マップ タイルのチャンクを生成するシステムがあります。チャンクは 16x16 タイル、タイルは 25x25 です。

チャンクには、0,0、0,1 などの独自の座標が与えられます。タイルは、どのチャンクにあるかに基づいて、ワールド内の座標を決定します。チャンク/タイルがすべて適切な表示を示していることを確認しました。 x/y 座標。

私の問題は、それらを画面座標に変換することです。前の質問で、誰かが次の使用を推奨しました:

(worldX * tileWidth) % viewport_width

各タイルの x/y はこの計算によって実行され、画面の x/y 座標が返されます。

これは、ビューポート内に収まるタイルには機能しますが、画面外のものについては画面の x/y 位置の計算をリセットします。

私のマップでは、プレーヤーの周囲の半径内にタイルのチャンクをロードして、内側のタイルの一部が画面外になるようにします (それらが動き回るまで、画面上のタイルの位置が移動します)。

画面外になるタイルでテストを試みました。

Tile's x coord: 41
41 * 25 = 1025
Game window: 1024
1025 % 1024 = 1

これは、タイル x (画面 0,0 がマップ 0,0 にある場合、画面の右側のすぐ外の x:1025 にあるはずです) が実際には x:1 にあり、上部に表示されることを意味します。 -左。

これを適切に処理する方法が思いつきません。tileX * tileWidth「最初の画面位置」を決定し、オフセットを使用して画面に表示する方法を決定する必要があるようです。しかし、何のオフセットですか?

更新: プレイヤーが移動したときに x/y オフセット値を既に保存しているので、マップを移動する方法を知っています。これらの値を現在のオフセットとして使用できます。誰かがゲームを保存した場合、単純にそれらを保存して再利用できます。方程式は必要ありません。累積オフセットを保存するだけで済みます。

4

2 に答える 2

1

モジュロ (worldX*tileWidth % screenWidth) がリセットの原因です。モジュロ (%) は、整数除算の剰余を示します。したがって、worldX * tileWidth が screenWidth よりも大きい場合、(worldX * tileWidth) / screenWidth の残りが得られます。worldX * tileWidth が screenWidth+1 の場合、残りは 1: 行の先頭からやり直します。

モジュロを削除すると、画面の端を越えてタイルが描画され続けます。描画バッファーが画面と同じサイズの場合、画面の端にタイルのチェックを追加して、表示されるタイル部分のみを描画するようにする必要があります。

プレーヤーを画面の中央に維持しようとしている場合は、タイル 0,0 からのプレーヤーのオフセット (ピクセル単位) から画面幅の半分を引いた分だけ、各タイルをオフセットする必要があります。

offsetX = (playerWorldX * tileWidth) - (screenWidth / 2);
screenX = (worldX * tileWidth) - offsetX;
于 2013-06-02T19:39:34.817 に答える