Exemplo n.º 1
0
        protected override void OnRender(DrawingContext dc)
        {
            var bitmap = new WriteableBitmap((int)(Screen.PixelWidth * this.Zoom), (int)(Screen.PixelHeight * this.Zoom), 96, 96, PixelFormats.Pbgra32, null);

            base.OnRender(dc);

            var size = Screen.Tileset.TileSize * this.Zoom;

            for (int y = 0; y < Screen.Height; y++)
            {
                for (int x = 0; x < Screen.Width; x++)
                {
                    var tile     = Screen.TileAt(x, y);
                    var location = tile.Sprite.CurrentFrame.SheetLocation;
                    var rect     = new Rect(0, 0, location.Width, location.Height);

                    if (_grayscale)
                    {
                        var image = SpriteBitmapCache.GetOrLoadFrameGrayscale(Screen.Tileset.SheetPath.Absolute, location);
                        bitmap.Blit(new Rect(x * size, y * size, size, size), image, rect);
                    }
                    else
                    {
                        var image = SpriteBitmapCache.GetOrLoadFrame(Screen.Tileset.SheetPath.Absolute, location);
                        bitmap.Blit(new Rect(x * size, y * size, size, size), image, rect);
                    }
                }
            }

            dc.DrawImage(bitmap, new Rect(0, 0, bitmap.PixelWidth, bitmap.PixelHeight));
        }
Exemplo n.º 2
0
        protected override void OnRender(System.Windows.Media.DrawingContext dc)
        {
            base.OnRender(dc);

            foreach (var placement in Screen.Entities)
            {
                var entity = Screen.Stage.Project.EntityByName(placement.entity);

                if (entity != null)
                {
                    var sprite = entity.DefaultSprite;
                    if (sprite != null)
                    {
                        var frame = SpriteBitmapCache.GetOrLoadFrame(sprite.SheetPath.Absolute, sprite.CurrentFrame.SheetLocation);

                        var flip = (placement.direction == Common.Direction.Left) ^ sprite.Reversed;
                        int hx   = flip ? sprite.Width - sprite.HotSpot.X : sprite.HotSpot.X;

                        dc.DrawImage(frame, new Rect(this.Zoom * (placement.screenX - hx), this.Zoom * (placement.screenY - sprite.HotSpot.Y), this.Zoom * frame.PixelWidth, this.Zoom * frame.PixelHeight));

                        continue;
                    }
                }

                dc.DrawEllipse(Brushes.Orange, null, new System.Windows.Point(this.Zoom * placement.screenX, this.Zoom * placement.screenY), 10 * Zoom, 10 * Zoom);
            }
        }
        protected virtual void Tick()
        {
            if (_brush == null)
            {
                return;
            }

            var width  = _brush.Cells.Length;
            var height = _brush.Cells[0].Length;

            for (var x = 0; x < width; x++)
            {
                for (var y = 0; y < height; y++)
                {
                    var cell  = _brush.Cells[x][y];
                    var image = this._images[x * height + y];

                    var location = cell.tile.Sprite.CurrentFrame.SheetLocation;

                    var source = SpriteBitmapCache.GetOrLoadFrame(cell.tile.Sprite.SheetPath.Absolute, location);

                    image.Source = source;
                    image.InvalidateVisual();
                }
            }
        }
Exemplo n.º 4
0
 public TilesetImporter(TilesetDocument tileset)
 {
     Tileset = tileset;
     if (Tileset != null)
     {
         Tilesheet = SpriteBitmapCache.GetOrLoadImage(Tileset.SheetPath.Absolute);
     }
 }
Exemplo n.º 5
0
        public override WriteableBitmap GetImageSource(double zoom)
        {
            var scaledOverlay = SpriteBitmapCache.Scale(_overlay, zoom);
            var spriteImg     = BitmapFactory.ConvertToPbgra32Format(base.GetImageSource(zoom));
            var centerX       = (spriteImg.Width - scaledOverlay.Width) / 2;
            var centerY       = (spriteImg.Height - scaledOverlay.Height) / 2;
            var destRect      = new System.Windows.Rect(centerX, centerY, scaledOverlay.Width, scaledOverlay.Height);

            spriteImg.Blit(destRect, scaledOverlay, new System.Windows.Rect(0, 0, scaledOverlay.Width, scaledOverlay.Height));

            return(spriteImg);
        }
Exemplo n.º 6
0
        public virtual WriteableBitmap GetImageSource(double zoom)
        {
            var location = _sprite.CurrentFrame.SheetLocation;

            var image = SpriteBitmapCache.GetOrLoadFrame(_sprite.SheetPath.Absolute, location);

            if (zoom != 1)
            {
                image = SpriteBitmapCache.Scale(image, zoom);
            }

            return(image);
        }
Exemplo n.º 7
0
        protected virtual void Tick()
        {
            if (_sprite == null)
            {
                return;
            }

            var location = _sprite.CurrentFrame.SheetLocation;

            var image = SpriteBitmapCache.GetOrLoadFrame(_sprite.SheetPath.Absolute, location);

            _image.Source = image;
            _image.InvalidateVisual();
        }
Exemplo n.º 8
0
        private Dictionary <WriteableBitmap, List <SpriteFrame> > RipAllFrames()
        {
            if (Tileset == null)
            {
                return(null);
            }

            var threadedSheet = BitmapFactory.ConvertToPbgra32Format(SpriteBitmapCache.GetOrLoadImage(Tileset.SheetPath.Absolute));

            return(Tileset.Tiles
                   .SelectMany(t => t.Sprite)
                   .Select(frame => new { Frame = frame, Image = CutFrame(threadedSheet, frame.SheetLocation) })
                   .GroupBy(x => x.Image)
                   .ToDictionary(x => x.Key, x => x.Select(a => a.Frame).ToList()));
        }
        public TilesetImageImportDialogViewModel(string imagePath, int snap = 0, int offset = 0)
        {
            Image       = SpriteBitmapCache.GetOrLoadImage(imagePath);
            ImageWidth  = Image.PixelWidth;
            ImageHeight = Image.PixelHeight;

            FileName = Path.GetFileNameWithoutExtension(imagePath);
            Title    = string.Format("Import {0}", FileName);

            OnPropertyChanged("Image");
            OnPropertyChanged("ImageWidth");
            OnPropertyChanged("ImageHeight");
            OnPropertyChanged("Title");

            Spacing = snap;
            Offset  = offset;
        }
Exemplo n.º 10
0
        private double GetTileDifferenceScore(WriteableBitmap image, Common.Tile tile)
        {
            var frame = SpriteBitmapCache.GetOrLoadFrame(Stage.Tileset.SheetPath.Absolute, tile.Sprite[0].SheetLocation);

            var scores = new List <int>();

            for (var y = 0; y < frame.PixelHeight; y++)
            {
                for (var x = 0; x < frame.PixelWidth; x++)
                {
                    var imgPixel   = image.GetPixel(x, y);
                    var framePixel = frame.GetPixel(x, y);
                    scores.Add((imgPixel.R - framePixel.R) + (imgPixel.G - framePixel.G) + (imgPixel.B - framePixel.B));
                }
            }

            return(Math.Abs(scores.Average()));
        }
Exemplo n.º 11
0
        protected override void OnRender(DrawingContext dc)
        {
            base.OnRender(dc);

            var image = SpriteBitmapCache.GetOrLoadFrame(_playerSprite.SheetPath.Absolute, _playerSprite.CurrentFrame.SheetLocation);

            image = SpriteBitmapCache.Scale(image, this.Zoom);

            if (Screen.Name == Screen.Stage.StartScreen)
            {
                var p = Screen.Stage.StartPoint;
                dc.DrawImage(image, new System.Windows.Rect(Zoom * (p.X - _playerSprite.HotSpot.X), Zoom * (p.Y - _playerSprite.HotSpot.Y), image.PixelWidth, image.PixelHeight));
            }

            if (Screen.Stage.ContinuePoints.ContainsKey(Screen.Name))
            {
                var p = Screen.Stage.ContinuePoints[Screen.Name];
                dc.DrawImage(image, new System.Windows.Rect(Zoom * (p.X - _playerSprite.HotSpot.X), Zoom * (p.Y - _playerSprite.HotSpot.Y), image.PixelWidth, image.PixelHeight));
            }
        }
Exemplo n.º 12
0
        public void SaveTileset(TilesetDocument tileset)
        {
            var tilesetWriter = _writerProvider.GetTilesetWriter();

            tilesetWriter.Save(tileset.Tileset);
            SaveBrushes(tileset);

            if (tileset.IsSheetDirty)
            {
                var sheet = SpriteBitmapCache.GetOrLoadImage(tileset.SheetPath.Absolute);

                using (var fileStream = new FileStream(tileset.SheetPath.Absolute, FileMode.OpenOrCreate))
                {
                    BitmapEncoder encoder = new PngBitmapEncoder();
                    encoder.Frames.Add(BitmapFrame.Create(sheet));
                    encoder.Save(fileStream);
                }

                tileset.IsSheetDirty = false;
            }
        }
Exemplo n.º 13
0
        public void CompactTilesheet()
        {
            var allFrames = RipAllFrames();
            var total     = allFrames.Count;
            var root      = Math.Sqrt(total);
            var width     = (int)Math.Ceiling(root);
            var height    = (int)Math.Ceiling(total / (double)width);

            var tilesheet = new WriteableBitmap(width * 16, height * 16, 96, 96, PixelFormats.Pbgra32, null);

            var x      = 0;
            var y      = 0;
            var source = new System.Windows.Rect(0, 0, 16, 16);

            foreach (var frame in allFrames)
            {
                var dest = new System.Windows.Rect(x, y, 16, 16);
                tilesheet.Blit(dest, frame.Key, source);

                foreach (var spriteFrame in frame.Value)
                {
                    spriteFrame.SetSheetPosition(x, y);
                }

                if (x < 16 * (width - 1))
                {
                    x += 16;
                }
                else
                {
                    x  = 0;
                    y += 16;
                }
            }

            Tilesheet = tilesheet;
            SpriteBitmapCache.InsertSource(Tileset.SheetPath.Absolute, tilesheet);
            Tileset.RefreshSheet();
        }
Exemplo n.º 14
0
        private void AppendNewTilesToSheet(List <WriteableBitmap> tempTiles)
        {
            var total           = tempTiles.Count;
            var tileWidth       = Tilesheet.PixelWidth / 16;
            var addedTileHeight = (int)Math.Ceiling(total / (double)tileWidth);

            var tilesheet       = new WriteableBitmap(Tilesheet.PixelWidth, Tilesheet.PixelHeight + addedTileHeight * 16, 96, 96, PixelFormats.Pbgra32, null);
            var writeableSource = BitmapFactory.ConvertToPbgra32Format(Tilesheet);
            var originalRect    = new System.Windows.Rect(0, 0, Tilesheet.PixelWidth, Tilesheet.PixelHeight);

            tilesheet.Blit(originalRect, writeableSource, originalRect);

            var x      = 0;
            var y      = Tilesheet.PixelHeight;
            var source = new System.Windows.Rect(0, 0, 16, 16);

            foreach (var frame in tempTiles)
            {
                var dest = new System.Windows.Rect(x, y, 16, 16);
                tilesheet.Blit(dest, frame, source);

                var tile = Tileset.AddTile();
                tile.Sprite.CurrentFrame.SetSheetPosition(x, y);

                if (x < 16 * (tileWidth - 1))
                {
                    x += 16;
                }
                else
                {
                    x  = 0;
                    y += 16;
                }
            }

            Tilesheet = tilesheet;
            SpriteBitmapCache.InsertSource(Tileset.SheetPath.Absolute, tilesheet);
            Tileset.RefreshSheet();
        }
Exemplo n.º 15
0
 public OverlaySpriteModel(Sprite sprite, string overlayPath) : base(sprite)
 {
     _overlay = BitmapFactory.ConvertToPbgra32Format(SpriteBitmapCache.GetResource(overlayPath));
 }