2012-05-17 16 views
6

voglio leggere un plist utilizzando cocos2d-x (C++) ecco la mia plist:cocos2d-x come leggere plist in un array

<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> 

è fondamentalmente una serie di dizionario che consistono di (x , y) coordinate. il mio codice originale per la lettura è:

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

ma ora ho bisogno di tradurlo in cocos2d-x in C++. Ho cercato su google qualche articolo, ma sono tutti sulla lettura del dizionario nel dizionario. ho bisogno di un array.

EDIT :::

Ora ho cambiato formato 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> 

cosa devo fare ??? Ho ancora lo stesso errore:

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

non funziona. Provalo prima. vedere se è possibile leggere un int dalla plist campione

+0

Non credo coco2d-x supporto leggere plist..ma supporta la lettura di xml.Quindi puoi analizzare xml e ottenere valori –

+0

come? penso che supporta plist e convertire in un dizionario. (usa FileUtil qualcosa) – OMGPOP

+0

non si plistà da solo nel formato xml? – OMGPOP

risposta

10

provare la riga seguente di codice

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

EDIT

o si può provare anche questo ...

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

EDIT-2

Prova a seguire il codice in caso di radice è dizionario

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

Look Inside CCParticleSystem.cpp classe si potrebbe avere un'idea pastella. controllo bool CCParticleSystem::initWithDictionary(CCDictionary<std::string, CCObject*> *dictionary) all'interno CCParticleSystem.cpp classe

saluti, Nikhil

+0

allora come posso ottenere ogni valore (int)? – OMGPOP

+0

CCDictionary point = testitems-> objectAtIndex (index); ma l'errore – OMGPOP

+0

ogni voce dell'array è un dizionario – OMGPOP

3

vediamo qui è il link for reading a dictionary from file.
Per leggere array non ho potuto trovare qualsiasi cosa in modo che cosa si può fare è cambiare la vostra plist per

<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> 

Poi

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

Grazie a OMGPOP.

+0

ma come posso ottenere il valore (int) dall'array? quando uso objectatindex, restituisce un ccobject – OMGPOP

+0

ciao, non funziona di nuovo, fuori dall'indice, anche se ho impostato l'indice di essere entro limiti. – OMGPOP

+0

sembra che la "radice" non esista. l'oggettoForKey ("root") restituisce NULL – OMGPOP

2

quando si legge in un dict e utilizzando ObjectForKey("BLA"), è possibile typecast a un CCString* come questo:

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

è anche possibile utilizzare

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