您的位置:首页 > 移动开发 > Cocos引擎

cocos2dx读取xml详细解析

2012-09-02 02:27 316 查看
[b]【原创作品, 欢迎转载,转载请在明显处注明! 谢谢。    [/b]

    原文地址:http://blog.csdn.net/comeontom/article/details/7933692

这些天被cocos2dx如何读取xml困惑着,现在总结总结,如有错误,欢迎指正!

先新建一个cocos2dx的工程

HelloWorldScene.cpp中的代码如下:


#include "HelloWorldScene.h"

using namespace cocos2d;

CCScene* HelloWorld::scene()
{
CCScene * scene = NULL;
do
{
// 'scene' is an autorelease object
scene = CCScene::create();
CC_BREAK_IF(! scene);

// 'layer' is an autorelease object
HelloWorld *layer = HelloWorld::create();
CC_BREAK_IF(! layer);

// add layer as a child to scene
scene->addChild(layer);
} while (0);

// return the scene
return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
bool bRet = false;
do
{
//////////////////////////////////////////////////////////////////////////
// super init first
//////////////////////////////////////////////////////////////////////////

CC_BREAK_IF(! CCLayer::init());

//////////////////////////////////////////////////////////////////////////
// add your codes below...
//////////////////////////////////////////////////////////////////////////

// 1. Add a menu item with "X" image, which is clicked to quit the program.

// Create a "close" menu item with close icon, it's an auto release object.
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
this,
menu_selector(HelloWorld::menuCloseCallback));
CC_BREAK_IF(! pCloseItem);

// Place the menu item bottom-right conner.
pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));

// Create a menu with the "close" menu item, it's an auto release object.
CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
pMenu->setPosition(CCPointZero);
CC_BREAK_IF(! pMenu);

// Add the menu to HelloWorld layer as a child layer.
this->addChild(pMenu, 1);

// 2. Add a label shows "Hello World".

// Create a label and initialize with string "Hello World".

//最外面的 CCDictionary
CCDictionary* pDict = CCDictionary::createWithContentsOfFile("strings.xml");

//第二层 CCDictionary
CCDictionary* pDict_2 = new CCDictionary();
pDict_2->retain();
pDict_2 = (CCDictionary*)pDict->objectForKey("special");
/*
如果在同一个key下面存在<string>hhhhh</string>
<string>comeontom</string>
<true></true>
这些关键词,则输出最后一个
*/
CCLOG("pDict_2:%s",((CCString*)pDict_2->valueForKey("special_1"))->getCString());

/*第三层  下面说的是Array中包含string
<key>special_2</key>
<array>
<string>comeontom1</string>
<string>comeontom2</string>
<string>comeontom3</string>
</array>
*/
CCArray* pArray2 = new CCArray();
pArray2->retain();
pArray2 = (CCArray*)pDict_2->objectForKey("special_2");
for (int i = 0;i < pArray2->count();i++)
{
CCLOG("pArray2%i:%s",i+1,((CCString*)pArray2->objectAtIndex(i))->getCString());
}

/*第三层  下面说的是Array中包含string
<key>special_3</key>
<array>
<integer>45.0</integer>
<integer>3</integer>
<integer>43.444</integer>
</array>
*/
CCArray* pArray3 = new CCArray();
pArray3->retain();
pArray3 = (CCArray*)pDict_2->objectForKey("special_3");
for (int i = 0;i < pArray3->count();i++)
{
CCLOG("pArray3%i:%s",i+1,((CCString*)pArray3->objectAtIndex(i))->getCString());
}
/*第三层
<key>special_4</key>
<real>多媒体</real>
*/
CCLOG("pDict_2:%s",((CCString*)pDict_2->valueForKey("special_4"))->getCString());
/*第三层
<key>special_5</key>
<false></false>
*/
CCLOG("pDict_2:%s",((CCString*)pDict_2->valueForKey("special_5"))->getCString());

CCLOG("strings.xmlCounts:%d",pDict->count());
CCLOG("pDict:%s",pDict);
CCArray* pArray = new CCArray();
pArray = pDict->allKeys();//把所有的键值付给pArray
for (int i = 0;i < pArray->count();i++)
{
CCLOG("pArray%i:%s",i+1,((CCString*)pArray->objectAtIndex(i))->getCString());
}

CCLabelTTF* pLabel = CCLabelTTF::create(((CCString*)pDict->objectForKey("chinese1"))->getCString(), "Arial", 24);
/*CCLabelTTF* pLabel = CCLabelTTF::create(((CCString*)pArray->objectAtIndex(3))->getCString(), "Arial", 24);*/

// CCLabelTTF* pLabel = CCLabelTTF::create("Hello World", "Arial", 24);
CC_BREAK_IF(! pLabel);

// Get window size and place the label upper.
CCSize size = CCDirector::sharedDirector()->getWinSize();
pLabel->setPosition(ccp(size.width / 2, size.height - 50));

// Add the label to HelloWorld layer as a child layer.
this->addChild(pLabel, 1);

// 3. Add add a splash screen, show the cocos2d splash image.
CCSprite* pSprite = CCSprite::create("HelloWorld.png");
CC_BREAK_IF(! pSprite);

// Place the sprite on the center of the screen
pSprite->setPosition(ccp(size.width/2, size.height/2));

// Add the sprite to HelloWorld layer as a child layer.
this->addChild(pSprite, 0);

bRet = true;
} while (0);

return bRet;
}

void HelloWorld::menuCloseCallback(CCObject* pSender)
{
// "close" menu item clicked
CCDirector::sharedDirector()->end();
}


strings.xml代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>special</key>
<string>
<dict>
<key>special_1</key>
<string>hhhhh</string>
<string>comeontom</string>
<true></true>
<key>special_2</key>
<array>
<string>comeontom1</string>
<string>comeontom2</string>
<string>comeontom3</string>
</array>
<key>special_3</key>
<array>
<integer>45.0</integer>
<integer>3</integer>
<integer>43.444</integer>
</array>
<key>special_4</key>
<real>多媒体</real>
<key>special_5</key>
<false></false>
</dict>
</string>
<key>chinese1</key>
<string>美好的一天</string>
<key>japanese</key>
<string>良い一日を</string>
<key>spanish</key>
<string>Buen día</string>
</dict>
</plist>


最后来个总结

dict:建立字典

key:字典里面的关键词

integer:整形,其实和string、real的功能差不多,起配对作用

real:和integer、string的功能差不多,起配对作用

true:<true></true>如果这样写,输出的是1

false:<false></false> 输出的是0

string:和integer、real的功能差不多,起配对作用

array:建立数组

当然了,有兴趣看源码的同学,可以看这个文件:CCFileUtilsCommon_cpp.h(位置:cocos2dx\platform)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息