【问题标题】:cocos2d-x how to read plist into an arraycocos2d-x如何将plist读入数组
【发布时间】:2012-05-17 10:32:12
【问题描述】:

我想使用 cocos2d-x (c++) 读取 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

【问题讨论】:

  • 我不认为 coco2d-x 支持读取 plist..但它支持读取 xml。所以你可以解析xml并获取值
  • 怎么样?我认为它支持 plist 并转换为字典。 (使用 FileUtil 的东西)
  • plist本身不是xml格式吗?
  • 是的 plist 是 xml 这就是我说要解析它的原因。而且我不知道 FileUtil。如果我真的工作,然后将其发布为答案,我会 +1。
  • +1 以上信息的四个答案。

标签: iphone ios cocos2d-iphone plist cocos2d-x


【解决方案1】:

试试下面的代码

//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());

EDIT-2

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

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

看看里面CCParticleSystem.cpp 类你可能会得到击球手的想法。 检查bool CCParticleSystem::initWithDictionary(CCDictionary&lt;std::string, CCObject*&gt; *dictionary) 里面的CCParticleSystem.cpp

问候, 尼基尔

【讨论】:

  • 那我怎样才能得到每个值(int)?
  • CCDictionary<:string int> point = testitems->objectAtIndex(index);但错误
  • 数组的每个条目都是一个字典
  • 无法从 cocos2d::ccobject 转换为 ccmutabledictionary<:string int>
  • CCDictionary miniDict = testitems->objectAtIndex(index);尝试类似的事情
【解决方案2】:

看到这里是link for reading a dictionary from file
要读取数组,我找不到任何东西,所以你可以做的就是将你的 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

【讨论】:

  • 但是如何从数组中获取值(int)?当我使用 objectatindex 时,它返回一个 ccobject
  • 嗨,即使我将索引设置在范围内,也无法再次工作,超出索引。
  • 似乎“根”不存在。 objectForKey("root") 返回 NULL
  • 如果你可以检查我已经编辑了 plist.. 所以你必须像我的回答一样添加这个键
  • 是的,我注意到了,但仍然是同样的问题。你能试试吗?喜欢从示例 plist 中读取值 x?
【解决方案3】:

当您阅读字典并使用ObjectForKey("BLA") 时,您可以将其类型转换为CCString*,如下所示:

    CCString* tmpStr = (CCString*)(yourDict->ObjectForKey("KEY"));
    int x = tmpStr->toInt();

【讨论】:

    【解决方案4】:

    你也可以使用

    Array* items = Array::createWithContentsOfFile("name.plist");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多