Ce que vous voulez faire est assez courant. Pour un joli didacticiel sur cette technique et d'autres techniques courantes, consultez cette série de moteurs de tuiles .
Si vous n'avez jamais rien fait de tel auparavant, je vous recommande de regarder la série. Cependant, si vous le souhaitez, vous pouvez obtenir le dernier code des didacticiels. Si vous le faites plus tard, consultez la méthode de dessin.
En un mot, vous devez trouver vos points X et Y min et max autour du lecteur. Une fois que vous avez cela, il vous suffit de parcourir chacun d'eux et de dessiner cette tuile.
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;
}
Comme vous pouvez le voir, il se passe beaucoup de choses. Vous avez besoin d'une caméra qui va créer votre matrice, vous devez convertir votre emplacement de pixel actuel en un index de tuile, vous trouvez vos points min / max (j'ajoute un peu à mon MAX pour qu'il dessine un peu au-delà de l'écran visible ), puis vous pouvez le dessiner.
Je suggère vraiment de regarder la série de tutoriels. Il couvre votre problème actuel, comment créer un éditeur de tuiles, garder le joueur dans les limites, animation de sprites, interaction avec l'IA, etc.
Sur une note latérale TiledLib a cela intégré. Vous pouvez également étudier leur code.