Beispiel #1
0
        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);
                }
            }
        }