cocos2d-x中使用plist文件总结

来自:csdn qqTuBo

原文:

cocos2d-x 读取plist文件

最近在学cocos,有很多不错的游戏都是用cocos实现的,其实貌似捕鱼达人4月份流水账有3500W,好奇之下,看了看下捕鱼达人里的一些资源,顺便试着学习下plist的用法。
(接下来用到的资源都在捕鱼达人的APK内,直接解压了就能看到。)

我挑了FishActor-Small_hv.plist和它对应的png来看看下。

FishActor-Small_hv.plist内部的格式是这样的


frames

btn_music.png

frame
{{1, 46}, {31, 16}}
offset
{0,0}
rotated

sourceColorRect
{{0, 0}, {31, 16}}
sourceSize
{31, 16}

结构是这样的:

文件名

frames

图片名

frame

可以通过这样获取object
CCRect PlistUtils::getRectFromPlist(const char* fileName,const char* key1,const char* key2,const char* key3){

	CCDictionary* pDictionary=(CCDictionary*)CCDictionary::createWithContentsOfFile(fileName);
	CCDictionary* content1=(CCDictionary*)pDictionary->objectForKey(key1);
	CCDictionary* content2=(CCDictionary*)content1->objectForKey(key2);
	CCString* object=(CCString*)content2->objectForKey(key3);
}

这样就能获取到需要的对象。接下来添加一个开始游戏的menu。首先对HelloWorld改造下,先在init里加入背景

CCSprite* background=CCSprite::create("ui_background_normal_hv.png");
		background->setAnchorPoint(CCPointZero);
		background->setPosition(CCPointZero);
		addChild(background,0);

再加入开始游戏的按钮,开始游戏的贴图是通过,开始游戏的贴图在UI_GameMenuText_cn_hv.png和UI_GameMenuText_cn_hv.plist内首先获取开始游戏的CCRect

CCTexture2D* menusCache=CCTextureCache::sharedTextureCache()->addImage("UI_GameMenuText_cn_hv.png");
		
		CCRect startRect=PlistUtils::getRectFromPlist("UI_GameMenuText_cn_hv.plist","frames","ui_2p_010.png","frame");
		CCSprite* startSprite=CCSprite::createWithTexture(menusCache,startRect);
		CCMenuItemSprite* pStartMenu=CCMenuItemSprite::create(startSprite,startSprite,this,menu_selector(GameMenuScence::menuStartCallback));
		pStartMenu->setAnchorPoint(ccp(0.5f,0.5f));
		pStartMenu->setPosition(ccp(size.width/2,size.height/2));

		CCMenu* pMenus=CCMenu::create(pStartMenu,NULL);
		pStartMenu->setPosition(CCPointZero);
		addChild(pMenus,2);

效果图如下cocos2d-x中使用plist文件总结_第1张图片
http://download.csdn.net/detail/qqtubo/5557369

 

来自:蓝色記憶

原文:

cocos2d-x 2.1 -- 读取.plist文件

 

在cocos2d-x中可以用.plist格式的文件来保存数据,它是XML文件格式的一种,在cocos2d-x解析.plist方面相关的资料比较少,但本身也很简单,要解析.plist文件可以参考cocos2d-x类库中的CCSpriteFrameCache类和CCParticleSystem类,它主要是使用CCDictionary类来对.plist文件进行操作。

下面有一个.plist文件:





	level1
	
		bg_far_scene
		
			path
			images/far_scene.png
			pos
			{358, 309}
		
		bg_near_scene
		
			path
			images/near_scene.png
			pos
			{360, 100}
		
	


读取.plist文件的代码如下:

	const char* testPlistPath = "BSPlistDatas\\test.plist";
	const char* fullPath = CCFileUtils::sharedFileUtils()->fullPathFromRelativeFile("test.plist", testPlistPath);
	CCDictionary* plistDic = CCDictionary::createWithContentsOfFile(testPlistPath);

	CCDictionary* levelDic = dynamic_cast(plistDic->objectForKey("level1"));
	CCDictionary* farScene = dynamic_cast(levelDic->objectForKey("bg_far_scene"));
	CCString* farScenePath = dynamic_cast(farScene->objectForKey("path"));
	CCPoint point = CCPointFromString(farScene->valueForKey("pos")->getCString());
		
	CCLog("path = %s", farScenePath->getCString());
	CCLog("pos = %f, %f", point.x, point.y);

第一行是.plist文件的相对路径,通过CCFileUtils类获得文件中绝对路径后,使用CCDictionary::createWithContensOfFile(filePath);将文件中内容加载到CCDictionary数据结构的内存中,然后通过xxxForKey获得相应的key下的value。

这里需要注意的是,当在读取'pos'的时候,它的值一个{x, y}的字符串,这是.plist文件中的数组存储规则,我们可以通过cocos2d-x提供函数api将这样的字符串转化为CCpoint对象。

	CCPoint point = CCPointFromString(farScene->valueForKey("pos")->getCString());

上面这句话就是做了这样的一个转化的过程,同样的cocos2d-x还支持CCSize、CCRect的字符串的转化。他们转化的方法以及在.plist中对应的字符串格式如下:

CCPoint: CCPointFromString(); {x, y}

CCSize:  CCSizeFromString(); {w, h}

CCRect: CCSizeFromString(); {x, y, w, h}

这样我们2D游戏所初始化所需要的数据都基本上够用了,可以尝试将游戏的初始数据放在.plist中,然后修改调整数值就可以直接修改plist文件,而无需重新编译程序了,从而实现游戏数据和游戏逻辑的分离。


 

你可能感兴趣的:(Cocos+H5,plist)