Ejemplo n.º 1
0
        private static Sprite.Animation copyAnim(KeyValuePair <string, Sprite.Animation> anim, string name)
        {
            Sprite.Animation ae = new Sprite.Animation();
            ae.Frames = anim.Value.Frames;
            ae.Delay  = anim.Value.Delay;
            ae.Goto   = new Chooser <string>(name);

            return(ae);
        }
Ejemplo n.º 2
0
        // Add any missing vanilla animations to an overridden sprite
        private void PatchSprite(Sprite origSprite, Sprite newSprite)
        {
            Dictionary <string, Sprite.Animation> newAnims = newSprite.GetAnimations();

            foreach (KeyValuePair <string, Sprite.Animation> animEntry in origSprite.GetAnimations())
            {
                string           origAnimId = animEntry.Key;
                Sprite.Animation origAnim   = animEntry.Value;
                if (!newAnims.ContainsKey(origAnimId))
                {
                    newAnims[origAnimId] = origAnim;
                }
            }
        }
        // Add any missing vanilla animations to an overridden sprite
        private void PatchSprite(Sprite origSprite, Sprite newSprite)
        {
            Dictionary <string, Sprite.Animation> newAnims = newSprite.GetAnimations();
            // Shallow copy... sometimes new animations get added mid-update?
            Dictionary <string, Sprite.Animation> oldAnims = new Dictionary <string, Sprite.Animation>(origSprite.GetAnimations());

            foreach (KeyValuePair <string, Sprite.Animation> animEntry in oldAnims)
            {
                string           origAnimId = animEntry.Key;
                Sprite.Animation origAnim   = animEntry.Value;
                if (!newAnims.ContainsKey(origAnimId))
                {
                    newAnims[origAnimId] = origAnim;
                }
            }
        }
Ejemplo n.º 4
0
        /// <summary>
        ///
        /// </summary>
        public static void Load()
        {
            Packer packer = new Packer();

            packer.Padding = 0;

            // Load the main font.
            Font         = new SpriteFont(Path() + "fonts/dogica.ttf", 6, ASCII, TextureFilter.Nearest);
            Font.LineGap = 4;

            int packIndex = 0;

            #region Load sprites

            List <SpriteInfo> spriteInfo = new List <SpriteInfo>();

            // Get all sprites.
            string spritePath = Path() + "sprites/";
            foreach (string it in Directory.EnumerateFiles(spritePath))
            {
                if (!it.EndsWith(".ase"))
                {
                    continue;
                }

                SpriteInfo info = new SpriteInfo();
                info.Aseprite  = new Aseprite(it);
                info.Name      = System.IO.Path.GetFileNameWithoutExtension(it);
                info.PackIndex = packIndex;

                foreach (var frame in info.Aseprite.Frames)
                {
                    packer.AddBitmap(packIndex.ToString(), frame.Bitmap);
                    packIndex++;
                }

                spriteInfo.Add(info);
            }

            #endregion

            #region Load tilesets

            List <SpriteInfo> tilesetInfo = new List <SpriteInfo>();

            // Get all tilesets.
            string tilesetPath = Path() + "tilesets/";
            foreach (string it in Directory.EnumerateFiles(tilesetPath))
            {
                if (!it.EndsWith(".ase"))
                {
                    continue;
                }

                SpriteInfo info = new SpriteInfo();
                info.Aseprite  = new Aseprite(it);
                info.Name      = System.IO.Path.GetFileNameWithoutExtension(it);
                info.PackIndex = packIndex;

                var frame   = info.Aseprite.Frames[0];
                var columns = frame.Bitmap.Width / Game.TileWidth;
                var rows    = frame.Bitmap.Height / Game.TileHeight;

                for (int x = 0; x < columns; x++)
                {
                    for (int y = 0; y < rows; y++)
                    {
                        var subrect  = new RectInt(x * Game.TileWidth, y * Game.TileHeight, Game.TileWidth, Game.TileHeight);
                        var subimage = frame.Bitmap.GetSubBitmap(subrect);
                        packer.AddBitmap(packIndex.ToString(), subimage);
                        packIndex++;
                    }
                }

                tilesetInfo.Add(info);
            }

            #endregion

            // Build the atlas.
            packer.Pack();
            SpriteAtlas = new Atlas(packer);

            #region Add sprites

            foreach (SpriteInfo info in spriteInfo)
            {
                Sprite sprite = new Sprite();
                sprite.Name       = info.Name;
                sprite.Origin     = Vector2.Zero;
                sprite.Animations = new List <Sprite.Animation>();

                if (info.Aseprite.Slices.Count > 0 && info.Aseprite.Slices[0].Pivot.HasValue)
                {
                    sprite.Origin = new Vector2(
                        info.Aseprite.Slices[0].Pivot.Value.X,
                        info.Aseprite.Slices[0].Pivot.Value.Y
                        );
                }

                foreach (var tag in info.Aseprite.Tags)
                {
                    Sprite.Animation anim = new Sprite.Animation();
                    anim.Name   = tag.Name;
                    anim.Frames = new List <Sprite.Frame>();

                    for (int i = tag.From; i <= tag.To; i++)
                    {
                        Sprite.Frame frame = new Sprite.Frame();
                        frame.Duration = info.Aseprite.Frames[i].Duration / 1000.0f;
                        frame.Image    = SpriteAtlas.Subtextures[(info.PackIndex + i).ToString()];
                        anim.Frames.Add(frame);
                    }

                    sprite.Animations.Add(anim);
                }

                Sprites.Add(sprite);
            }

            #endregion

            #region Add Tilesets

            foreach (SpriteInfo info in tilesetInfo)
            {
                var frame = info.Aseprite.Frames[0];

                Tileset tileset = new Tileset();
                tileset.Name    = info.Name;
                tileset.Columns = frame.Bitmap.Width / Game.TileWidth;
                tileset.Rows    = frame.Bitmap.Height / Game.TileHeight;

                for (int x = 0, i = info.PackIndex; x < tileset.Columns; x++)
                {
                    for (int y = 0; y < tileset.Rows; y++)
                    {
                        tileset.Tiles[x + y * tileset.Columns] = SpriteAtlas.Subtextures[i.ToString()];
                        i++;
                    }
                }

                Tilesets.Add(tileset);
            }

            #endregion

            // Load the rooms.
            string mapPath = Path() + "map/";
            foreach (string it in Directory.EnumerateFiles(mapPath))
            {
                if (!it.EndsWith(".png"))
                {
                    continue;
                }

                var name  = System.IO.Path.GetFileNameWithoutExtension(it);
                var point = name.Split('x');
                if (point.Length != 2)
                {
                    continue;
                }

                RoomInfo info;
                info.Cell.X = int.Parse(point[0]);
                info.Cell.Y = int.Parse(point[1]);
                info.Image  = new Bitmap(it);

                Debug.Assert(info.Image.Width == Game.Columns, "Room is incorrect width!");
                Debug.Assert(info.Image.Height == Game.Rows, "Room is incorrect height!");

                Rooms.Add(info);
            }
        }