[cocos2dx笔记012]一定简易的UI配置类
使用cocostudio能够装载编辑好的UI,可是过于复杂。特别是在加截UI后,发现触屏事件有些问题。
假设直接使用程序写死载入UI又过于麻烦。花点时间,添加了一个基于ini的UI配置类,眼下仅仅实现了CCSprite和plist的载入。其他的能够后面慢慢加
头文件
#define _X_UI_H_
#include <cocos2d.h>
namespace zdh
{
USING_NS_CC;
void CreateByXUI(CCNode * paramParent, const char * paramFileName);
}
#endif
源文件
#include "xini.h"
#include "xlog.h"
namespace zdh
{
namespace xui
{
//--------------------------------------------------------------------------------------
int GetIntValue(XIniText::TSection * paramSection, const char * paramKeyName)
{
auto pV = paramSection->getEntry(paramKeyName);
if (isNULL(pV)) return 0;
else return pV->getValue().getField().ToIntDef(0);
}
//--------------------------------------------------------------------------------------
int GetDoubleValue(XIniText::TSection * paramSection, const char * paramKeyName)
{
auto pV = paramSection->getEntry(paramKeyName);
if (isNULL(pV)) return 0;
else return pV->getValue().getField().ToIntDef(0);
}
//--------------------------------------------------------------------------------------
const XAnsiString & GetStringValue(XIniText::TSection * paramSection, const char * paramKeyName)
{
static const XAnsiString strEmpty;
auto pV = paramSection->getEntry(paramKeyName);
if (isNULL(pV)) return strEmpty;
else return pV->getValue().getField();
}
};
//--------------------------------------------------------------------------------------
void CreateSpriteByXUI(CCNode * paramParent, XIniText::TSection * paramSpriteSection)
{
XInt ix = xui::GetIntValue(paramSpriteSection, "x");
XInt iy = xui::GetIntValue(paramSpriteSection, "y");
XInt izOrder = xui::GetIntValue(paramSpriteSection, "zOrder");
const XAnsiString & pImageName = xui::GetStringValue(paramSpriteSection, "image");
XInt iTag = xui::GetIntValue(paramSpriteSection, "tag");
CCSprite * pSprite = NULL;
if (pImageName[0] == ':') //假设是从Cache中读取
{
pSprite = CCSprite::createWithSpriteFrameName(pImageName.c_str()+1);
}
else
{
pSprite = CCSprite::create(pImageName.c_str());
}
pSprite->setPosition(ix, iy);
pSprite->setAnchorPoint(0, 0);
pSprite->setTag(iTag);
pSprite->setZOrder(izOrder);
paramParent->addChild(pSprite, izOrder);
}
void LoadSpriteFrameByPList(CCNode * /*paramParent*/, XIniText::TSection * paramSection)
{
const XAnsiString & pPListName = xui::GetStringValue(paramSection, "filename");
CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile(pPListName.c_str());
}
//--------------------------------------------------------------------------------------
void CreateByXUI(CCNode * paramParent, const char * paramFileName)
{
std::string strFullFileName = CCFileUtils::sharedFileUtils()->fullPathForFilename(paramFileName);
unsigned long dwGetSize = 0;
const unsigned char * pData = CCFileUtils::sharedFileUtils()->getFileData(strFullFileName.c_str(), "rb", &dwGetSize);
ZDH_INFO("Load XUI:%s size=%u", paramFileName, dwGetSize);
if (dwGetSize == 0)
{
if (isNotNULL(pData)) delete[] pData;
return;
}
std::string strData((const char *)pData, dwGetSize);
std::stringstream ss(strData);
XIniText stIni;
if (!stIni.Load(ss))
{
ZDH_INFO("Load XUI Fail, %s", paramFileName);
return;
}
for (int s = 0; s < stIni.getSectionCount(); s++)
{
auto pSection = stIni.getSection(s);
auto pType = pSection->getEntry("type");
if (isNULL(pType))
{
ZDH_INFO("Section=[%s] not exist key:\"type\"", pSection->getSectionName().c_str());
continue;
}
const XAnsiString & paramTypeValue = pType->getValue().getField();
if (paramTypeValue == "CCSprite")
{
CreateSpriteByXUI(paramParent, pSection);
}
else if (paramTypeValue == "plist")
{
LoadSpriteFrameByPList(paramParent, pSection);
}
}
}
}
配置文件
[gk_label.png]
type = CCSprite
image = gk_label.png
tag = 1
x = 18
y = 914
zOrder = 1
[mb_label.png]
type = CCSprite
image = :mb_label.png ·#冒号开头表示从CCSpriteFrameCache载入图片
tag = 1
x = 348
y = 916
zOrder = 1
[score_label.png]
type = CCSprite
image = score_label.png
tag = 1
x = 258
y = 855
zOrder = 1
[game_star.plist]
#批量装载
type = plist
filename = game_star.plist
相关用到的TTextIni和XAnsiString,參考我的开源码
[cocos2dx笔记012]一定简易的UI配置类的更多相关文章
- [cocos2dx笔记008]cocos2d 用luabridge手动绑定类
基于cocos2dx 2.2.2版本号.这几天使用了cocostudio实现了,动画.骨骼动画.UI编辑.粒子效果,尽管有些不足,但已经算是很好了.今天尝试用lua.这个很easy.创建的时候.设置语 ...
- [cocos2dx笔记004] android添加�静态库project
(基于2.2.2版本号) 这步比較麻烦,不像vs2013那样好设置.參考了非常多文章.还是不能解决这个问题.仅仅有慢慢摸索了.在这里贴出来,希望能让大家能少走点弯路. 还是其于前面的文章提到的myli ...
- firefox 扩展开发笔记(三):高级ui交互编程
firefox 扩展开发笔记(三):高级ui交互编程 前言 前两篇链接 1:firefox 扩展开发笔记(一):jpm 使用实践以及调试 2:firefox 扩展开发笔记(二):进阶开发之移动设备模拟 ...
- Linux协议栈代码阅读笔记(二)网络接口的配置
Linux协议栈代码阅读笔记(二)网络接口的配置 (基于linux-2.6.11) (一)用户态通过C库函数ioctl进行网络接口的配置 例如,知名的ifconfig程序,就是通过C库函数sys_io ...
- Git 笔记二-Git安装与初始配置
git 笔记二-Git安装与初始配置 Git的安装 由于我日常生活和工作基本上都是在Windows上,因此此处只说windows上的安装.Windows上的安装和其他程序一样,只需要到http://g ...
- Java程序猿JavaScript学习笔记(14——扩大jQuery UI)
计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...
- 《软件测试自动化之道》读书笔记 之 基于反射的UI测试
<软件测试自动化之道>读书笔记 之 基于反射的UI测试 2014-09-24 测试自动化程序的任务待测程序测试程序 启动待测程序 设置窗体的属性 获取窗体的属性 设置控件的属性 ...
- 《软件测试自动化之道》读书笔记 之 基于Windows的UI测试
<软件测试自动化之道>读书笔记 之 基于Windows的UI测试 2014-09-25 测试自动化程序的任务待测程序测试程序 启动待测程序 获得待测程序主窗体的句柄 获得有名字控件的 ...
- 《软件测试自动化之道》读书笔记 之 底层的Web UI 测试
<软件测试自动化之道>读书笔记 之 底层的Web UI 测试 2014-09-28 测试自动化程序的任务待测程序测试程序 启动IE并连接到这个实例 如何判断待测web程序完全加载到浏览 ...
随机推荐
- 实现Brush对象的五种图形
本实例将使用Graphics类绘制五种图形来分别演示SolidBrush.HatchBrush.TextureBrush.LinearGradientBrush.PathGradientBrush这五 ...
- STL之map篇
度熊所居住的 D 国,是一个完全尊重人权的国度.以至于这个国家的所有人命名自己的名字都非常奇怪.一个人的名字由若干个字符组成,同样的,这些字符的全排列的结果中的每一个字符串,也都是这个人的名字.例如, ...
- 【PostgreSQL-9.6.3】函数(1)--数值型函数
函数表示对输入参数返回一个特殊计算结果的值.PostgreSQL中的函数种类比较丰富,主要分为以下几类:数值型函数.字符型函数.日期和时间函数.条件判断函数.系统函数.加密函数以及其他函数.这篇文章只 ...
- 【Linux】VMware安装VMware Tools工具
VMware Tools是VMware虚拟机中自带的一种增强工具,相当于VirtualBox中的增强功能(Sun VirtualBox Guest Additions),是VMware提供的增强虚拟显 ...
- Ubuntu安装中文语言包
使用Ubuntu 默认的界面感觉不习惯,于是安装KDE界面. 1.安装kde 使用命令行: sudo apt-get install kubuntu-desktop 安装后发现不能使用中文, 在 se ...
- 用cmd查看win8版本 激活等详细信息命令
Win+x===>选择以管理员身份运行,输入: slmgr /dlv 显示:最为详尽的激活信息,包括:激活ID.安装ID.激活截止日期slmgr /dli 显示:操作系统版本.部分产品密钥. ...
- alert弹出框 弹出窗口 ----sweetAlert
推荐一款好用的alert,下面地址是demo,很直观的看到效果,wap可以使用 http://www.dglives.com/demo/sweetalert-master/example/ < ...
- 范畴论-一个单子(Monad)说白了不过就是自函子范畴上的一个幺半群而已
范畴即为结构:包含要素和转化. 范畴为高阶类型. 函子为高阶函数.函子的输入为态射.函子为建立在态射基础上的高阶函数.函子用于保持范畴间映射的结构.态射用于范畴内部的转换. 群为运算规则的约束. 自函 ...
- UNIX SOCKET编程简介
1 . Layered Model of Networking Socket 编程的层次模型如下图所示, 最上面是应用层,应用层下面的是 SOCKET API 层,再下面是传输层和网络层 ...
- Day4 循环结构
for-in循环 如果明确的知道循环执行的次数或者是要对一个容器进行迭代(后面会讲到),那么我们推荐使用for-in循环,例如下面代码中计算$\sum_{n=1}^{100}n$. range函数用法 ...