public override void draw(SpriteBatch spriteBatch, Vector2 position, float layerDepth, RectangleF cameraClipBounds) { // offset it by the entity position since the tilemap will always expect positions in its own coordinate space cameraClipBounds.location -= position; var minX = tilemap.worldPositionToTilePositionX(cameraClipBounds.left); var minY = tilemap.worldPositionToTilePositionY(cameraClipBounds.top); var maxX = tilemap.worldPositionToTilePositionX(cameraClipBounds.right); var maxY = tilemap.worldPositionToTilePositionY(cameraClipBounds.bottom); // loop through and draw all the non-culled tiles for (var y = minY; y <= maxY; y++) { for (var x = minX; x <= maxX; x++) { var tile = getTile(x, y); if (tile == null) { continue; } var tileRegion = tile.textureRegion; var tx = tile.x * tilemap.tileWidth + (int)position.X; var ty = tile.y * tilemap.tileHeight + (int)position.Y; var rotation = 0f; var spriteEffects = SpriteEffects.None; if (tile.flippedHorizonally) { spriteEffects |= SpriteEffects.FlipHorizontally; } if (tile.flippedVertically) { spriteEffects |= SpriteEffects.FlipVertically; } if (tile.flippedDiagonally) { if (tile.flippedHorizonally && tile.flippedVertically) { spriteEffects ^= SpriteEffects.FlipVertically; rotation = MathHelper.PiOver2; tx += tilemap.tileWidth; } else if (tile.flippedHorizonally) { spriteEffects ^= SpriteEffects.FlipVertically; rotation = -MathHelper.PiOver2; ty += tilemap.tileHeight; } else if (tile.flippedVertically) { spriteEffects ^= SpriteEffects.FlipHorizontally; rotation = MathHelper.PiOver2; tx += tilemap.tileWidth; } else { spriteEffects ^= SpriteEffects.FlipHorizontally; rotation = -MathHelper.PiOver2; ty += tilemap.tileHeight; } } spriteBatch.Draw(tileRegion.texture2D, new Vector2(tx, ty), tileRegion.sourceRect, color, rotation, Vector2.Zero, 1, spriteEffects, layerDepth); } } }