[cocos2dx笔记012]一定简易的UI配置类

使用cocostudio可以装载编辑好的UI,但是过于复杂。特别是在加截UI后,发现触屏事件有些问题。如果直接使用程序写死加载UI又过于麻烦。花点时间,增加了一个基于ini的UI配置类,目前只实现了CCSprite和plist的加载。其它的可以后面慢慢加

头文件

#ifndef _X_UI_H_

#define _X_UI_H_

#include <cocos2d.h>

namespace zdh

{

USING_NS_CC;

void CreateByXUI(CCNode * paramParent, const char * paramFileName);

}

#endif

源文件

#include "xui.h"

#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);

}

}

}

}

配置文件

#支持UTF-8格式

[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配置类

时间: 2024-11-08 14:26:12

[cocos2dx笔记012]一定简易的UI配置类的相关文章

[cocos2dx笔记008]cocos2d 用luabridge手动绑定类

基于cocos2dx 2.2.2版本.这几天使用了cocostudio实现了,动画,骨骼动画,UI编辑,粒子效果,虽然有些不足,但已经算是非常好了.今天尝试用lua,这个非常简单,创建的时候,设置语言为lua,那就可以创建lua工程. 在cocos2d-x-2.2.2\tools\project-creator下运行: python create_project.py -project test_lua -package com.android.zdhsoft -language lua xco

[cocos2dx笔记010]用于UI的事件管理器

cocos2dx有一个编辑器:cocostudio,目前来说,已经是比较好用了,只要加载导出的资源,就可以用上了.省去手动搭建面的麻烦.但是,很多需要事件的地方,操作比较麻烦,所以这里提供一个事件管理器来集中和简化管理事件.对于C++事件委托方面,我这里使用了是FastDelegate(注:一个牛人写的).下面是具体实现的代理,不多. /* UI触摸事件管理器. 原有cocos2dx带的触摸事件,每次监听要操作的步骤比较多,为此增加了一个事件管理器,来集中和简化管理 */ #ifndef _X_

cocos2d-x笔记3 : 3.0正式版调用CocoStudio

cocos2d已经有一万个新建工程的方式和一万个API改动了,而且相互不兼容...触控科技的程序员真心不怕被打哦... 网上搜到的做法大多已经不行了,原因在上一段哦... 同样都是3.0,Alpha版.Bata版.Rc版.正式版,它们调用CocoStudio的方法都不一样哦...(求超越哦...) 记录一下3.0正式版使用CocoStudio的方法,是正式版,也就是最新版哦.(当然,只相对本周而言哦...) 一.添加库: 1.右击解决方案 -> 添加 -> 现有项目 2.进入项目目录的coco

[cocos2dx笔记004] android增加静态库工程

(基于2.2.2版本) 这步比较麻烦,不像vs2013那样好设置.参考了很多文章.还是不能解决问题.只有慢慢摸索了.在这里贴出来,希望能让大家能少走点弯路. 还是其于前面的文章提到的mylib这个例子.[cocos2dx笔记003] Vs2013增加静态库工程首先进到external\mylib,用文本编辑器打Android.mk 并修改图中圈中的部分 修改结果如下 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE :

[cocos2dx笔记004] android添加?静态库project

(基于2.2.2版本号) 这步比較麻烦,不像vs2013那样好设置.參考了非常多文章.还是不能解决这个问题.仅仅有慢慢摸索了.在这里贴出来,希望能让大家能少走点弯路. 还是其于前面的文章提到的mylib这个样例.[cocos2dx笔记003] Vs2013添加?静态库project首先进到external\mylib,用文本编辑器打Android.mk 并改动图中圈中的部分 改动结果例如以下 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) L

xshell远程终端操作Ubuntu server安装LAMP环境之最详细笔记之二PHP开发环境配置

前言: 昨天学会了安装server,今天试着通过远程终端xshell来安装LAMP,搭配一下开发环境,也有集成环境可以一键安装使用,还是瞎折腾一下,手动一步一步搭建一下这个开发环境. 接上一篇:ubuntu server 14.04 LTS下搭建LAMP环境之最详细笔记之一U盘安装双系统本文原创博客地址:http://www.cnblogs.com/unofficial官网地址:www.pushself.com) 准备: 在windows系统上首先需要安装xhsell,具体下载地址可以搜一下,安

cocos2d-x笔记4: TextField不能删除内容,以及我的解决办法。。。

3.0正式版,win32下,TextField按下backspace键不能删除内容.网上搜了下,很早就有的问题了,正式版了竟然还不解决...真心无力吐槽啊!!!这种巨大而又明显的Bug... 从昨天突发奇想用Cocos2d做软件开始,经历了太多的摧残,简直听者伤心,闻者落泪... 已经去Cocoachina论坛反馈了,虽然基本白费口舌...思路就是监听按键事件,调用setText修改内容... 1 auto listener = EventListenerKeyboard::create();

Sharepoint商务智能学习笔记之PowerPviot Service安装与配置(七)

1) PowerPviot Service多服务器部署注意事项 PowerPviot Service不是Sharepoint自带的服务,要想使用PowerPviot Service需要先在sharepoint场中部署PowerPivot for SharePoint.详情请参考在 SharePoint 场中规划 PowerPivot 部署. 如果sharepoint场是多服务器场,可以将PowerPivot for SharePoint以扩展方式部署到多个应用程序服务器上.对于 PowerPiv

Cocos2DX笔记----------使用opengl实现水果忍者刀刃轨迹

最近有个小需求,需要实现水果忍者刀刃的效果,网上找了很多实例代码,查了很多资料,终于捣鼓了出来. 效果图如下: 图1: 图2: 该算法还是比较简单的,先说说流程: [收集轨迹点]主要是使用了cocos2dX中的ccTouchesBegan和ccTouchesMoved ccTouchesBegan里面包含了刷新最近轨迹点的功能 ccTouchesMoved里面包含了添加轨迹点的功能 此时需要一个数组用于记录轨迹的ccpoint,我将它命名为mPointArray,用于存储这些轨迹点.每次手指按下