/** Adds an animation from an NSDictionary * Make sure that the frames were previously loaded in the CCSpriteFrameCache. * @since v1.1 */ public void addAnimationsWithDictionary(NSDictionary dictionary) { NSDictionary animations = dictionary.objectForKey <NSDictionary>("animations"); if (animations == null) { CCDebug.Log("cocos2d: CCAnimationCache: No animations were found in provided dictionary."); return; } int version = 1; NSDictionary properties = dictionary.objectForKey <NSDictionary>("properties"); if (properties != null) { version = properties.objectForKey <int>("format"); } NSArray spritesheets = properties.objectForKey <NSArray>("spritesheets"); var enumerator = spritesheets.GetEnumerator(); while (enumerator.MoveNext()) { string name = (string)enumerator.Current; CCSpriteFrameCache.sharedSpriteFrameCache.addSpriteFramesWithFile(name); } switch (version) { case 1: parseVersion1(animations); break; case 2: parseVersion2(animations); break; default: NSUtils.Assert(false, "Invalid animation format"); break; } }
public void removeSpriteFramesFromDictionary(NSDictionary dictionary) { NSDictionary framesDict = dictionary.objectForKey <NSDictionary>("frames"); // List<string> keysToRemove = new List<string> (); var enumerator = framesDict.GetEnumerator(); while (enumerator.MoveNext()) { KeyValuePair <object, object> kv = enumerator.Current; string frameDictKey = (string)kv.Key; _spriteFrames.Remove(frameDictKey); } }
/* * renamed plist file of texture packer to .plist.txt */ static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { bool hasNewAsset = false; foreach (var asset in importedAssets) { string assetExt = Path.GetExtension(asset); if (assetExt == ".plist") { NSDictionary plist = NSDictionary.DictionaryWithContentsOfFileFromResources(asset); NSDictionary metadataDict = plist.objectForKey <NSDictionary>("metadata"); if (metadataDict != null) { string textureFileName = metadataDict.objectForKey <string>("textureFileName"); string texturePath = asset.Replace(Path.GetFileName(asset), "") + textureFileName; if (File.Exists(texturePath)) { byte[] fileData = File.ReadAllBytes(texturePath); Texture2D texture = new Texture2D(2, 2); texture.LoadImage(fileData); CheckSemiTransparentSprite(plist, texture); //update *.plist.txt string txtPath = asset.Replace(".plist", ".txt"); // if (File.Exists (txtPath)) plist.writeToFile(txtPath); File.Delete(asset); // File.Move (asset, txtPath); hasNewAsset = true; } } } } if (hasNewAsset) { AssetDatabase.Refresh(); } }
void parseVersion2(NSDictionary animations) { CCSpriteFrameCache frameCache = CCSpriteFrameCache.sharedSpriteFrameCache; var enumerator = animations.GetEnumerator(); while (enumerator.MoveNext()) { KeyValuePair <object, object> kv = enumerator.Current; string name = (string)kv.Key; NSDictionary animationDict = (NSDictionary)kv.Value; int loops = 0; object loopsObj = loops; if (!animationDict.TryGetValue("loops", out loopsObj)) { loops = 1; } else { loops = (int)loopsObj; } bool restoreOriginalFrame = (bool)animationDict["restoreOriginalFrame"]; NSArray frameArray = (NSArray)animationDict["frames"]; if (frameArray == null) { CCDebug.Log(@"cocos2d: CCAnimationCache: Animation '%@' found in dictionary without any frames - cannot add to animation cache.", name); continue; } // Array of AnimationFrames List <CCAnimationFrame> array = new List <CCAnimationFrame>(frameArray.Count); var frameArrayEnumerator = frameArray.GetEnumerator(); while (frameArrayEnumerator.MoveNext()) { NSDictionary entry = (NSDictionary)frameArrayEnumerator.Current; string spriteFrameName = (string)entry["spriteframe"]; CCSpriteFrame spriteFrame = frameCache.spriteFrameByName(spriteFrameName); if (spriteFrame == null) { CCDebug.Log("cocos2d: CCAnimationCache: Animation '{0}' refers to frame '{1}' which is not currently in the CCSpriteFrameCache. This frame will not be added to the animation.", name, spriteFrameName); continue; } float delayUnits = float.Parse(entry["delayUnits"].ToString()); NSDictionary userInfo = entry.objectForKey <NSDictionary>("notification"); CCAnimationFrame animFrame = new CCAnimationFrame(spriteFrame, delayUnits, userInfo); array.Add(animFrame); } float delayPerUnit = (float)animationDict["delayPerUnit"]; CCAnimation animation = new CCAnimation(array, delayPerUnit, (uint)loops); animation.restoreOriginalFrame = restoreOriginalFrame; CCAnimationCache.sharedAnimationCache.addAnimation(animation, name); } }
void addSpriteFrames(NSDictionary dictionary, Texture2D texture, string textureFileName) { NSDictionary metadataDict = dictionary.objectForKey <NSDictionary>("metadata"); NSDictionary framesDict = dictionary.objectForKey <NSDictionary>("frames"); // get the format int format = 0; if (metadataDict != null) { format = metadataDict.objectForKey <int> ("format"); } // get texture size Vector2 textureSize = new Vector2(texture.width, texture.height); // check the format NSUtils.Assert(format >= 0 && format <= 3, @"cocos2d: WARNING: format is not supported for CCSpriteFrameCache addSpriteFramesWithDictionary:texture:"); // SpriteFrame info Rect rect = new Rect(); bool textureRotated = false; Vector2 spriteOffset = Vector2.zero; Vector2 originalSize = Vector2.zero; bool semi = false; var enumerator = framesDict.GetEnumerator(); while (enumerator.MoveNext()) { KeyValuePair <object, object> frameDictKeyValue = enumerator.Current; string frameDictKey = (string)frameDictKeyValue.Key; NSDictionary frameDict = (NSDictionary)frameDictKeyValue.Value; if (format == 0) { float x = frameDict.objectForKey <float>("x"); float y = frameDict.objectForKey <float>("y"); float w = frameDict.objectForKey <float>("width"); float h = frameDict.objectForKey <float>("height"); float ox = frameDict.objectForKey <float>("offsetX"); float oy = frameDict.objectForKey <float>("offsetY"); int ow = frameDict.objectForKey <int>("originalWidth"); int oh = frameDict.objectForKey <int>("originalHeight"); // check ow/oh if (ow == 0 || oh == 0) { CCDebug.Warning("cocos2d: WARNING: originalWidth/Height not found on the CCSpriteFrame. AnchorPoint won't work as expected. Regenerate the .plist"); } // abs ow/oh ow = Math.Abs(ow); oh = Math.Abs(oh); // set frame info rect = new Rect(x, y, w, h); textureRotated = false; spriteOffset = new Vector2(ox, oy); originalSize = new Vector2(ow, oh); semi = frameDict.objectForKey <bool>("semi"); } else if (format == 1 || format == 2) { Rect frame = ccUtils.RectFromString(frameDict.objectForKey <string>("frame")); bool rotated = false; // rotation if (format == 2) { rotated = frameDict.objectForKey <bool>("rotated"); } Vector2 offset = ccUtils.PointFromString(frameDict.objectForKey <string>("offset")); Vector2 sourceSize = ccUtils.PointFromString(frameDict.objectForKey <string>("sourceSize")); // set frame info rect = frame; textureRotated = rotated; spriteOffset = offset; originalSize = sourceSize; semi = frameDict.objectForKey <bool>("semi"); } else if (format == 3) { // get values Vector2 spriteSize = ccUtils.PointFromString(frameDict.objectForKey <string>("spriteSize")); Vector2 spriteOffset_ = ccUtils.PointFromString(frameDict.objectForKey <string>("spriteOffset")); Vector2 spriteSourceSize = ccUtils.PointFromString(frameDict.objectForKey <string>("spriteSourceSize")); Rect textureRect = ccUtils.RectFromString(frameDict.objectForKey <string>("textureRect")); bool textureRotated_ = frameDict.objectForKey <bool>("textureRotated"); // get aliases NSArray aliases = frameDict.objectForKey <NSArray>("aliases"); var aliasesEnumerator = aliases.GetEnumerator(); while (aliasesEnumerator.MoveNext()) { string alias = (string)aliasesEnumerator.Current; if (_spriteFramesAliases.ContainsKey(alias)) { CCDebug.Warning("cocos2d: WARNING: an alias with name {0} already exists", alias); } _spriteFramesAliases[alias] = frameDictKey; } // set frame info rect = new Rect(textureRect.position.x, textureRect.position.y, spriteSize.x, spriteSize.y); textureRotated = textureRotated_; spriteOffset = spriteOffset_; originalSize = spriteSourceSize; semi = frameDict.objectForKey <bool>("semi"); } if (textureRotated) { rect.size = new Vector2(rect.size.y, rect.size.x); } rect.y = textureSize.y - rect.y - rect.height; // add sprite frame CCSpriteFrame spriteFrame = new CCSpriteFrame(texture, rect, textureRotated, spriteOffset, originalSize, semi); spriteFrame.frameFileName = frameDictKey; spriteFrame.textureFilename = textureFileName; _spriteFrames [frameDictKey] = spriteFrame; } }
static void CheckSemiTransparentSprite(NSDictionary dictionary, Texture2D texture) { NSDictionary metadataDict = dictionary.objectForKey <NSDictionary>("metadata"); NSDictionary framesDict = dictionary.objectForKey <NSDictionary>("frames"); // get the format int format = 0; if (metadataDict != null) { format = metadataDict.objectForKey <int> ("format"); } // get texture size Vector2 textureSize = new Vector2(texture.width, texture.height); // check the format NSUtils.Assert(format >= 0 && format <= 3, @"cocos2d: WARNING: format is not supported for CCSpriteFrameCache addSpriteFramesWithDictionary:texture:"); // SpriteFrame info Rect rect = new Rect(); bool textureRotated = false; // add real frames var enumerator = framesDict.GetEnumerator(); while (enumerator.MoveNext()) { KeyValuePair <object, object> frameDictKeyValue = enumerator.Current; NSDictionary frameDict = (NSDictionary)frameDictKeyValue.Value; if (format == 0) { float x = frameDict.objectForKey <float>("x"); float y = frameDict.objectForKey <float>("y"); float w = frameDict.objectForKey <float>("width"); float h = frameDict.objectForKey <float>("height"); int ow = frameDict.objectForKey <int>("originalWidth"); int oh = frameDict.objectForKey <int>("originalHeight"); // check ow/oh if (ow == 0 || oh == 0) { CCDebug.Warning("cocos2d: WARNING: originalWidth/Height not found on the CCSpriteFrame. AnchorPoint won't work as expected. Regenerate the .plist"); } // abs ow/oh ow = Math.Abs(ow); oh = Math.Abs(oh); // set frame info rect = new Rect(x, y, w, h); textureRotated = false; } else if (format == 1 || format == 2) { Rect frame = ccUtils.RectFromString(frameDict.objectForKey <string>("frame")); bool rotated = false; // rotation if (format == 2) { rotated = frameDict.objectForKey <bool>("rotated"); } // set frame info rect = frame; textureRotated = rotated; } else if (format == 3) { // get values Vector2 spriteSize = ccUtils.PointFromString(frameDict.objectForKey <string>("spriteSize")); Rect textureRect = ccUtils.RectFromString(frameDict.objectForKey <string>("textureRect")); bool textureRotated_ = frameDict.objectForKey <bool>("textureRotated"); // set frame info rect = new Rect(textureRect.position.x, textureRect.position.y, spriteSize.x, spriteSize.y); textureRotated = textureRotated_; } if (textureRotated) { rect.size = new Vector2(rect.size.y, rect.size.x); } rect.y = textureSize.y - rect.y - rect.height; // add sprite frame int rectX = Mathf.RoundToInt(rect.xMin); int rectY = Mathf.RoundToInt(rect.yMin); int rectW = Mathf.RoundToInt(rect.width); int rectH = Mathf.RoundToInt(rect.height); bool isSemi = false; for (int x = 0; x < rectW; x++) { for (int y = 0; y < rectH; y++) { Color color = texture.GetPixel(rectX + x, rectY + y); if (FloatUtils.Big(color.a, 0) && FloatUtils.Small(color.a, 1)) { isSemi = true; break; } } if (isSemi) { break; } } frameDict.Add("semi", isSemi); } }
static void ParseImagePlist(int firstGid, int tileWidth, int tileHeight, string filename, Dictionary <int, string> gidToFiles, NSDictionary tilesetCaches) { string path = filename + ".txt"; NSDictionary plist = null; if (tilesetCaches != null) { plist = tilesetCaches.objectForKey <NSDictionary>(path); } if (plist == null) { plist = NSDictionary.DictionaryWithContentsOfFileFromResources(filename + ".txt"); } NSDictionary metaDataDict = plist.objectForKey <NSDictionary>("metadata"); NSDictionary framesDict = plist.objectForKey <NSDictionary>("frames"); int format = 0; if (metaDataDict != null) { format = metaDataDict.objectForKey <int> ("format"); } int width = 0; if (metaDataDict != null) { Vector2 size = ccUtils.PointFromString((string)metaDataDict ["size"]); width = Mathf.RoundToInt(size.x); } else { NSDictionary texture = metaDataDict.objectForKey <NSDictionary>("texture"); width = texture.objectForKey <int>("width"); } var enumerator = framesDict.GetEnumerator(); while (enumerator.MoveNext()) { KeyValuePair <object, object> frameDictKeyValue = enumerator.Current; string frameDictKey = (string)frameDictKeyValue.Key; NSDictionary frameDict = (NSDictionary)frameDictKeyValue.Value; int x = 0, y = 0, w = 0, h = 0; if (format == 0) { float ox = frameDict.objectForKey <float>("x"); float oy = frameDict.objectForKey <float>("y"); float ow = frameDict.objectForKey <float>("width"); float oh = frameDict.objectForKey <float>("height"); x = Mathf.RoundToInt(ox); y = Mathf.RoundToInt(oy); w = Mathf.RoundToInt(ow); h = Mathf.RoundToInt(oh); } else if (format == 1 || format == 2) { Rect frame = ccUtils.RectFromString(frameDict.objectForKey <string>("frame")); x = Mathf.RoundToInt(frame.x); y = Mathf.RoundToInt(frame.y); w = Mathf.RoundToInt(frame.width); h = Mathf.RoundToInt(frame.height); } else if (format == 3) { Rect frame = ccUtils.RectFromString(frameDict.objectForKey <string>("textureRect")); x = Mathf.RoundToInt(frame.x); y = Mathf.RoundToInt(frame.y); w = Mathf.RoundToInt(frame.width); h = Mathf.RoundToInt(frame.height); } else { NSUtils.Assert(false, "cocos2d:CCTMXMap: Uknown TexturePack format."); } NSUtils.Assert(w == tileWidth && h == tileHeight, "cocos2d:CCTMXMap: Frame size of tileset file must be same with tmx tilesize."); int col = Mathf.RoundToInt(x / tileWidth); int row = Mathf.RoundToInt(y / tileHeight); int cols = Mathf.RoundToInt(width / tileWidth); int gid = firstGid + col + row * cols; gidToFiles[gid] = frameDictKey; } }