Настройка plist для хранения данных приложения (не настроек) для игры iPhone - PullRequest
4 голосов
/ 06 февраля 2011

Я пишу игру для iPhone, и она хорошо работает с жестко запрограммированными данными о моем уровне, но я хотел бы сохранить данные об уровне в файле plist и загрузить их при запуске. Я никогда не использовал списки и не могу понять, как настроить список на основе моей модели данных.

Вот как у меня сейчас это жестко запрограммировано:

(в моем приложении Delegate)

- (void)loadLevels {
    //setup NSNumber objects to load into sequences
    NSNumber * rID = [[[NSNumber alloc] initWithInt:0] autorelease];
    NSNumber * bID = [[[NSNumber alloc] initWithInt:1] autorelease];
    NSNumber * gID = [[[NSNumber alloc] initWithInt:2] autorelease];
    NSNumber * yID = [[[NSNumber alloc] initWithInt:3] autorelease];
    NSNumber * rbID = [[[NSNumber alloc] initWithInt:4] autorelease];
    NSNumber * rgID = [[[NSNumber alloc] initWithInt:5] autorelease];
    NSNumber * ryID = [[[NSNumber alloc] initWithInt:6] autorelease];
    NSNumber * bgID = [[[NSNumber alloc] initWithInt:7] autorelease];
    NSNumber * byID = [[[NSNumber alloc] initWithInt:8] autorelease];
    NSNumber * gyID = [[[NSNumber alloc] initWithInt:9] autorelease];

    //Level One's Sequence
    NSMutableArray * aSequence = [[[NSMutableArray alloc] initWithCapacity:1] autorelease];

    [aSequence addObject: rID];
    [aSequence addObject: bID];
    [aSequence addObject: gID];
    [aSequence addObject: yID];
    [aSequence addObject: rbID];
    [aSequence addObject: rgID];
    [aSequence addObject: ryID];
    [aSequence addObject: bgID];
    [aSequence addObject: byID];
    [aSequence addObject: gyID];

    // Load level One
    _levels = [[[NSMutableArray alloc] init] autorelease];

    Level *level1 = [[[Level alloc] initWithLevelNum:1 levelSpeed:1.0 levelSequence:aSequence] autorelease];

    [_levels addObject:level1];
 //do the same thing for subsequent levels//
}

(так я реализовал свой уровень класса)

#import "Level.h"

@implementation Level

@synthesize levelNum = _levelNum;
@synthesize levelSpeed = _levelSpeed;
@synthesize levelSequence = _levelSequence;

- (id)initWithLevelNum:(int)levelNum levelSpeed:(float)levelSpeed levelSequence:(NSMutableArray *)levelSequence {
    if ((self = [super init])) {
        self.levelNum = levelNum;
        self.levelSpeed = levelSpeed;
        self.levelSequence = [[[NSMutableArray alloc] initWithArray:levelSequence] autorelease];
    }
    return self;
}

- (void)dealloc {
    [_levelSequence release];
    _levelSequence = nil;
    [super dealloc];
}

@end

Я просто не понимаю, как настроить список для хранения моих данных в соответствии с моей моделью. Кто-нибудь может дать мне совет, пожалуйста?

Сложение: (вот как я думаю, мне нужно настроить plist - модель данных - это просто три переменные, инициализирующие мой уровень (см. выше). Если вы посмотрите на мой текущий plist, возможно, будет более понятно, как он настроен, но каждый уровень состоит из из: номер уровня, скорость уровня и массив чисел, обозначающих требуемую последовательность для этого уровня.)

My current plist setup

Теперь, если у меня есть эта настройка правильно, как мне загрузить значения в мою программу?

Ответы [ 2 ]

11 голосов
/ 06 февраля 2011
  • Добавьте ваш plist-файл в качестве файла ресурсов в ваш проект. Скажем, это имя config.plist

  • Получить путь к файлу ресурса. (Тем не менее, будьте осторожны с [NSBundle mainBundle], так как он не вернет пакет модульного теста в модульном тесте.)

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"config" ofType:@"plist"];
  • Ваш корневой объект - это массив уровней. Загрузите его в NSArray.
// this is autoreleased. you can retain it if needed
NSArray *levelArray = [NSArray arrayWithContentsOfFile:plistPath];
  • Теперь у вас есть массив уровней. Каждый уровень - это словарь. Загрузите уровень i (считая от 0).
NSDictionary *level = [levelArray objectAtIndex:i];
  • Теперь вы можете получить объекты из словаря уровня, используя метод objectForKey. Например, чтобы получить массив последовательностей:
NSArray *seq = [level objectForKey:@"levelSequence"];
  • Вы можете перебрать levelArray для выделения, инициализации и добавления в массив уровней для всех ваших уровней.

Надеюсь, это поможет. Обратите внимание, что я не скомпилировал код, поэтому могут быть некоторые опечатки.

1 голос
/ 06 февраля 2011

Что вам нужно сделать, это создать NSDictionary со всеми применимыми данными, которые вам нужны, прочитать их и записать в NSUserDefaults.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...