ОБНОВЛЕНИЕ: Возможно, я все время был на неправильном пути, потому что, возившись с моим файлом на моем компьютере, я наконец смог увидеть возникшую ошибку, где я мог легко отследить проблемы по сравнению с отслеживанием на iPhone. Я не знаю, был ли мой исходный код некорректным или нет, однако я знаю, что приведенный ниже код работает отлично, поэтому я его сохраняю (и в любом случае он мне нравится больше). ОДНАКО, моя главная проблема, кажется, заключалась в том, что я использую XML в качестве файла сохранения. Это прекрасно, но по какой-то причине сохранение файла приводит к вводу пары странных символов в самом начале файла. Поэтому вместо запуска
<savedGame>
это начиналось с чего-то вроде
|Y<savedGame>
| на самом деле это был символ, который я не смог найти, который имел линию посередине и charCode 25, а Y был на самом деле знак иены. Так что, что бы это ни было, я получал ошибку 1088. Я решил это, раздев все и вся персонажи (какими бы они ни были на всякий случай, если они разные для всех ... не уверен, что это так, но не рискую). Поэтому в своем коде ниже я добавил раздел между // РЕДАКТИРОВАТЬ СТАРТ и // РЕДАКТИРОВАТЬ СТОП, который необходим, только если вы тоже используете XML в своем скрипте. В противном случае вы можете оставить это. Надеюсь, это поможет:)
ОРИГИНАЛЬНАЯ ПОЧТА: ОК, так что, похоже, благодаря некоторому возни с кодом, указанным в нижней части страницы, на которую ссылается Дэниа, я все-таки смог заставить этот сайт работать. Я испытываю искушение оглянуться на свой оригинальный код и поэкспериментировать с ним, чтобы посмотреть, смогу ли я заставить его работать с тем, что я узнал из этого, но игра работает, поэтому я иду дальше и никогда не оглядываюсь назад ... . лол. Однако я выяснил, что для моих нужд этот код страниц был не совсем работоспособным (и почему я отказался от него изначально). Возможно, это сработало бы для их нужд, но если вы не упакуете игру файлом, насколько я могу судить, их функция «getSaveStream» всегда будет возвращать «ноль», потому что файл никогда не сможет быть записан. Так что я удалил много их «если» и «попробовал», потому что они вызывали сбой игры. Вот что я закончил в контексте моего первоначального поста:
package {
import flash.events.Event;
import flash.display.MovieClip;
import flash.filesystem.FileMode;
import flash.filesystem.FileStream;
import flash.filesystem.File;
import flash.errors.IOError;
public class SaveGameFile extends MovieClip {
private var f:File;
private var savedGame:XML;
public function SaveGameFile() {
}
public function initGame():void {
xmlLoad();
initVariables();
}
private function getSaveStream(write:Boolean, sync:Boolean = true):FileStream {
// The data file lives in the app storage directory, per iPhone guidelines.
f = File.applicationStorageDirectory.resolvePath("savedGame.xml");
// Try creating and opening the stream.
var fs:FileStream = new FileStream();
try {
//write is True and writing asynchronously.
if(write && !sync) {
fs.openAsync(f, FileMode.WRITE);
} else {
//For synchronous write, or all reads, open synchronously.
fs.open(f, write ? FileMode.WRITE : FileMode.READ);
}
} catch(e:Error) {
// On error return null.
return null;
}
return fs;
}
private function xmlLoad():void {
var fs:FileStream = getSaveStream(false);
if(fs) {
var str:String = fs.readMultiByte(f.size, File.systemCharset);
//EDIT START
//check for "bad characters" at the start of the XML file
var badCharCheck = str.charCodeAt(0);
//the first char MUST be '<' which has a CharCode of 60
while(badCharCheck != 60) {
//if the first character isn't '<' then remove it
str = str.replace(String.fromCharCode(badCharCheck), "") ;
//recheck the first character
badCharCheck = str.charCodeAt(0);
}
//EDIT END
savedGame = XML(str);
fs.close();
} else {
//fs returned null so create the XML file savedGame and save it
createSaveFile();
xmlSave();
}
}
public function saveTheGame():void {
//this is used to call the save function externally
xmlSave();
}
private function xmlSave():void {
//the file exists because it was created with FileMode.WRITE in getSaveStream
var fs:FileStream = getSaveStream(true, false);
var s:String = String(savedGame);
fs.writeUTF(s);
fs.close();
}
private function createSaveFile():void {
//this is only called the very first time the game is run on the iPhone
savedGame =
<savedGame>
<levelsCompleted>0</levelsCompleted>
<levelWorkingOn>0</levelWorkingOn>
<volLevel>0.05</volLevel>
<sfxLevel>0.75</sfxLevel>
<level>
<levelNum>1</levelNum>
<highScore>0</highScore> //...etc.
</level>
//you get the idea
</savedGame>
}
Так что я рад сообщить, что тестирование прошло отлично, и теперь он работает и сохраняет информацию, как положено. Надеюсь, что это полезно для тех, кто сталкивается с той же проблемой, что и я. Удачного кодирования!