/// <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; }