2012-05-17 14 views
6

Chcę przeczytać plist użyciu cocos2d-X (C++) Oto moja plist:cocos2d-x, jak czytać plist do tablicy

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

to w zasadzie tablica słownika, który składa się z (x , y) współrzędne. mój oryginalny kod do czytania jest:

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

ale teraz muszę przełożyć je na cocos2d-x w C++. Mam googleed jakiś artykuł, ale są one wszystko o czytaniu plist do słownika. potrzebuję tablicy.

EDIT :::

Teraz ja zmieniłem formatu 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> 

co mam zrobić ??? Nadal mam ten sam błąd:

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

nie będzie działać. Najpierw wypróbuj to. sprawdzić, czy można odczytać int z plist próbki

+0

Nie sądzę coco2d-x wsparcie czytanie plist.., ale obsługuje czytanie xml.Więc możesz parsować xml i uzyskać wartości: –

+0

jak? Myślę, że obsługuje plist i konwertuje do słownika. (użyj czegoś FileUtil) – OMGPOP

+0

nie są plist się w formacie xml? – OMGPOP

Odpowiedz

10

Spróbuj follwing linii kodu

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

lub można spróbować to zbyt ...

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

EDIT-2

Spróbuj następujący kod w przypadku korzenia jest słownika korzystał

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

zajrzeć CCParticleSystem.cpp klasę można dostać cieście pomysł. check bool CCParticleSystem::initWithDictionary(CCDictionary<std::string, CCObject*> *dictionary) wewnątrz CCParticleSystem.cpp klasa

Pozdrawiam, Nikhil

+0

to jak mogę uzyskać każdą wartość (int)? – OMGPOP

+0

CCDictionary point = testitems-> objectAtIndex (index); ale błąd – OMGPOP

+0

każdy wpis tablicy jest słownikiem – OMGPOP

3

zobaczyć tutaj jest link for reading a dictionary from file.
Aby odczytać tablicę nie mogłem znaleźć niczego, więc co można zrobić, to zmienić swoje plist do

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

następnie

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

Dzięki OMGPOP.

+0

, ale jak mogę uzyskać wartość (int) z tablicy? gdy używam objectatindex, zwraca on ccobject – OMGPOP

+0

hi, nie działa ponownie, poza indeksem, nawet jeśli ustawiam indeks, aby był w granicach związany. – OMGPOP

+0

wydaje się, że "root" nie istnieje. objectForKey ("root") zwraca NULL – OMGPOP

2

kiedy czytasz w dict i przy użyciu ObjectForKey("BLA") można typecast go do CCString* tak:

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

można również użyć

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