テクスチャの位置とカメラの位置を指定してテクスチャをシフトするアルゴリズムの実装に問題がありました。画像の最初の 2 つの図は、私が達成しようとしていることを説明していますが、それに応じてそれらを移動する方法がわかりません。昔々、これを行うプログラムを作成していましたが、なくなってしまいました。何か案は?
カメラ/ビューポートの幅と高さは、テクスチャの幅と高さと同じです。目標は、無限の平面のような錯覚を与えて、位置をシフトさせることです。(無限平面を描かなくてもいいんですけど笑)
領域をどこに描画するかを決定するのに十分なので、実際に領域を移動する必要はありません。N*M ブロック (この場合は N=M=2) を含む地形があり、それぞれのサイズは A*A であると仮定します (この場合、画面は同じサイズですが、これは問題ではありません)。タイルは継続的に互いに追従しています。
int LeftColumn = Camera.X / A; // let it round to nearest lower int
int TopRow = Camera.Y / A;
LeftColumn = LeftColumn % N; // Calculate the first tile
TopRow = TopRow % M;
for (int i = LeftColumn+N; i < LeftColumn+2*N; i++)
for (int l = TopRow+M; l < TopRow+2*M; l++)
// you may check here if the tile is visible or not based on the screen size
{
Tile[i % N, l % M].Draw(i*A, l*A); // Or do whatever you like
}
これは明らかですか?
数時間の試行錯誤の後、最終的に、領域/テクスチャ/長方形をそれに応じて移動させる方法を見つけました。解決したい人は、
if ((int)Math.Abs(region.X - camPos.X) > region.Width * 2)
{
region.X += region.Width * 2;
}
if (camPos.X < region.X - region.Width)
{
region.X -= region.Width * 2;
}
if ((int)Math.Abs(region.Y - camPos.Y) > region.Height * 2)
{
region.Y += region.Height * 2;
}
if (camPos.Y < region.Y - region.Height)
{
region.Y -= region.Height * 2;
}
camPos はカメラの位置、region は領域/テクスチャ/長方形などです。
このコードは、4 つの正方形の領域 (2 つの領域 x 2 つの領域) に対して機能します。より多くの領域に変更するには、単純にすべての *2 を *3 に、または *4 にそれぞれ 9 正方形の領域と 16 正方形の領域に変更します。