我正在使用Objective-C/Cocoa学习更多关于流氓的知识。我已经排除了大部分基本功能,但我仍然有一个问题要解决。
下面是流程的细目:
首先,加载地图:
NSString* mapPath = [[NSBundle mainBundle] pathForResource:mapFileName ofType:mapFileType];
NSURL* mapURL = [NSURL fileURLWithPath: mapPath];
currentMap_ = [[Map alloc] initWithContentsOfURL: mapURL];
worldArray = [[NSMutableArray alloc] init];
itemArray = [[NSMutableArray alloc] init];
[self populateMap];
return;
然后,在populatemap函数中,它使用nspoints和一个循环遍历已加载地图的每个单元格,并根据WorldRay中地图的数据创建对象。对于项目,将正常楼层放置在项目所在的位置,然后在itemArray中创建项目。两个阵列都是30x30,由地图的高度决定。
下面是Populatmap代码:
- (void)populateMap
{
NSPoint location;
for ( location.y = 0; location.y < [currentMap_ height]; location.y++ )
{
for ( location.x = 0; location.x < [currentMap_ width]; location.x++ )
{
char mapData = [currentMap_ dataAtLocation: location];
for ( GameObject *thisObject in worldDictionary )
{
//NSLog(@"char: <%c>", [thisObject single]);
if ( mapData == [thisObject single])
{
NSString* world = [thisObject className];
//NSLog(@"(%@) object created",thisObject);
[self spawnObject:world atLocation:location];
}
}
for ( Item *thisObject in itemDictionary )
{
//NSLog(@"char: <%c>", [thisObject single]);
if ( mapData == [thisObject single] )
{
NSString* item = [thisObject className];
NSString* floor = [NormalFloor className];
//NSLog(@"(%@) object created",thisObject);
[self spawnItem:item atLocation:location];
[self spawnObject:floor atLocation:location];
}
}
if ( mapData == '1'
&& [player_ stepsTaken] <= 0)
{
//NSLog(@"player spawned at (%f, %f)",location.x,location.y);
player_ = [[Player alloc] initAtLocation: location];
}
if ( mapData == '1' )
{
//NSLog(@"floor created at (%f, %f)",location.x,location.y);
[worldArray addObject:[[NormalFloor alloc] initAtLocation: location]];
}
}
}
[self setNeedsDisplay:YES];
}
这就是当事物产生时所说的:
- (void)spawnObject: (NSString*) object atLocation: (NSPoint) location
{
//NSLog(@"(%@) object created",thisObject);
[worldArray addObject:[[NSClassFromString(object) alloc] initAtLocation: location]];
}
- (void)spawnItem: (NSString*) item atLocation: (NSPoint) location
{
//NSLog(@"(%@) object created",thisObject);
[itemArray addObject:[[NSClassFromString(item) alloc] initAtLocation: location]];
}
worldray和itemarray是游戏从那一刻开始的工作,包括绘图。玩家也在WorldRay内部。我正在考虑将玩家分割成另一个characterarray数组,以便在不久的将来添加怪物之类的东西时更容易。
现在,当我加载一个新的级别时,我首先考虑了一些方法,比如将它们保存到数据中,然后再加载它们,或者某种savestate函数。然后我开始意识到我需要能够同时处理所有事情,因为事情仍然可能发生在玩家当前范围之外,包括被怪物追上多个楼层,以及随机传送。因此,基本上,我需要找到一个好的方法来存储WorldRay和itemArray,这样我就可以从0开始并继续使用它们。我确实需要一个savestate函数,但是在我完成这项工作之前没有必要去碰它,因为实际上不应该允许你把游戏保存在roguelikes中。
因此,重申一下,我需要每个级别有一组这样的数组,并且我需要以一种易于使用的方式存储它们。一个从0向上的数字系统是可以的,但是如果我可以使用一些更具描述性的东西,比如一个地图名称,从长远来看会更好。
我已经解决了我的问题,我正在为每一个使用一个NSmutabledictionary,并用对应于每个级别的键存储它们。很有魅力。其他地方的更大问题。