2010-07-27 1 views
1

У меня проблема с сохранением чего-то и официально из идей. что я хочу сделать, это сохранить целочисленный массив в userDefaults, а затем при перезагрузке приложения загрузите этот массив и перезапустите игру из этой последней точки.проблема с пользовательскими значениями по умолчанию при сохранении игры ... (int array)

что я делаю, так это то, что после каждого поворота моя логика AI сохраняет фактическое состояние игры в массив -> пока что так хорошо это работает. массив сохраняется, и когда я «читаю» сохраненный массив, кажется, хорошо ... ну на самом деле он сохранил правильный массив!

Теперь я перезапускаю игру. я проверяю переменную bool, которую я также сохранил, если игра была прервана из упорядоченного. отлично работает.

сейчас трюк часть. Я читаю массив из userDefaults и WOHOOO! я получаю немного другой массив, после чего я спасся! я на самом деле действительно не могу понять, почему :(

хорошо: теперь код:

вот что я делать, чтобы сохранить совет:

NSData *data = [NSData dataWithBytes:&boardToSave length:sizeof(boardToSave)]; 
[userDefaults setObject:data forKey:@"MB_boardSave"]; 

и вот, что я сделать, чтобы получить данные обратно при инициализации платы:

int loadBoard[8][8] = {0}; 
NSData *data = [userDefaults objectForKey:@"MB_boardSave"]; 
memcpy(&loadBoard, data.bytes, data.length); 

снова ... Что происходит в правильно, Что выходит не :(

любые предложения были бы очень оценены! Я также открываю альтернативные варианты экономии, если вы думаете, что есть лучшие!

ТНХ

+0

кроме любых решений, не могли бы вы поделиться тем, что * * входит и выходит? – mvds

+0

например: первые 8 записей в массиве i save: 12, 2, 12, 0, 12, 2, 12, 2 ---- и первые 8, которые загружены: 12, 2, 12, 21, 12, 2 , 12, 2 ---- только разница 21 вместо 0 ... но это сильно меняет на доске;) – zwadl

+0

Я обновил свой ответ, потому что я пропустил * очень очевидную * ошибку ... – mvds

ответ

1

редактировать ошибка, что вы memcpy к &loadBoard. Он должен быть равен loadBoard, так как это указатель. То же самое касается boardToSave.

Самое смешное, что он делает вид работы (а не аварии), как вы это делаете.

+0

i did not, но он doenst работает так или иначе :(sizeof() и .length возвращают то же значение (см. ниже) – zwadl

+0

oh и boardToSave действительно определено int boardToSave [8] [8] – zwadl

+0

:) Это не сбой в любом случае, но даже это eay of writing он производит то же самое ... правильные идут в неправильные, выходят :( – zwadl

0

им очень жаль, но его код слепота поразила меня :)

, где я хотел, чтобы этот

if(loadBoard[j][i] == 1 || loadBoard[j][i] == 11 || loadBoard[j][i] == 12){ 
[...]; 
} 

я имел этот

if(loadBoard[j][i] == 1 || boardSetup[j][i] == 11 || boardSetup[j][i] == 12){ 
[...]; 
} 

Не удивительно, что не работало :) НО для все, что стоило там, было кое-что ошибочно с сохранением и загрузкой массива, а после того, как у меня были правильные результаты, я смог найти вышеупомянутую ошибку «глаз» :)

что я сделал теперь, чтобы сохранить массив, не использовать массив int [8] [8], а NSMutableArray, который я сохраняю непосредственно в userDefaults. (не более memcopy и так далее ...) вот что я сделал, и то, что (наконец) работает для меня

сохранить:

NSMutableArray* array = [[NSMutableArray alloc] init]; 
// ... fill Array like so: [array addObject:[NSNumber numberWithInt:11]]; ... 
[userDefaults setObject:array forKey:@"MB_boardSave"]; 
[userDefaults synchronize]; 

нагрузка:

NSArray* array = [userDefaults objectForKey:@"MB_boardSave"]; 
int example = [[array objectAtIndex:0] intValue]; 

может быть, то будет полезно для кого-то еще, а!

+0

молодец, это менее хакерский способ делать что-то! – mvds

+0

Кстати, вы «выпускаете» массив? Я предлагаю 'autorelease' после' init'. – mvds

+0

Я выпустил его, но изменил его на autorelease. thx для подсказки! – zwadl