public Queue <WorldObject> Draw(SpriteBatch spriteBatch, Camera camera, Player player) { var tileStartX = (int)(camera.X - ScreenProperties.ScreenWidth / 3.0f) / TileSize - 1; var tileStartY = (int)(camera.Y - ScreenProperties.ScreenHeight / 3.0f) / TileSize - 1; var tileEndX = (int)(camera.X + ScreenProperties.ScreenWidth / 3.0f) / TileSize + 1; var tileEndY = (int)(camera.Y + ScreenProperties.ScreenHeight / 3.0f) / TileSize + 1; tileStartX = MathHelper.Clamp(tileStartX, 0, MapWidth); tileEndX = MathHelper.Clamp(tileEndX, 0, MapWidth); tileStartY = MathHelper.Clamp(tileStartY, 0, MapHeight); tileEndY = MathHelper.Clamp(tileEndY, 0, MapHeight); for (var i = tileStartX; i < tileEndX; i++) { for (var j = tileStartY; j < tileEndY; j++) { if (_tiles[i, j].IsDry) { var tilePos = RenderHelper.CalculateNeighbourBit(_tiles[i, j]); var x = tilePos % 4; var y = tilePos / 4; spriteBatch.Draw(ContentChest.Grass, new Vector2(i * TileSize, j * TileSize), new Rectangle(x * TileSize, y * TileSize, TileSize, TileSize), Color.White); } else { var tileTop = _tiles[i, j].North; if (tileTop != null && tileTop.IsDry) { spriteBatch.Draw(WaterEdgeAnimation.Current, new Vector2(i * TileSize, j * TileSize), Color.White); } else { spriteBatch.Draw(ContentChest.Water, new Vector2(i * TileSize, j * TileSize), Color.White); } } if (_tiles[i, j].DroppedItem != null) { var item = _tiles[i, j].DroppedItem; spriteBatch.Draw(ContentChest.Items[item.FileName], new Rectangle(i * TileSize, j * TileSize, TileSize, TileSize), Color.White); } if (_tiles[i, j].WorldObject != null) { _objectQueue.Enqueue(_tiles[i, j].WorldObject); } } } var stillToDraw = new Queue <WorldObject>(); while (_objectQueue.Count > 0) { var obj = _objectQueue.Dequeue(); if (obj.Tile.Y > player.Tile.Y) { stillToDraw.Enqueue(obj); continue; } DrawObject(spriteBatch, obj); } return(stillToDraw); }