O que você quer fazer é bastante comum. Para um bom tutorial sobre essa e outras técnicas comuns, confira esta série de mecanismos de blocos .
Se você não fez nada assim antes, recomendo assistir a série. No entanto, se você quiser, poderá obter o código dos últimos tutoriais. Se você fizer isso mais tarde, confira o método draw.
Em poucas palavras, você precisa encontrar seus pontos mínimo e máximo de X / Y ao redor do player. Depois de conseguir, basta percorrer cada uma delas e desenhar essa peça.
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 você pode ver, há muita coisa acontecendo. Você precisa de uma câmera para criar sua matriz, precisa converter sua localização atual de pixels em um índice de blocos, encontrar seus pontos mínimo / máximo (adiciono um pouco ao meu MAX para que ele se mova um pouco além da tela visível ) e, em seguida, você pode desenhá-lo.
Eu realmente sugiro assistir a série de tutoriais. Ele aborda o seu problema atual, como criar um editor de blocos, manter o jogador dentro dos limites, animação de sprites, interação com IA, etc.
Em uma nota lateral, o TiledLib incorporou isso. Você também pode estudar o código deles.