Flash CS5 для iOS - использование файловой системы приводит к тому, что приложение не запускается на iPhone - PullRequest
0 голосов
/ 06 октября 2011

Итак, я нахожусь на финальной стадии разработки игры для iPhone с использованием Flash CS5, и у меня возникла проблема с ее запуском на iPhone.Я зарегистрированный разработчик, так что я делаю это совершенно законно ... Я просто делаю это на ПК и с Flash, поэтому есть несколько обходных путей, которые будут сделаны LOL.Я нахожусь в точке, где он отлично работает в симуляторе, но не на самом iPhone.Я загружаю игру, и открывается начальный экран там, где у меня находится кнопка PLAY.Проблема в том, что это не работает.Не щелкай, меняй экраны ... Нада.Таким образом, я решил, что я неправильно делаю то, как использую файловую систему и сохраняю файл игры.Если я возьму материал из файлового потока и просто введу жесткие значения во все переменные сохранения игры, игра будет работать нормально.Кнопка PLAY делает свое дело, и игра хороша, за исключением того, что я придерживаюсь только жестко заданных значений вместо того, чтобы делать мелочи, такие как изменение уровней.Итак, вот код, который я использую, и, надеюсь, кто-то увидит, где я ошибся.

Приложение запускается с запуска main.as, который вызывает сохраненный файл игры ...

private function addedMain(event:Event):void {
        //Set up opening screen
        gameStart = new GameStart(this);
        addChild(gameStart);
        //set up the save game info
        _savedGame = new SaveGameFile();
        _savedGame.initGame();
    }

gameStart запускает простой скрипт, в котором есть только титульный экран с кнопкой PLAY.Нажатие на кнопку PLAY удаляет его и загружает следующий экран.Это то, что сейчас не работает.Система может просто зависать или что-то в этом роде, на данный момент у меня нет способа точно сказать, что происходит, кроме того, что кнопка PLAY ничего не делает.Итак, следующая вещь называется сам сохраненный игровой файл:

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 file:File;
        private var savedGame:XML;

    public function SaveGameFile() {

    }

    public function initGame():void {
        file = File.applicationStorageDirectory;
        file = file.resolvePath("savedGame.xml");
        xmlLoad();
        initVariables();
    }

    private function xmlLoad():void {
        var fileStream:FileStream = new FileStream();
        try {
            fileStream.open(file, FileMode.READ);
        } catch(e:IOError) {
            createSaveFile();
            xmlSave();
        }
        var str:String = fileStream.readMultiByte(file.size, File.systemCharset);
        savedGame = XML(str);
        fileStream.close();
    }

    public function saveTheGame():void {
        xmlSave();
    }

    private function xmlSave():void {
        var writeStream:FileStream = new FileStream();
        writeStream.open(file, FileMode.WRITE);
        var s:String = String(savedGame);
        writeStream.writeMultiByte(s, File.systemCharset);
        writeStream.close();
    }

    private function createSaveFile():void {
        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>
    }

Итак, как вы можете видеть, я создаю XML-файл с именем saveGame (создается при первом запуске игры, а затем просто загружается, когдаигра запускается) и с этого я извлекаю всю информацию о своем уровне по мере необходимости и сохраняю баллы и тому подобное.Опять же, это нормально работает в симуляторе (конечно), но если я оставлю этот код, я не смогу пройти через начальную страницу.Так что-нибудь выскакивает кому-то, почему это не работает?Помогите!Спасибо;)

Ответы [ 2 ]

0 голосов
/ 10 октября 2011

ОБНОВЛЕНИЕ: Возможно, я все время был на неправильном пути, потому что, возившись с моим файлом на моем компьютере, я наконец смог увидеть возникшую ошибку, где я мог легко отследить проблемы по сравнению с отслеживанием на 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>
        }

Так что я рад сообщить, что тестирование прошло отлично, и теперь он работает и сохраняет информацию, как положено. Надеюсь, что это полезно для тех, кто сталкивается с той же проблемой, что и я. Удачного кодирования!

0 голосов
/ 06 октября 2011

Adobe недавно опубликовала несколько статей по программированию приложений AIR для устройств iOs, возможно, эта статья поможет вам (в маловероятном случае, если вы ее еще не видели):

Сохранение состояния в приложениях AIR для устройств iOS

...