Hey everyone, I'm a bit stumped on how to to something in my game prototype. So far I've been able to get everything working the way I want and have put most of the game data in XML files that are then loaded into a scene so I have fewer scenes to manage than before but now I've hit a road bump in dealing with the objects for a set of levels. What I want to do is have an XML file that loads all the specific information for each level when that level is selected, such as what types of enemies the player will face and the frequency of those enemies. Following a few examples and books I've got the XML file below for my levels:
<!-- Objects: Heart = 1, GreenObject = 2, BlueObject = 3 -->
<Levels>
<Level>
<Name>Chapter1Level1</Name>
<Number>1</Number>
<Unlocked>1</Unlocked>
<Stars>3</Stars>
<Data>Some Chapter 1 Level 1 Data</Data>
<Object type="1" spawnProbability="15"/>
<Object type="2" spawnProbability="25"/>
</Level>
<Level>
<Name>Chapter1Level2</Name>
<Number>2</Number>
<Unlocked>1</Unlocked>
<Stars>2</Stars>
<Data>Some Chapter 1 Level 2 Data</Data>
<Object type="1" spawnProbability="15"/>
<Object type="3" spawnProbability="35"/>
</Level>
<Level>
<Name>Chapter1Level3</Name>
<Number>3</Number>
<Unlocked>1</Unlocked>
<Stars>1</Stars>
<Data>Some Chapter 1 Level 3 Data</Data>
<Object type="1" spawnProbability="15"/>
<Object type="2" spawnProbability="25"/>
<Object type="3" spawnProbability="35"/>
</Level>
<Level>
<Name>Chapter1Level4</Name>
<Number>4</Number>
<Unlocked>1</Unlocked>
<Stars>0</Stars>
<Data>Some Chapter 1 Level 4 Data</Data>
<Object type="1" spawnProbability="15"/>
<Object type="2" spawnProbability="45"/>
<Object type="3" spawnProbability="35"/>
</Level>
</Levels>
This is just some sample data that I'm using for testing, other fields will be added and/or changed once I get further into the prototype. In my Parser, what I need to do is have all the Object Types and their Probability added to the array that holds all of the level information for each level and below is what I'm doing for the object part specifically
NSArray *dataArray = [doc nodesForXPath:@"//Levels/Level" error:nil];
//NSLog(@"Array Contents = %@", dataArray);
NSMutableArray *levelObjects = [[NSMutableArray alloc] init];
for (GDataXMLElement *element in dataArray) {
NSArray *nameArray = [element elementsForName:@"Name"];
NSArray *numberArray = [element elementsForName:@"Number"];
NSArray *unlockedArray = [element elementsForName:@"Unlocked"];
NSArray *starsArray = [element elementsForName:@"Stars"];
NSArray *dataArray= [element elementsForName:@"Data"];
NSArray *objectArray = [element elementsForName:@"Object"];
// Get Level Name
if (nameArray.count > 0) {
GDataXMLElement *nameElement = (GDataXMLElement *) [nameArray objectAtIndex:0];
name = [nameElement stringValue];
}
// Get Level Number
if (numberArray.count > 0) {
GDataXMLElement *numberElement = (GDataXMLElement *) [numberArray objectAtIndex:0];
number = [[numberElement stringValue] intValue];
}
//For the Level Objects, find each object and spawn probability for that level and add those items to an NSArray
if (objectArray.count > 0) {
for (int i = 0; i < objectArray.count; i++) {
NSMutableDictionary *objectDict = [NSMutableDictionary dictionary];
objectType = [[(GDataXMLNode *)[[objectArray objectAtIndex:i] attributeForName:@"type"] stringValue] intValue];
objectSpawn = [[(GDataXMLNode *)[[objectArray objectAtIndex:i] attributeForName:@"spawnProbability"] stringValue] intValue];
[objectDict setObject:[NSNumber numberWithInt:objectType] forKey:@"ObjectType"];
[objectDict setObject:[NSNumber numberWithInt:objectSpawn] forKey:@"ObjectSpawn"];
[levelObjects addObject:objectDict];
}
}
//CCLOG(@"the new level object array contains: %@", levelObjects);
Level *level = [[Level alloc] initWithName:name number:number locked:locked stars:stars data:data objects:levelObjects];
[levels.levelArray addObject:level];
}
At first I thought this would work, since when I tested on the first level and called
Levels *levels = [LevelParser loadLevelsForChapter:selectedChapter];
for (Level *level in levels.levelArray) {
if (level.levelNumber == selectedLevel) {
NSArray *objectArray = [[NSArray alloc] init];
objectArray = level.levelObjects;
CCLOG(@"the object array for this level contains: %@", objectArray);
}
The log was showing just the items for the first level, but when I tried loading a later level, like Level 4 the Log showed that my array for level 4 not only contained the objects for level 4 but all of the previous levels as well. I feel like I'm getting close and I know I'm missing something somewhere but I just can't seem to figure out why the array is storing all objects continuously instead of a new array each time. If anyone has had some experience in loading level items through XML can point me in the right direction that would be great. I've searched Google and through the forum for a couple of days now but so far I'm not coming up with anything that addresses my specific scenario, which makes me think I'm also going about this the wrong way but so far this method has been working for the rest of the game (such as loading the different Stages and Level scenes). Thanks.
