cocos2dx CCFileUtils 或者CCDictionary如何读取文件
3个回答
展开全部
在cocos2d-x中可以用.plist格式的文件来保存数据,它是XML文件格式的一种,在cocos2d-x解析.plist方面相关的资料比较少,但本身也很简单,要解析.plist文件可以参考cocos2d-x类库中的CCSpriteFrameCache类和CCParticleSystem类,它主要是使用CCDictionary类来对.plist文件进行操作。
下面有一个.plist文件:
<?xml version="1.0" encoding="UTF-8"?>
<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文件,而无需重新编译程序了,从而实现游戏数据和游戏逻辑的分离。
下面有一个.plist文件:
<?xml version="1.0" encoding="UTF-8"?>
<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文件,而无需重新编译程序了,从而实现游戏数据和游戏逻辑的分离。
2013-09-21
展开全部
楼主是要加载音乐和图片资源的时候用到CCFileUtils么,我最近也碰到类似的比如加载音乐以前是用CCFileUtils 加入音乐文件SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(CCFileUtils::fullPathFromRelativeFile("Sounds/BGM/Play_bgm_long.mp3"));现在直接改成绝对路径就行了SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic("Sounds/BGM/Play_bgm_long.mp3");希望楼主碰到的情况跟我的一样把,其实只要仔细看调用的方法的参数需要什么样的对象,应该能够很大程度上找到原因的
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-09-21
展开全部
谢谢分享
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询