现在的位置: 首页 > 综合 > 正文

cocos2dx读取xml详细解析

2013年02月17日 ⁄ 综合 ⁄ 共 5206字 ⁄ 字号 评论关闭

【原创作品, 欢迎转载,转载请在明显处注明! 谢谢。    

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


抱歉!评论已关闭.