NGUI支持TexturePacker导出有旋转的Sprite,无需Transform旋转版本
来源:互联网 发布:2017网络玩什么最赚钱 编辑:程序博客网 时间:2024/06/02 20:28
在 ulua&tolua技术交流群①中群号 341746602,有位大神分析了一份让NGUI图集支持旋转sprite的技术帖子。
传送门:http://www.maosongliang.com/archives/324?bsh_bid=1506423853
近几天潜心研究了下,发现一个很蛋疼问题。第一点sprite渲染出来不是旋转好的,虽然大神写了自动旋转的代码,但是遇到旋转之后的Sprite当一个旋转节点的子节点的时候,出了各种问题。同时遇到Anchor自适应的时候也是各种搞。
于是想到一个解决方案,基于绘制区域的选择,而不是基于transform
贴上c#代码(利用ulua群中毛松亮大神的代码之处仍然保留其注释)
读取配置部分
UISpriteData.cs
// [Modify] by maosongliang, begin public bool rotated = false; // [Modify] by maosongliang, endNGUIJson.cs
static void LoadSpriteData (UIAtlas atlas, Hashtable decodedHash){if (decodedHash == null || atlas == null) return;List<UISpriteData> oldSprites = atlas.spriteList;atlas.spriteList = new List<UISpriteData>();Hashtable frames = (Hashtable)decodedHash["frames"];foreach (System.Collections.DictionaryEntry item in frames){UISpriteData newSprite = new UISpriteData();newSprite.name = item.Key.ToString();bool exists = false;// Check to see if this sprite existsforeach (UISpriteData oldSprite in oldSprites){if (oldSprite.name.Equals(newSprite.name, StringComparison.OrdinalIgnoreCase)){exists = true;break;}}// Get rid of the extension if the sprite doesn't exist// The extension is kept for backwards compatibility so it's still possible to update older atlases.if (!exists){newSprite.name = newSprite.name.Replace(".png", "");newSprite.name = newSprite.name.Replace(".tga", "");}// Extract the info we need from the TexturePacker json file, mainly uvRect and sizeHashtable table = (Hashtable)item.Value;Hashtable frame = (Hashtable)table["frame"];int frameX = int.Parse(frame["x"].ToString());int frameY = int.Parse(frame["y"].ToString());int frameW = int.Parse(frame["w"].ToString());int frameH = int.Parse(frame["h"].ToString()); // [Modify] by maosongliang, begin // Read the rotation value newSprite.rotated = (bool)table["rotated"]; // [Modify] by maosongliang, end newSprite.x = frameX;newSprite.y = frameY; newSprite.width = frameW; newSprite.height = frameH; // Support for trimmed sprites Hashtable sourceSize = (Hashtable)table["sourceSize"];Hashtable spriteSize = (Hashtable)table["spriteSourceSize"];if (spriteSize != null && sourceSize != null){// TODO: Account for rotated spritesif (frameW > 0){int spriteX = int.Parse(spriteSize["x"].ToString());int spriteW = int.Parse(spriteSize["w"].ToString());int sourceW = int.Parse(sourceSize["w"].ToString());newSprite.paddingLeft = spriteX;newSprite.paddingRight = sourceW - (spriteX + spriteW);}if (frameH > 0){int spriteY = int.Parse(spriteSize["y"].ToString());int spriteH = int.Parse(spriteSize["h"].ToString());int sourceH = int.Parse(sourceSize["h"].ToString());newSprite.paddingTop = spriteY;newSprite.paddingBottom = sourceH - (spriteY + spriteH);}} // [Modify] by maosongliang, begin if (newSprite.rotated) { int temp = newSprite.width; newSprite.width = newSprite.height; newSprite.height = temp; temp = newSprite.paddingLeft; newSprite.paddingLeft = newSprite.paddingTop; newSprite.paddingTop = temp; temp = newSprite.paddingRight; newSprite.paddingRight = newSprite.paddingBottom; newSprite.paddingBottom = temp; } // [Modify] by maosongliang, end // If the sprite was present before, see if we can copy its inner rect foreach (UISpriteData oldSprite in oldSprites){if (oldSprite.name.Equals(newSprite.name, StringComparison.OrdinalIgnoreCase)){newSprite.borderLeft = oldSprite.borderLeft;newSprite.borderRight = oldSprite.borderRight;newSprite.borderBottom = oldSprite.borderBottom;newSprite.borderTop = oldSprite.borderTop;}}// Add this new spriteatlas.spriteList.Add(newSprite);}// Sort imported sprites alphabeticallyatlas.spriteList.Sort(CompareSprites);Debug.Log("Imported " + atlas.spriteList.Count + " sprites");}
UIBasicSprite.cs
//modify by Amumu beginprivate Quaternion vertsAngle = Quaternion.Euler(0, 180, -90);protected bool rotated = false;//modify by Amumu endprotected void Fill (BetterList<Vector3> verts, BetterList<Vector2> uvs, BetterList<Color32> cols, Rect outer, Rect inner){mOuterUV = outer;mInnerUV = inner;switch (type){case Type.Simple:SimpleFill(verts, uvs, cols);break;case Type.Sliced:SlicedFill(verts, uvs, cols);break;case Type.Filled:FilledFill(verts, uvs, cols);break;case Type.Tiled:TiledFill(verts, uvs, cols);break;case Type.Advanced:AdvancedFill(verts, uvs, cols);break;}//modify by Amumu beginif (rotated) {Vector4 v = drawingDimensions;float centerX = v.x + v.z;float centerY = v.y + v.w;for (int i = 0; i < verts.size; i++) {Vector3 vert = vertsAngle * verts[i];vert.x += centerY;vert.y += centerX;verts[i] = vert;}}//modify by Amumu end}
UISprite.cs
public override Vector4 drawingDimensions{get{ .....//modify by Amumu begin if(rotated){ return new Vector4(vw, vx, vy, vz); } else{ return new Vector4(vx, vy, vz, vw); }//modify by Amumu end}}protected void SetAtlasSprite (UISpriteData sp){mChanged = true;mSpriteSet = true;if (sp != null){mSprite = sp;mSpriteName = mSprite.name;//modify by Amumu beginrotated = mSprite.rotated;//modify by Amumu end}else{mSpriteName = (mSprite != null) ? mSprite.name : "";mSprite = sp;}}public override void MakePixelPerfect (){if (!isValid) return;base.MakePixelPerfect();if (mType == Type.Tiled) return;UISpriteData sp = GetAtlasSprite();if (sp == null) return;Texture tex = mainTexture;if (tex == null) return;if (mType == Type.Simple || mType == Type.Filled || !sp.hasBorder){if (tex != null){int x = Mathf.RoundToInt(pixelSize * (sp.width + sp.paddingLeft + sp.paddingRight));int y = Mathf.RoundToInt(pixelSize * (sp.height + sp.paddingTop + sp.paddingBottom));if ((x & 1) == 1) ++x;if ((y & 1) == 1) ++y;//modify by Amumu beginif (mSprite != null && mSprite.rotated) {int tmp = x;x = y;y = tmp;}//modify by Amumu endwidth = x;height = y;}}}
0 0
- NGUI支持TexturePacker导出有旋转的Sprite,无需Transform旋转版本
- 视图的Transform旋转
- transform旋转
- 设置 transform 的旋转角度
- UIView 的Transform。(旋转,缩放,3D旋转)
- CSS3的transform属性实现旋转正方体
- 视图旋转 transform 属性 的用法
- CSS3 transform旋转属性
- Transform【缩放、平移、旋转】
- transform-origin CSS3 旋转
- ---Transform---放大缩小旋转
- css3 transform 旋转
- IOS:屏幕旋转与Transform
- CSS3 Transform div层旋转
- IOS:屏幕旋转与Transform
- IOS:屏幕旋转与Transform
- CSS3----转换(旋转)transform
- JQ--transform旋转焦点轮播图
- 作业的debug反思(求亚军)
- HTML第六章上机题3-------聚美优品美容热点列表
- Python+django开发(一)
- 李航《统计学习方法》第五章——用Python实现决策树(MNIST数据集)
- GDB简洁及常用指令
- NGUI支持TexturePacker导出有旋转的Sprite,无需Transform旋转版本
- ubuntu14.04下docker安装方法
- android悬浮窗口的实现
- 只需四个步骤几行代码,即可快速实现直播弹幕功能
- ajax轮询请求状态
- 内存泄漏分析三-Handler
- linux系统下的vsftpd
- html上传图片预览
- easyui 添加option 以及重新添加option