代码之家  ›  专栏  ›  技术社区  ›  Sneakyness

在Objective-C Roguelike中实现多个级别的最佳方法?

  •  1
  • Sneakyness  · 技术社区  · 15 年前

    我正在使用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,并用对应于每个级别的键存储它们。很有魅力。其他地方的更大问题。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Sneakyness    15 年前

    我发现了,我使用的是NSmutableDictionary,每个数组(对象、项目、最终字符)一个。它们是使用级别的名称存储的。很有魅力。