【玩转cocos2d-x之十二】plist解析工具:Anti_TexturePacker

本文介绍了一款名为Anti_TexturePacker的工具,用于解决TexturePacker打包后图片素材名称未知的问题。该工具能解析plist文件,显示PNG预览,并支持鼠标悬停查看图片名称及复制到剪切板等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原创作品,转载请标明:http://blog.youkuaiyun.com/jackystudio/article/details/12867863


之前拿了一些别人的图片素材,是用TexturePacker打包合成的,结果写程序的时候不知道每个合成前小png图的名字是什么,只能一个一个从plist文件中找,然后猜测对应的名字,再进行显示,如果不对,还要继续猜。。。坑爹啊,效率大大降低了,时间都耗在找图片名字上了。后来决定动手写一个解析plist的软件,就叫它Anti_TexturePacker吧。


Anti_TexurePacker软件基于VS 2008 MFC Dialog。


1.PNG图的显示

这个还好,VS2008提供了GDI+,所以可以直接用它显示。关键是屏幕尺寸有限,如果打包后的PNG图很大的话,不能直接显示,又懒得做滚动条,所以直接采用缩放的方式了。缩放比例较大的话,可能会出现捕获点计算不精确,不过效果还是不错的,没有尺寸限制。

  1. CDC*pDC=GetDC();
  2. Graphicsgraphics(pDC->m_hDC);
  3. Imageimage(m_PNGFileName.GetString(),FALSE);
  4. graphics.DrawImage(&image,ORIGIN_DRAW_X,ORIGIN_DRAW_Y,(int)(m_RealWidth*m_ScaleRatio),(int)(m_RealHeight*m_ScaleRatio));
要注意PNG图的显示要放在OnPaint中执行,这样窗口进行重绘的时候才会保证PNG图的正常显示。


2.plist文件的读取

看一下plist的格式:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPEplistPUBLIC"-//AppleComputer//DTDPLIST1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  3. <plistversion="1.0">
  4. <dict>
  5. <key>frames</key>
  6. <dict>
  7. <key>background.png</key>//第一张,记录了图片名字
  8. <dict>
  9. <key>frame</key>
  10. <string>{{2,856},{480,852}}</string>//第一张,记录了图片的坐标和尺寸
  11. <key>offset</key>
  12. <string>{0,0}</string>
  13. <key>rotated</key>
  14. <false/> //第一张,旋转属性
  15. <key>sourceColorRect</key>
  16. <string>{{0,0},{480,852}}</string>
  17. <key>sourceSize</key>
  18. <string>{480,852}</string>
  19. </dict>
  20. <key>btn_finish.png</key>//第二张,记录了图片名字
  21. <dict>
  22. <key>frame</key>
  23. <string>{{2,1901},{140,48}}</string>//第二张,记录了图片的坐标和尺寸
  24. <key>offset</key>

这样一看,就知道了标准的plist文件中,我们需要的是第7,10,14,20,23,27...行。抓出规律,读取到CStringArray。

int i=1;
	int needName=7;
	int needConfig=10;
	int needrotate=14;
	if(!bFileExist)//如果文件存在且可读
	{
		return FALSE;
	}
	CString strline;
	FileContainer.RemoveAll();
	//将PlistFile文件数据读到FileContainer
	while(PlistFile.ReadString(strline))
	{
		if (i==needName)
		{
			FileContainer.Add(strline);
			needName+=13;
		}
		if (i==needConfig)
		{
			FileContainer.Add(strline);
			needConfig+=13;
		}
		if (i==needrotate)
		{
			FileContainer.Add(strline);
			needrotate+=13;
		}
		i++;
	}
	PlistFile.Close();

然后再解析出CCStringArray中的名字和对应的坐标,尺寸,是否旋转赋值到一个结构体(包含Name,Width,Height,OriginX,OriginY,isRotate)。创建一个CList来储存这些结构体。

	while(i<iFileLines)
	{
		strline = FileContainer.GetAt(i++);
		strline.TrimLeft();//删除左边的空格
		if (i%3==1)//第1行,储存名字
		{
			str=strline.Mid(5,strline.GetLength()-11);
			t_pngcfg.strName=str;
		}
		else if(i%3==2)//第2行,储存坐标和尺寸
		{
			CString strTemp;
			str=strline.Mid(10,strline.GetLength()-21);
			AfxExtractSubString(strTemp,str,0,',');
			t_pngcfg.originX=_ttoi(strTemp);
			AfxExtractSubString(strTemp,str,1,',');
			strTemp=strTemp.Left(strTemp.GetLength()-1);
			t_pngcfg.originY=_ttoi(strTemp);
			AfxExtractSubString(strTemp,str,2,',');
			strTemp=strTemp.Right(strTemp.GetLength()-1);
			t_pngcfg.width=_ttoi(strTemp);
			AfxExtractSubString(strTemp,str,3,',');
			t_pngcfg.height=_ttoi(strTemp);
		}
		else //第3行,存储旋转属性
		{
			str=strline.Mid(1,strline.GetLength()-3);
			if (str=="true")
			{
				t_pngcfg.isRotate=true;
			}
			else if (str=="false")
			{
				t_pngcfg.isRotate=false;
			}
			m_list.AddTail(t_pngcfg);
		}
	}

因为plist文件最后还有一个metadata字段,所以后面进行遍历的时候减掉这一个。


3.随鼠标移动的PNG图片名字的获取

在OnMouseMove中进行处理显示。

  1. CPointptInPNG;
  2. ptInPNG.x=(point.x-ORIGIN_DRAW_X)/m_ScaleRatio;
  3. ptInPNG.y=(point.y-ORIGIN_DRAW_Y)/m_ScaleRatio;
  4. intcount=m_plistFile.m_list.GetCount();
  5. for(inti=0;i<count-1;i++)
  6. {
  7. PNGCfgt_pngcfg=m_plistFile.m_list.GetAt(m_plistFile.m_list.FindIndex(i));
  8. if(isPtInRect(ptInPNG,t_pngcfg))
  9. {
  10. showStastus(t_pngcfg.strName);
  11. }
  12. }

4.单击PNG图拷贝名字到剪切板

在OnLButtonDown中进行处理拷贝。

  1. if(OpenClipboard())//首先打开一个剪切板,如果成功则返回非0值
  2. {
  3. HANDLEhClip;//声明一个句柄
  4. char*pBuf;
  5. EmptyClipboard();//置空这个剪切板,且得到剪切板的所有权
  6. hClip=GlobalAlloc(GMEM_MOVEABLE,t_pngcfg.strName.GetLength()+1);
  7. //申请锁定一块存放数据的内存区域
  8. pBuf=(char*)GlobalLock(hClip);//得到指向内存区域的第一个字节指针
  9. strcpy(pBuf,(char*)_bstr_t(t_pngcfg.strName.GetBuffer()));//将文本框的值拷贝到内存中
  10. GlobalUnlock(hClip);//解除内存锁定
  11. SetClipboardData(CF_TEXT,hClip);//设置数据到剪切板中
  12. CloseClipboard();//关闭剪切板
  13. }

5.效果图













6.下载地址


v.1.2版
更新说明:

1.增加PNG剪裁为小PNG功能

2.修正列表显示

下载地址:http://download.youkuaiyun.com/detail/jackyvincefu/6440769


v1.1版

更新说明:

1.修复旋转属性显示错误bug

2.修复png相对路径无法显示bug

3.增加双击列表显示红框功能

4.简化操作

5.修改icon

下载地址: http://download.youkuaiyun.com/detail/jackyvincefu/6429297
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值