[分享]iphone游戏中关卡生成 XML 方式
最近在尝试写一个类似于打地鼠的游戏,遇到了小小的困难,主要是老鼠坐标无法存储,手点了之后,不只如何通过坐标的方式遍历并且消失,或者是相关的动作。
从Throw too代码中,学习了一点XML存储并操作,以达到对关卡地图等的绘制。分享下。
首先放出XML格式
2 <!-- important details -->
3 <background file="default"/>
4 <player x="40" y="233"/>
5 <exit x="240" y="0" width="40" height="2"/>
6 <size width="480" height="320"/>
7 <next level="level2"/>
8
9 <!-- actual map -->
10 <line x1="0" y1="200" x2="80" y2="200"/>
11 <line x1="80" y1="200" x2="240" y2="40"/>
12 <line x1="240" y1="40" x2="240" y2="0"/>
13 <line x1="280" y1="0" x2="280" y2="40"/>
14 <line x1="280" y1="40" x2="400" y2="200"/>
15 <line x1="400" y1="200" x2="480" y2="200"/>
16
17 <spikes direction="up" x="0" y="0" width="200" height="10"/>
18 <spikes direction="up" x="400" y="200" width="80" height="10"/>
19
20 </thrown>
方法的调用。
XMLLevelLoader *levelLoader;
[levelLoader:url parseError:&parseError];parseXMLFileAtURL
方法的原形,也就是定义。通过URL初始化,读取XML,而URL则是自行定义的,XML地址。
- (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error {
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
// Set self as the delegate of the parser so that it will receive the parser delegate methods callbacks.
[parser setDelegate:self];
[parser setShouldProcessNamespaces:NO];
[parser setShouldReportNamespacePrefixes:NO];
[parser setShouldResolveExternalEntities:NO];
[parser parse];
NSError *parseError = [parser parserError];
if (parseError && error) {
*error = parseError;
}
[parser release];
}
重点注意下这一句话: [parser parse];
调用了Parse方法。进行细化处理。。。下面贴一下具体情况是如何处理的。比较简单。没见过的那些函数大多是重力,刚体等特性的,移动,或者是图形路径的绘制。不必多说,自行参考下chipmunk。h这个开源的函数吧。
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
if (qName) {
elementName = qName;
}
// NSLog(@"element = %@ , attr = %@", elementName, attributeDict);
if ([elementName isEqualToString:@"line"]) {
float x1 = [[attributeDict valueForKey:@"x1"] floatValue];
float y1 = [[attributeDict valueForKey:@"y1"] floatValue];
float x2 = [[attributeDict valueForKey:@"x2"] floatValue];
float y2 = [[attributeDict valueForKey:@"y2"] floatValue];
make_scenery_line(x1, y1, x2, y2, kColl_Scenery);
}else if([elementName isEqualToString:@"circle"]) {
float x = [[attributeDict valueForKey:@"x"] floatValue];
float y = [[attributeDict valueForKey:@"y"] floatValue];
float radius = [[attributeDict valueForKey:@"radius"] floatValue];
make_scenery_circle(x, y, radius);
}else if([elementName isEqualToString:@"background"]) {
NSString * url = [attributeDict valueForKey:@"url"];
if(url != nil){
// [game setPsuedoBackground:[NSURL URLWithString:url]];
}
NSString * fileURL = [attributeDict valueForKey:@"file"];
if(fileURL != nil){
//TODO
// NSBundle* bundle = [NSBundle mainBundle];
// [game setPsuedoBackground: [NSURL fileURLWithPath: [bundle pathForResource:fileURL ofType:@"png"]]];
}
}else if ([elementName isEqualToString:@"spikes"]) {
float x = [[attributeDict valueForKey:@"x"] floatValue];
float y = [[attributeDict valueForKey:@"y"] floatValue];
float width = [[attributeDict valueForKey:@"width"] floatValue];
float height = [[attributeDict valueForKey:@"height"] floatValue];
NSString * type = [attributeDict valueForKey:@"direction"];
if([type compare:@"up"] == NSOrderedSame){
make_up_scenery_spikes(x, y, width, height);
}else if([type compare:@"down"] == NSOrderedSame){
make_down_scenery_spikes(x, y, width, height);
}else if([type compare:@"left"] == NSOrderedSame){
make_left_scenery_spikes(x, y, width, height);
}else if([type compare:@"right"] == NSOrderedSame){
make_right_scenery_spikes(x, y, width, height);
}
}else if([elementName isEqualToString:@"next"]) {
NSString *level = [attributeDict valueForKey:@"level"];
// TODO
[game setNextLevel: level];
}else if([elementName isEqualToString:@"size"]) {
float width = [[attributeDict valueForKey:@"width"] floatValue];
float height = [[attributeDict valueForKey:@"height"] floatValue];
mapSize = cpv(width, height);
make_scenery_box(0, 0, width, height);
}else if([elementName isEqualToString:@"thrown"]) {
numberOfThrows = [[attributeDict valueForKey:@"throws"] floatValue];
totalNumberOfThrows = [[attributeDict valueForKey:@"throws"] floatValue];
}else if([elementName isEqualToString:@"player"]) {
float x = [[attributeDict valueForKey:@"x"] floatValue];
float y = [[attributeDict valueForKey:@"y"] floatValue];
move_player(cpv(x, y));
player_origin_x = x;
player_origin_y = y;
}else if ([elementName isEqualToString:@"exit"]) {
float x = [[attributeDict valueForKey:@"x"] floatValue];
float y = [[attributeDict valueForKey:@"y"] floatValue];
float width = [[attributeDict valueForKey:@"width"] floatValue];
float height = [[attributeDict valueForKey:@"height"] floatValue];
make_scenery_exit_box(x, y, width, height);
}
}
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
NSLog(@"Error on XML Parse: %@", [parseError localizedDescription] );
}
暂时罗嗦这多,,继续看。
作者:Alexliu(alex dotNet Learning)
出处:http://alexliu.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,转载请注明。并且保留文章链接。否则保留追究法律责任的权利。