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

cocos2dx如何读取xml

2014-06-05 12:42 162 查看
[b]【原创作品, 欢迎转载,转载请在明显处注明! 谢谢。 [/b]

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

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

先新建一个cocos2dx的工程

HelloWorldScene.cpp中的代码如下:



[cpp] view
plaincopyprint?

#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代码如下:

[html] view
plaincopyprint?

<?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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: