来自:csdn qqTuBo
原文:
最近在学cocos,有很多不错的游戏都是用cocos实现的,其实貌似捕鱼达人4月份流水账有3500W,好奇之下,看了看下捕鱼达人里的一些资源,顺便试着学习下plist的用法。
(接下来用到的资源都在捕鱼达人的APK内,直接解压了就能看到。)
我挑了FishActor-Small_hv.plist和它对应的png来看看下。
FishActor-Small_hv.plist内部的格式是这样的
<dict>
<key>frames</key>
<dict>
<key>btn_music.png</key>
<dict>
<key>frame</key>
<string>{{1, 46}, {31, 16}}</string>
<key>offset</key>
<string>{0,0}</string>
<key>rotated</key>
<false/>
<key>sourceColorRect</key>
<string>{{0, 0}, {31, 16}}</string>
<key>sourceSize</key>
<string>{31, 16}</string>
</dict>
</dict></dict>
结构是这样的:
文件名
frames
图片名
frame
可以通过这样获取objectCCRect 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);
效果图如下
http://download.csdn.net/detail/qqtubo/5557369
来自:蓝色記憶
原文:
在cocos2d-x中可以用.plist格式的文件来保存数据,它是XML文件格式的一种,在cocos2d-x解析.plist方面相关的资料比较少,但本身也很简单,要解析.plist文件可以参考cocos2d-x类库中的CCSpriteFrameCache类和CCParticleSystem类,它主要是使用CCDictionary类来对.plist文件进行操作。
下面有一个.plist文件:
<?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>level1</key> <dict> <key>bg_far_scene</key> <dict> <key>path</key> <string>images/far_scene.png</string> <key>pos</key> <string>{358, 309}</string> </dict> <key>bg_near_scene</key> <dict> <key>path</key> <string>images/near_scene.png</string> <key>pos</key> <string>{360, 100}</string> </dict> </dict> </dict> </plist>
读取.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<CCDictionary*>(plistDic->objectForKey("level1")); CCDictionary* farScene = dynamic_cast<CCDictionary*>(levelDic->objectForKey("bg_far_scene")); CCString* farScenePath = dynamic_cast<CCString*>(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文件,而无需重新编译程序了,从而实现游戏数据和游戏逻辑的分离。