学習課題として 2D スクロール XNA ゲームを作成しようとしていますが、スクロール バックグラウンドで問題が発生しました。テキスト ファイルからレベルを読み込み、解析して適切なタイルを作成し、それらをマトリックス (タイル[,]) に格納しています。
次に、タイルの位置を変更する更新メソッドを用意して、再描画時にタイルが移動するようにします。
現在、すべてのタイルをループして、移動する前にすべてを描画しています。これは明らかにあまり効率的ではありません。理想的には、画面にタイルを描画するだけです。次のように、ビューポートを取得し、タイルの高さ/幅を使用して、画面に収まるタイルの数を決定し、それらのタイルのみをループすることでこれを行うことができます。
private void DrawTiles(SpriteBatch spriteBatch)
{
float tileWidth = 40;
float tileHeight = 32;
for (int y = 0; y < (int)Math.Ceiling(mViewport.Height / tileHeight); ++y)
{
for (int x = 0; x < (int)Math.Ceiling(mViewport.Width / tileWidth); ++x)
{
tiles[x, y].Draw(spriteBatch);
}
}
}
ただし、これは元のビューポートにタイルを描画するだけです。外側のタイルは、位置が表示されても描画されません。
これは、カウンターを使用してループを開始および終了し、draw メソッドが呼び出されるたびにインクリメントすることで解決できると思います。ただし、これが優れた解決策だとは思いませんが、残念ながら、ビューポート内のタイルのみが描画されるようにするためのより良い方法は考えられません。