private void Load()
        {
            Spriter = LoadContent <Spriter>(scmlPath);
            if (Spriter.Atlases == null || Spriter.Atlases.Length == 0)
            {
                return;
            }
            atlases = new Dictionary <int, SpriterAtlas>();
            infos   = new Dictionary <SpriterAtlas, Dictionary <string, ImageInfo> >();

            foreach (var atlasRef in Spriter.Atlases)
            {
                String       path  = FormatPath(atlasRef.Name);
                SpriterAtlas atlas = content.Load <SpriterAtlas>(path);
                atlases[atlasRef.Id] = atlas;

                Dictionary <string, ImageInfo> imageInfos = new Dictionary <string, ImageInfo>();
                infos[atlas] = imageInfos;

                foreach (ImageInfo info in atlas.ImageInfos)
                {
                    imageInfos[info.Name] = info;
                }
            }
        }
 private void GetUsedFiles(Spriter.Animation animation, HashSet<Spriter.File> files)
 {
     foreach(var timeline in animation.Timelines)
     {
         GetUsedFiles(timeline, files);
     }
 }
Beispiel #3
0
        private static IEnumerable <SdnFileEntry> LoadAssets(Spriter spriter, string rootFolder, SpriterDotNetBehaviour spriterDotNetBehaviour, bool andAssignAudioClips)
        {
            for (int i = 0; i < spriter.Folders.Length; ++i)
            {
                SpriterFolder folder = spriter.Folders[i];

                for (int j = 0; j < folder.Files.Length; ++j)
                {
                    SpriterFile file = folder.Files[j];
                    string      path = rootFolder;
                    path += "/";
                    path += file.Name;

                    SdnFileEntry entry = new SdnFileEntry
                    {
                        FolderId = folder.Id,
                        FileId   = file.Id
                    };

                    if (file.Type == SpriterFileType.Sound)
                    {
                        spriterDotNetBehaviour.StartCoroutine(GetAudioClip(entry, path, spriterDotNetBehaviour, andAssignAudioClips));
                    }
                    else
                    {
                        entry.Sprite = LoadNewSprite(path);
                    }

                    yield return(entry);
                }
            }
        }
Beispiel #4
0
        private static SpriterEntity FetchOrCacheSpriterEntityDataFromFile(string path, string entityName, SpriterDotNetBehaviour spriterDotNetBehaviour)
        {
            if (SpriterEntityDatas.TryGetValue(new PathToEntity(path, entityName), out SpriterEntityData cachedEntityData))
            {
                spriterDotNetBehaviour.SpriterData = cachedEntityData.data;
                return(cachedEntityData.entity);
            }

            string  data       = File.ReadAllText(path);
            Spriter spriter    = SpriterReader.Default.Read(data);
            string  rootFolder = Path.GetDirectoryName(path);

            SpriterEntity requestedEntity = null;

            foreach (SpriterEntity entity in spriter.Entities)
            {
                bool              isRequestedEntity = entity.Name == entityName;
                SpriterData       spriterData       = CreateSpriterData(spriter, rootFolder, spriterDotNetBehaviour, isRequestedEntity);
                SpriterEntityData entityData        = new SpriterEntityData(entity, spriterData);
                SpriterEntityDatas[new PathToEntity(path, entity.Name)] = entityData;
                if (isRequestedEntity)
                {
                    requestedEntity = entity;
                    spriterDotNetBehaviour.SpriterData = spriterData;
                }
            }

            return(requestedEntity);
        }
        private void Load()
        {
            string data = File.ReadAllText(content.RootDirectory + "/" + scmlPath + ".scml");

            Spriter = SpriterReader.Default.Read(data);
            if (Spriter.Atlases == null || Spriter.Atlases.Length == 0)
            {
                return;
            }
            atlases = new Dictionary <int, TexturePackerSheet>();
            infos   = new Dictionary <TexturePackerSheet, Dictionary <string, ImageInfo> >();

            foreach (var atlasRef in Spriter.Atlases)
            {
                string             path      = FormatPath(atlasRef.Name);
                string             atlasData = File.ReadAllText(content.RootDirectory + "/" + path);
                TexturePackerSheet atlas     = TexturePackerSheetReader.Read(atlasData);

                atlases[atlasRef.Id] = atlas;

                Dictionary <string, ImageInfo> imageInfos = new Dictionary <string, ImageInfo>();
                infos[atlas] = imageInfos;

                foreach (ImageInfo info in atlas.ImageInfos)
                {
                    imageInfos[info.Name] = info;
                }
            }
        }
Beispiel #6
0
        private static void CreateSprites(SpriterEntity entity, ChildData cd, Spriter spriter, GameObject parent)
        {
            int maxObjects = GetDrawablesCount(entity);

            cd.Sprites               = new GameObject[maxObjects];
            cd.SpritePivots          = new GameObject[maxObjects];
            cd.SpriteTransforms      = new Transform[maxObjects];
            cd.SpritePivotTransforms = new Transform[maxObjects];

            for (int i = 0; i < maxObjects; ++i)
            {
                GameObject pivot = new GameObject("Pivot " + i);
                GameObject child = new GameObject("Sprite " + i);

                pivot.SetParent(parent);
                child.SetParent(pivot);

                cd.SpritePivots[i]          = pivot;
                cd.Sprites[i]               = child;
                cd.SpritePivotTransforms[i] = pivot.transform;
                cd.SpriteTransforms[i]      = child.transform;

                child.transform.localPosition = Vector3.zero;

                child.AddComponent <SpriteRenderer>();
            }
        }
Beispiel #7
0
        private static int GetDrawablesCount(SpriterAnimation animation, SpriterMainlineKey key)
        {
            int drawablesCount = 0;

            foreach (SpriterObjectRef obj in key.ObjectRefs)
            {
                SpriterTimeline timeline = animation.Timelines[obj.TimelineId];
                if (timeline.ObjectType == SpriterObjectType.Sprite)
                {
                    ++drawablesCount;
                }
                else if (timeline.ObjectType == SpriterObjectType.Entity)
                {
                    Spriter spriter = animation.Entity.Spriter;
                    HashSet <SpriterAnimation> animations = new HashSet <SpriterAnimation>();
                    foreach (SpriterTimelineKey timelineKey in timeline.Keys)
                    {
                        SpriterObject    spriterObject = timelineKey.ObjectInfo;
                        SpriterAnimation newAnim       = spriter.Entities[spriterObject.EntityId].Animations[spriterObject.AnimationId];
                        if (!animations.Contains(newAnim))
                        {
                            animations.Add(newAnim);
                        }
                    }
                    IEnumerable <int> drawableCount = animations.Select <SpriterAnimation, int>(GetDrawablesCount);
                    drawablesCount += drawableCount.Max();
                }
            }

            return(drawablesCount);
        }
 private void GetUsedFiles(Spriter.Entity entity, HashSet<Spriter.File> files)
 {
     foreach(var animation in entity.Animations)
     {
         GetUsedFiles(animation, files);
     }
 }
Beispiel #9
0
        private static IEnumerable <SdnFileEntry> LoadAssets(Spriter spriter, string rootFolder)
        {
            for (int i = 0; i < spriter.Folders.Length; ++i)
            {
                SpriterFolder folder = spriter.Folders[i];

                for (int j = 0; j < folder.Files.Length; ++j)
                {
                    SpriterFile file = folder.Files[j];
                    string      path = rootFolder;
                    path += "/";
                    path += file.Name;

                    SdnFileEntry entry = new SdnFileEntry
                    {
                        FolderId = folder.Id,
                        FileId   = file.Id
                    };

                    if (file.Type == SpriterFileType.Sound)
                    {
                        entry.Sound = ContentLoader.Load <AudioClip>(path);
                    }
                    else
                    {
                        entry.Sprite = ContentLoader.Load <Sprite>(path);
                    }

                    yield return(entry);
                }
            }
        }
        public void Init_IfCalledOnASpriterWithAFullHierarchy_SetsTimelineKeyObjectInfosToThePivotsFromTheFiles()
        {
            var spriter = new Spriter()
            {
                Folders = new[]
                {
                    new SpriterFolder()
                    {
                        Id    = 0,
                        Files = new[]
                        {
                            new SpriterFile()
                            {
                                Id     = 0,
                                PivotX = 0.25f,
                                PivotY = 0.75f
                            }
                        }
                    }
                },
                Entities = new[]
                {
                    new SpriterEntity()
                    {
                        Animations = new []
                        {
                            new SpriterAnimation()
                            {
                                Timelines = new []
                                {
                                    new SpriterTimeline()
                                    {
                                        Keys = new[]
                                        {
                                            new SpriterTimelineKey()
                                            {
                                                ObjectInfo = new SpriterObject()
                                                {
                                                    FolderId = 0,
                                                    FileId   = 0,
                                                    PivotX   = float.NaN,
                                                    PivotY   = float.NaN
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            };

            SpriterParser.Init(spriter);

            var objectInfo = spriter.Entities.First().Animations.First().Timelines.First().Keys.First().ObjectInfo;

            objectInfo.PivotX.Should().Be(0.25f);
            objectInfo.PivotY.Should().Be(0.75f);
        }
Beispiel #11
0
        protected override void LoadContent()
        {
            base.LoadContent();

            spriteBatch = new SpriteBatch(GraphicsDevice);

            spriteFont = Content.Load <SpriteFont>(FontName);
            Vector2 charPosition = new Vector2(Width / 2.0f, Height / 1.5f);

            foreach (var pair in Scmls)
            {
                string  scmlPath    = pair.Key;
                string  spriterName = pair.Value;
                string  data        = File.ReadAllText(scmlPath);
                Spriter spriter     = SpriterParser.Parse(data);

                foreach (SpriterEntity entity in spriter.Entities)
                {
                    var animator = new MonogameSpriterAnimator(entity, charPosition, spriteBatch, GraphicsDevice);
                    RegisterTextures(animator, spriter, spriterName);
                    animators.Add(animator);
                }
            }

            currentAnimator = animators.First();
            currentAnimator.EventTriggered += CurrentAnimator_EventTriggered;
        }
        public void Init_IfCalledOnASpriterWithAFullHierarchy_SetsTimelineKeyObjectInfosToThePivotsFromTheFiles()
        {
            var spriter = new Spriter()
            {
                Folders = new[]
                {
                        new SpriterFolder()
                        {
                            Id = 0,
                            Files = new[]
                            {
                                new SpriterFile()
                                {
                                    Id = 0,
                                    PivotX = 0.25f,
                                    PivotY = 0.75f
                                }
                            }
                        }
                    },
                Entities = new[]
                {
                    new SpriterEntity()
                    {
                        Animations = new []
                        {
                            new SpriterAnimation()
                            {
                                Timelines = new []
                                {
                                    new SpriterTimeLine()
                                    {
                                        Keys = new[]
                                        {
                                            new SpriterTimeLineKey()
                                            {
                                                ObjectInfo = new SpriterObjectInfo ()
                                                {
                                                    FolderId = 0,
                                                    FileId = 0,
                                                    PivotX = float.NaN,
                                                    PivotY = float.NaN
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            };

            SpriterParser.Init(spriter);

            var objectInfo = spriter.Entities.First().Animations.First().Timelines.First().Keys.First().ObjectInfo;
            objectInfo.PivotX.Should().Be(0.25f);
            objectInfo.PivotY.Should().Be(0.75f);
        }
Beispiel #13
0
        private static SpriterData CreateSpriterData(Spriter spriter, string rootFolder, SpriterDotNetBehaviour spriterDotNetBehaviour, bool andAssignAudioClips)
        {
            SpriterData data = ScriptableObject.CreateInstance <SpriterData>();

            data.Spriter     = spriter;
            data.FileEntries = LoadAssets(spriter, rootFolder, spriterDotNetBehaviour, andAssignAudioClips).ToArray();

            return(data);
        }
        public virtual Spriter Parse(string data)
        {
            data = FixBadNanValue(data);
            XmlSerializer serializer = new XmlSerializer(typeof(Spriter));

            using (TextReader reader = new StringReader(data))
            {
                Spriter spriter = serializer.Deserialize(reader) as Spriter;
                return(spriter);
            }
        }
Beispiel #15
0
        private static SpriterData CreateSpriterData(Spriter spriter, string rootFolder, string name)
        {
            SpriterData data = ScriptableObject.CreateInstance <SpriterData>();

            data.Spriter     = spriter;
            data.FileEntries = LoadAssets(spriter, rootFolder).ToArray();

            AssetDatabase.CreateAsset(data, rootFolder + "/" + name + ".asset");
            AssetDatabase.SaveAssets();

            return(data);
        }
        //1. Parse out all used file/folder ids
        public CharacterMap BuildMap(Spriter.Entity entity, GameObject root)
        {
            var files = new HashSet<Spriter.File>();
            GetUsedFiles(entity, files);

            //Build a character map from the used sprites
            var charMap = root.AddComponent<CharacterMap>();
            foreach(var file in files)
            {
                var fileMap = new FileMap { FilePath = file.Name, Sprite = file.GetSprite() };
                charMap.SetFile(file.Folder.Id, file.Id, fileMap);
            }
            return charMap;
        }
Beispiel #17
0
        private static void CreateTags(Spriter spriter)
        {
            if (spriter.Tags == null)
            {
                return;
            }

            SerializedObject   tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
            SerializedProperty tags       = tagManager.FindProperty("tags");

            foreach (SpriterElement tag in spriter.Tags)
            {
                AddTag(tags, tag.Name);
            }

            tagManager.ApplyModifiedProperties();
        }
Beispiel #18
0
        private static void CreatePoints(SpriterEntity entity, ChildData cd, Spriter spriter, GameObject parent)
        {
            GameObject pointRoot = new GameObject("Points");

            pointRoot.SetParent(parent);

            int count = GetPointsCount(entity);

            cd.Points = new GameObject[count];

            for (int i = 0; i < count; ++i)
            {
                GameObject point = new GameObject("Point " + i);
                point.SetParent(pointRoot);
                cd.Points[i] = point;
            }
        }
Beispiel #19
0
        private static void CreateSpriter(string path)
        {
            string  data       = File.ReadAllText(path);
            Spriter spriter    = SpriterReader.Default.Read(data);
            string  rootFolder = Path.GetDirectoryName(path);

            string      name        = Path.GetFileNameWithoutExtension(path);
            SpriterData spriterData = CreateSpriterData(spriter, rootFolder, name);

            foreach (SpriterEntity entity in spriter.Entities)
            {
                GameObject go       = new GameObject(entity.Name);
                GameObject sprites  = new GameObject(ObjectNameSprites);
                GameObject metadata = new GameObject(ObjectNameMetadata);

                SpriterDotNetBehaviour behaviour = go.AddComponent <SpriterDotNetBehaviour>();
                behaviour.UseNativeTags = UseNativeTags;
                if (HasSound(entity))
                {
                    go.AddComponent <AudioSource>();
                }

                sprites.SetParent(go);
                metadata.SetParent(go);

                ChildData cd = new ChildData();
                CreateSprites(entity, cd, spriter, sprites);
                CreateCollisionRectangles(entity, cd, spriter, metadata);
                CreatePoints(entity, cd, spriter, metadata);

                behaviour.EntityIndex = entity.Id;
                behaviour.enabled     = true;
                behaviour.SpriterData = spriterData;
                behaviour.ChildData   = cd;

                GameObject prefab = CreatePrefab(go, rootFolder);

                EntityImported(entity, prefab);
            }

            if (UseNativeTags)
            {
                CreateTags(spriter);
            }
        }
Beispiel #20
0
        protected virtual void Init(Spriter spriter)
        {
            foreach (SpriterEntity entity in spriter.Entities)
            {
                entity.Spriter = spriter;
                if (entity.ObjectInfos == null)
                {
                    entity.ObjectInfos = new SpriterObjectInfo[0];
                }
                foreach (SpriterAnimation animation in entity.Animations)
                {
                    animation.Entity = entity;

                    InitInfos(animation);
                    InitVarDefs(animation);
                }
            }
        }
Beispiel #21
0
        /// <summary>
        /// LoadContent wird einmal pro Spiel aufgerufen und ist der Platz, wo
        /// Ihr gesamter Content geladen wird.
        /// </summary>
        protected override void LoadContent()
        {
            // Erstellen Sie einen neuen SpriteBatch, der zum Zeichnen von Texturen verwendet werden kann.
            spriteBatch = new SpriteBatch(GraphicsDevice);


            loader1 = new SpriterLoader(this);
            //player1 = new SpriterPlayer(Spriter.getSpriter("monster/basic.scml", loader1), 0, loader1);
            Spriter spriter = new Spriter("monster/basic.scml", loader1);

            player1 = new SpriterPlayer(spriter.getSpriterData(), 0, loader1);
            player1.setAnimation("dash", 0, 0);
            player1.setFrameSpeed(20);

            this.drawer        = new SpriterDrawer(this.graphics);
            this.drawer.batch  = this.spriteBatch;
            this.drawer.loader = this.loader1;
        }
Beispiel #22
0
        private void RegisterTextures(MonogameSpriterAnimator animator, Spriter spriter, string spriterName)
        {
            foreach (SpriterFolder folder in spriter.Folders)
            {
                foreach (SpriterFile file in folder.Files)
                {
                    string path = FormatPath(folder, file, spriterName);

                    if (file.Type == SpriterFileType.Sound)
                    {
                        SoundEffect sound = LoadContent <SoundEffect>(path);
                        animator.Register(folder.Id, file.Id, sound);
                    }
                    else
                    {
                        Texture2D texture = LoadContent <Texture2D>(path);
                        if (texture != null)
                        {
                            animator.Register(folder.Id, file.Id, texture);
                        }
                    }
                }
            }
        }
Beispiel #23
0
 public void Preprocess(Spriter spriter)
 {
     Init(spriter);
 }
        private void RegisterTextures(MonogameSpriterAnimator animator, Spriter spriter, string spriterName)
        {
            foreach (SpriterFolder folder in spriter.Folders)
            {
                foreach (SpriterFile file in folder.Files)
                {
                    string path = FormatPath(folder, file, spriterName);
                    Texture2D texture = null;
                    try
                    {
                        texture = Content.Load<Texture2D>(path);
                    }
                    catch
                    {
                        Debug.WriteLine("Missing Texture: " + path);
                    }
                    if (texture == null) continue;

                    animator.Register(folder.Id, file.Id, texture);
                }
            }
        }
        public virtual void SetSprite(Spriter spriter, SpriterFolder folder, SpriterFile file, TSprite sprite)
        {
            IAssetProvider <TSprite> provider = SpriteProviders.GetOrCreate(spriter);

            provider.Set(folder.Id, file.Id, sprite);
        }
 private void GetUsedFiles(Spriter.Timeline timeline, HashSet<Spriter.File> files)
 {
     files.UnionWith(timeline.Keys.OfType<Spriter.SpriteTimelineKey>().Select(k => k.File));
 }
        public virtual void SetSound(Spriter spriter, SpriterFolder folder, SpriterFile file, TSound sound)
        {
            IAssetProvider <TSound> provider = SoundProviders.GetOrCreate(spriter);

            provider.Set(folder.Id, file.Id, sound);
        }
Beispiel #28
0
        private static void CreateCollisionRectangles(SpriterEntity entity, ChildData cd, Spriter spriter, GameObject parent)
        {
            if (entity.ObjectInfos == null)
            {
                return;
            }
            var boxes = entity.ObjectInfos.Where(o => o.ObjectType == SpriterObjectType.Box).ToList();

            if (boxes.Count == 0)
            {
                return;
            }

            GameObject boxRoot = new GameObject("Boxes");

            boxRoot.SetParent(parent);

            cd.BoxPivots          = new GameObject[boxes.Count];
            cd.Boxes              = new GameObject[boxes.Count];
            cd.BoxTransforms      = new Transform[boxes.Count];
            cd.BoxPivotTransforms = new Transform[boxes.Count];

            for (int i = 0; i < boxes.Count; ++i)
            {
                GameObject pivot = new GameObject("Pivot " + i);
                GameObject child = new GameObject("Box " + i);

                pivot.SetParent(boxRoot);
                child.SetParent(pivot);

                cd.BoxPivots[i]          = pivot;
                cd.Boxes[i]              = child;
                cd.BoxPivotTransforms[i] = pivot.transform;
                cd.BoxTransforms[i]      = child.transform;

                child.AddComponent <BoxCollider2D>();
            }
        }
 public IndexModel(IHostingEnvironment env)
 {
     _sprite = new Spriter(env.WebRootPath);
 }