Lo que quieres hacer es bastante común. Para un buen tutorial sobre esta y otras técnicas comunes, consulte esta serie de motores de mosaico .
Si no has hecho algo así antes, te recomiendo ver la serie. Sin embargo, si lo desea, puede obtener el último código de tutoriales. Si haces lo posterior, mira el método de dibujo.
En pocas palabras, debes encontrar tus puntos X / Y mínimo y máximo alrededor del jugador. Una vez que tenga eso, simplemente recorra cada uno y dibuje ese mosaico.
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;
}
Como puede ver, están sucediendo muchas cosas. Necesita una cámara que cree su matriz, necesita convertir su ubicación de píxeles actual en un índice de mosaico, encuentra sus puntos mínimo / máximo (agrego un poco a mi MAX para que se extienda un poco más allá de la pantalla visible) ), y luego puedes dibujarlo.
Realmente sugiero ver la serie de tutoriales. Cubre su problema actual, cómo crear un editor de mosaicos, mantener al jugador dentro de los límites, animación de sprites, interacción con IA, etc.
En una nota al margen , TiledLib tiene esto incorporado. También podría estudiar su código.