原文地址:
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)