Những gì bạn muốn làm là khá phổ biến. Để có một hướng dẫn tốt về điều này và các kỹ thuật phổ biến khác, hãy xem loạt động cơ gạch này .
Nếu bạn chưa từng làm bất cứ điều gì như thế này trước đây, tôi khuyên bạn nên xem loạt phim này. Tuy nhiên, nếu bạn muốn bạn có thể lấy mã hướng dẫn cuối cùng. Nếu bạn làm sau, hãy kiểm tra phương pháp vẽ.
Tóm lại, bạn cần tìm điểm X / Y tối thiểu và tối đa của mình xung quanh người chơi. Khi bạn đã có nó, bạn chỉ cần lặp qua từng cái và vẽ hình xếp đó.
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;
}
Như bạn có thể thấy có rất nhiều điều đang diễn ra. Bạn cần một máy ảnh sẽ tạo ma trận của bạn, bạn cần chuyển đổi vị trí pixel hiện tại của mình thành chỉ mục ô vuông, bạn tìm thấy điểm tối thiểu / tối đa của mình (Tôi thêm một chút vào MAX của mình để nó vượt ra ngoài màn hình hiển thị một chút ), và sau đó bạn có thể vẽ nó.
Tôi thực sự đề nghị xem loạt bài hướng dẫn. Anh ấy đề cập đến vấn đề hiện tại của bạn, cách tạo trình chỉnh sửa ô, giữ trình phát trong giới hạn, hoạt hình sprite, tương tác AI, v.v ...
Bên cạnh đó, TiledLib đã tích hợp sẵn. Bạn cũng có thể nghiên cứu mã của họ.