6

我想使用 cocos2d-x (c++) 读取 plist 这是我的 plist:

<array>
    <dict>
        <key>x</key>
        <integer>0</integer>
        <key>y</key>
        <integer>0</integer>
    </dict>
    <dict>
        <key>x</key>
        <integer>140</integer>
        <key>y</key>
        <integer>12</integer>
    </dict>
    <dict>
        <key>x</key>
        <integer>120</integer>
        <key>y</key>
        <integer>280</integer>
    </dict>
    <dict>
        <key>x</key>
        <integer>40</integer>
        <key>y</key>
        <integer>364</integer>
    </dict>
<array>

它基本上是一个由 (x, y) 坐标组成的字典数组。我的原始阅读代码是:

NSString *path = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"w%i", world] ofType:@"plist"];
NSMutableArray* points = [NSMutableArray arrayWithContentsOfFile:path];

但现在我需要将它翻译成 c++ 中的 cocos2d-x。我用谷歌搜索了一些文章,但它们都是关于将 plist 读入字典的。我需要一个数组。

编辑:::

现在我改变了我的 plist 格式:

<dict>
    <key>11x</key>
    <integer>0</integer>
    <key>11y</key>
    <integer>0</integer>
    <key>12x</key>
    <integer>140</integer>
    <key>12y</key>
    <integer>12</integer>
<dict>

我该怎么办???我仍然得到同样的错误:

CCDictionary<std::string, CCObject*>* dict = CCFileUtils::dictionaryWithContentsOfFile(plistPath);
int x = (int)dict->objectForKey("11x");
int y = (int)dict->objectForKey("11y");

不会工作。请先试用一下。看看你是否可以从示例 plist 中读取一个 int

4

4 回答 4

10

尝试以下代码行

//const char *pszPath = CCFileUtils::fullPathFromRelativePath(plistName);
//consider that file is in resource bundle..
// CCDictionary<std::string, CCObject*> *plistDictionary=CCFileUtils::dictionaryWithContentsOfFile("testplist.plist");
// CCArray *testitems = (CCArray*)plistDictionary->objectForKey("root");

编辑

或者你也可以试试这个...

 CCDictionary<std::string, CCObject*> *plistDictionary = CCFileUtils::dictionaryWithContentsOfFile("testplist.plist");
 CCMutableArray<CCObject*> *testitems = (CCMutableArray<CCObject*>*)plistDictionary->objectForKey("root");
 CCLog("COUNT: %d", testitems->count());

编辑-2

如果 root 是字典,请尝试以下代码

   var1 = atoi(valueForKey("blendFuncSource", dictionary));
    var2 = atoi(valueForKey("blendFuncDestination", dictionary));

看看里面CCParticleSystem.cpp的课,你可能会得到击球手的想法。检查bool CCParticleSystem::initWithDictionary(CCDictionary<std::string, CCObject*> *dictionary)课内CCParticleSystem.cpp_

问候, 尼基尔

于 2012-05-17T10:49:11.343 回答
3

请参阅此处是从文件中读取字典的链接
要读取数组,我找不到任何东西,所以你可以做的就是将你的 plist 更改为

<dict> <key>root</key>
  <array>
    <dict>
        <key>x</key>
        <integer>0</integer>
        <key>y</key>
        <integer>0</integer>
    </dict>
    <dict>
        <key>x</key>
        <integer>140</integer>
        <key>y</key>
        <integer>12</integer>
    </dict>
    <dict>
        <key>x</key>
        <integer>120</integer>
        <key>y</key>
        <integer>280</integer>
    </dict>
    <dict>
        <key>x</key>
        <integer>40</integer>
        <key>y</key>
        <integer>364</integer>
    </dict>
  <array>
</dict>

然后

CCDictionary<std::string, CCObject*> *dict = CCFileUtils::dictionaryWithContentsOfFile("yourFile.plist");
CCArray *testitems = (CCArray*)dict->objectForKey("root");

感谢OMGPOP

于 2012-05-17T10:56:59.893 回答
2

当您阅读 dict 并使用ObjectForKey("BLA")时,您可以将其类型转换为CCString*这样的:

    CCString* tmpStr = (CCString*)(yourDict->ObjectForKey("KEY"));
    int x = tmpStr->toInt();
于 2012-05-29T10:37:28.460 回答
0

你也可以使用

Array* items = Array::createWithContentsOfFile("name.plist");
于 2013-11-13T01:19:00.110 回答