Ejemplo n.º 1
0
    /// <summary>
    /// Create a sprite from the atlas
    /// </summary>
    /// <param name="spriteAtlas"></param>
    /// <returns></returns>
    public bool Create(GTSpriteAtlasCocos2D spriteAtlas, GTTreeNode tnSprite)
    {
        if (null == spriteAtlas || spriteAtlas.frameCount == 0)
            return false;

        GTTreeNode tnAnimation = tnSprite.GetChild(GTPropertyFile.TagAnimation);
        GTTreeNode tnAnchor = tnSprite.GetChild(GTPropertyFile.TagAnchor);
        Vector2 pivot = GTSpriteFrameSet.PivotCenter;
        if (tnAnchor != null)
            pivot = tnAnchor.AsVector2();

        if (tnAnimation != null && tnAnimation.childCount != 0)
        {
            mFrameSet = new GTSpriteFrameSet[tnAnimation.childCount];
            // Create each frameset
            for (int childIndex = 0; childIndex < tnAnimation.childCount; childIndex++)
            {
                GTTreeNode tnFramdset = tnAnimation.GetChild(childIndex);
                if (tnFramdset != null)
                {
                    GTTreeNode tnFPS = tnFramdset.GetChild(GTPropertyFile.TagFPS);
                    GTTreeNode tnStartFrame = tnFramdset.GetChild(GTPropertyFile.TagStartFrame);
                    GTTreeNode tnFrameCount = tnFramdset.GetChild(GTPropertyFile.TagFrameCount);
                    if (tnStartFrame == null)
                        Debug.LogError("Couldn't find StartFrame in GTTreeNode !");
                    if (tnFrameCount == null)
                        Debug.LogError("Couldn't find FrameCount in GTTreeNode !");
                    if (tnStartFrame != null && tnFrameCount != null)
                    {
                        mFrameSet[childIndex] = new GTSpriteFrameSet();
                        mFrameSet[childIndex].name = tnFramdset.AsString();
                        mFrameSet[childIndex].Create(
                            spriteAtlas,
                            tnStartFrame.AsInt(),
                            tnFrameCount.AsInt(),
                            pivot
                            );
                        if (tnFPS != null)
                        {
                            mFrameSet[childIndex].FPS = tnFPS.AsFloat();
                        }
                    }

                    if(!mFrameSetNameDic.ContainsKey(tnFramdset.AsString()))
                        mFrameSetNameDic.Add(tnFramdset.AsString(), (uint)childIndex);
                }
            }
        }

        return true;
    }
    /// <summary>
    /// Parse contents from metadata
    /// </summary>
    /// <param name="nodeMetadata"></param>
    /// <returns></returns>
    static private bool ParseMetaData(XmlNode nodeMetadata, ref GTSpriteAtlasCocos2D spriteAtlas)
    {
        if (null == nodeMetadata)
            return false;

        XmlNodeList nodeList = nodeMetadata.NextSibling.SelectNodes("key");
        foreach (XmlNode n in nodeList)
        {
            switch (n.InnerText)
            {
                case "format":
                    spriteAtlas.mMetadata.format = int.Parse(n.NextSibling.InnerText);
                    break;

                case "realTextureFileName":
                    spriteAtlas.mMetadata.realTextureFileName = n.NextSibling.InnerText;
                    break;

                case "size":
                    spriteAtlas.mMetadata.size = GTSpriteAtlasCocos2D.StringToVector2(n.NextSibling.InnerText);
                    break;

                case "textureFileName":
                    spriteAtlas.mMetadata.textureFileName = n.NextSibling.InnerText;
                    break;
            }
        }

        return true;
    }
    /// <summary>
    /// Parse atlas content
    /// </summary>
    /// <param name="content"></param>
    /// <returns></returns>
    static private GTSpriteAtlasCocos2D Parse(string content)
    {
        // Parse XML content
        XmlDocument xd = new XmlDocument();
        xd.LoadXml(content);

        GTSpriteAtlasCocos2D spriteAtlas = new GTSpriteAtlasCocos2D();

        XmlNodeList xnl = xd.SelectNodes("plist/dict/key");
        // Parse metadata
        GTSpriteAtlasCocos2D.ParseMetaData(GetNodeByKey(xnl, "metadata"), ref spriteAtlas);
        // Parse frames
        GTSpriteAtlasCocos2D.ParseFramesData(GetNodeByKey(xnl, "frames"), ref spriteAtlas);

        xd = null;

        return spriteAtlas;
    }
    /// <summary>
    /// Parse frames
    /// </summary>
    /// <param name="nodeFrames"></param>
    /// <returns></returns>
    static private bool ParseFramesData(XmlNode nodeFrames, ref GTSpriteAtlasCocos2D spriteAtlas)
    {
        if (null == nodeFrames)
            return false;

        // Query all frames
        XmlNodeList nodeList = nodeFrames.NextSibling.SelectNodes("key");
        if (nodeList.Count == 0)
            return false;

        spriteAtlas.mFrames = new GTSpriteAtlasCocos2DFrame[nodeList.Count];
        if (null == spriteAtlas.mFrames)
            return false;

        // Parse each frame node
        for (int index = 0; index < nodeList.Count; index++)
        {
            XmlNode n = nodeList[index];
            GTSpriteAtlasCocos2DFrame newFrame = new GTSpriteAtlasCocos2DFrame();
            // Parse metadata
            newFrame.Parse(n.NextSibling, ref spriteAtlas.mMetadata);
            // Remove ".png" from frame name
            int lastIndex = n.InnerText.LastIndexOf('.');
            string frameName = (lastIndex >= 0) ? n.InnerText.Substring(0, lastIndex) : n.InnerText;
            newFrame.name = frameName;
            // Add the frame into the array
            spriteAtlas.mFrames[index] = newFrame;
        }

        return true;
    }