あなたがしたいことはかなり一般的です。このテクニックやその他の一般的なテクニックに関する素晴らしいチュートリアルについては、こちらをご覧くださいこのタイルエンジンシリーズをご覧。
以前にこのようなことをしたことがない場合は、シリーズを視聴することをお勧めします。ただし、必要に応じて、最後のチュートリアルコードを入手できます。後で行う場合は、drawメソッドを確認してください。
簡単に言うと、プレーヤーの周りの最小および最大X / Yポイントを見つける必要があります。それができたら、それぞれをループして、そのタイルを描画します。
public override void Draw(GameTime gameTime)
{
Point min = currentMap.WorldPointToTileIndex(camera.Position);
Point max = currentMap.WorldPointToTileIndex( camera.Position +
new Vector2(
ScreenManager.Viewport.Width + currentMap.TileWidth,
ScreenManager.Viewport.Height + currentMap.TileHeight));
min.X = (int)Math.Max(min.X, 0);
min.Y = (int)Math.Max(min.Y, 0);
max.X = (int)Math.Min(max.X, currentMap.Width);
max.Y = (int)Math.Min(max.Y, currentMap.Height + 100);
ScreenManager.SpriteBatch.Begin(SpriteBlendMode.AlphaBlend
, SpriteSortMode.Immediate
, SaveStateMode.None
, camera.TransformMatrix);
for (int x = min.X; x < max.X; x++)
{
for (int y = min.Y; y < max.Y; y++)
{
Tile tile = Tiles[x, y];
if (tile == null)
continue;
Rectangle currentPos = new Rectangle(x * currentMap.TileWidth, y * currentMap.TileHeight, currentMap.TileWidth, currentMap.TileHeight);
ScreenManager.SpriteBatch.Draw(tile.Texture, currentPos, tile.Source, Color.White);
}
}
ScreenManager.SpriteBatch.End();
base.Draw(gameTime);
}
public Point WorldPointToTileIndex(Vector2 worldPoint)
{
worldPoint.X = MathHelper.Clamp(worldPoint.X, 0, Width * TileWidth);
worldPoint.Y = MathHelper.Clamp(worldPoint.Y, 0, Height * TileHeight);
Point p = new Point();
// simple conversion to tile indices
p.X = (int)Math.Floor(worldPoint.X / TileWidth);
p.Y = (int)Math.Floor(worldPoint.Y / TileWidth);
return p;
}
ご覧のとおり、多くのことが行われています。マトリックスを作成するカメラ、現在のピクセル位置をタイルインデックスに変換し、最小/最大ポイントを見つける必要があります)、それからあなたはそれを描くことができます。
チュートリアルシリーズをご覧になることをお勧めします。現在の問題、タイルエディターの作成方法、プレーヤーを境界内に収める方法、スプライトアニメーション、AIインタラクションなどについて説明します。
補足説明として、TiledLibにはこれが組み込まれています。コードも学習できます。