コード例 #1
0
        private static BitmapSpriteFrame[] ParseFrames(Stream s)
        {
            var       numTiles  = 16;
            var       start     = s.Position;
            var       frames    = new List <BitmapSpriteFrame>();
            const int tileWidth = 32;

            var numPixels       = tileWidth * tileWidth;
            var numBytesPerTile = numPixels / 8;
            var dataSize        = new Size(tileWidth, tileWidth);
            var size            = new Size(tileWidth, tileWidth);

            s.Seek(0, SeekOrigin.Begin);
            for (var i = 0; i < numTiles; i++)
            {
                var bytes        = s.ReadBytes(numBytesPerTile);
                var swappedBytes = new List <byte>();
                for (var rowIndex = 0; rowIndex < tileWidth; rowIndex++)
                {
                    var row = bytes.Skip(rowIndex * 4).Take(4).Reverse().ToList();
                    swappedBytes.AddRange(row);
                }

                var newBytes = swappedBytes.ToArray();

                var bits          = new BitArray(newBytes);
                var unpackedBytes = new byte[numPixels];
                for (var byteI = 0; byteI < numPixels; byteI++)
                {
                    unpackedBytes[byteI] = (byte)(bits[byteI] ? 1 : 0);
                }

                var tile = new BitmapSpriteFrame
                {
                    Size      = size,
                    FrameSize = size,
                    Data      = unpackedBytes,
                    Type      = SpriteFrameType.Indexed,
                };

                frames.Add(tile);
            }

            s.Position = start;

            return(frames.ToArray());
        }
コード例 #2
0
ファイル: Op2TileSetLoader.cs プロジェクト: OpenOP2/OpenOP2
        private static BitmapSpriteFrame[] ParseFrames(Stream s)
        {
            var       start     = s.Position;
            var       frames    = new List <BitmapSpriteFrame>();
            const int tileWidth = 32;
            var       dataSize  = new Size(tileWidth * 8, tileWidth * 8);
            var       size      = new Size(tileWidth, tileWidth);
            var       frameSize = new Size(0, 0);

            s.Seek(12, SeekOrigin.Begin);
            var something = s.ReadDouble();
            var width     = s.ReadUInt32();
            var height    = s.ReadUInt32();
            var numTiles  = height / width;

            s.Seek(1088, SeekOrigin.Begin);
            var header = s.ReadASCII(4);

            var blockSize = s.ReadUInt32();

            for (var i = 0; i < numTiles; i++)
            {
                var bytes = s.ReadBytes(tileWidth * tileWidth);
                var tile  = new BitmapSpriteFrame
                {
                    Size      = size,
                    FrameSize = size,
                    Data      = bytes,
                    Type      = SpriteFrameType.Indexed,
                };

                frames.Add(tile);
            }

            s.Position = start;

            return(frames.ToArray());
        }