private void DrawChunk(Chunk chunk) { if (chunk == null) { return; } Tile firstTile = chunk.GetTile(0, 0); bool isRandom = false; for (int i = 0; i < Chunk.Size * Chunk.Size; i++) { Tile tile = chunk.GetTile(i); if (firstTile.ID != tile.ID) { isRandom = true; break; } } if (!isRandom) { if (TryGetTileRegion(firstTile, out var region)) { int x = chunk.Position.TileX; int y = chunk.Position.TileY; _spriteBatch.Draw(region, new RectangleF(x * 8, y * 8, 8 * Chunk.Size, 8 * Chunk.Size), Color.White); } return; } // draw chunk for (int y = 0; y < Chunk.Size; y++) { for (int x = 0; x < Chunk.Size; x++) { if (!chunk.TryGetTile(x, y, out Tile tile)) { continue; } if (!TryGetTileRegion(tile, out TextureRegion2D region)) { continue; } int xx = x + chunk.Position.TileX; int yy = y + chunk.Position.TileY; var dst = new RectangleF(xx * 8, yy * 8, 8, 8); float flipNoise = _noise.CalcPixel2D(xx, yy, 1f); SpriteEffects flip = SpriteEffects.None; if (flipNoise > 85) { flip = flipNoise > 170 ? SpriteEffects.FlipVertically : SpriteEffects.FlipHorizontally; } _spriteBatch.Draw( region.Texture, dst, region.Bounds, Color.White, 0, Vector2.Zero, flip, 0); } } }