2011-08-12 39 views
2

我正在研究Flash CS5 Professional中的Flash遊戲,最終將在iPhone上運行(因此iOS標記)。我目前正在設計代碼的保存遊戲部分,我試圖設置當有人第一次運行遊戲並且保存遊戲文件尚不存在時發生的情況。這裏是我的代碼:Flash CS5處理「文件不存在」FileMode.READ情況中的錯誤

public class SaveGameFile extends MovieClip { 
    private var file:File; 
    private var savedGame:XML; 

    public function SaveGameFile() { 
     addEventListener(Event.ADDED_TO_STAGE, addedFileSystem); 
    } 

    private function addedFileSystem(event:Event):void { 
     removeEventListener(Event.ADDED_TO_STAGE, addedFileSystem); 
     file = File.applicationStorageDirectory; 
     file = file.resolvePath("saveGame1.xml"); 
     xmlLoad(); 
    } 

    private function xmlLoad():void { 
     var fileStream:FileStream = new FileStream(); 
     fileStream.addEventListener(IOErrorEvent.IO_ERROR, ioReadErrorHandler); 
     fileStream.open(file, FileMode.READ); 
     fileStream.addEventListener(Event.COMPLETE, xmlLoadCompleteHandler); 
    } 

    private function xmlLoadCompleteHandler(event:Event):void { 
     var fileStream:FileStream = event.target as FileStream; 
     fileStream.removeEventListener(Event.COMPLETE, xmlLoadCompleteHandler); 
     var str:String = fileStream.readMultiByte(file.size, File.systemCharset); 
     savedGame = XML(str); 
     fileStream.close(); 
    } 

    private function ioReadErrorHandler(event:Event):void { 
     var fileStream:FileStream = event.target as FileStream; 
     fileStream.removeEventListener(IOErrorEvent.IO_ERROR, ioReadErrorHandler); 
     createFile(); 
     xmlSave(); 
    } 

在ioReadErrorHandler我有一個基本創建XML文件,並把它放入savedGame變量兩個功能。然後xmlSave創建XML文件。至少這是應該發生的事情。現在,當它到達

fileStream.open(file, FileMode.READ); 

我得到錯誤#3003:文件或目錄不存在,這意味着我的ioReadErrorHandler是不是做的伎倆在這裏。如果我創建該文件並保存它,那麼這段代碼完美工作,我可以跟蹤(savedGame),它顯示得很好。但是如果我試圖去創造它(正如我提到的那樣,它必須在遊戲第一次運行時),這就是我最終的目標。我在這裏錯過了什麼,或者IOErrorEvent.IO_ERROR不是我需要做的工作嗎?

此外,一旦完成(當然正常工作),它會返回到FileMode.READ並再試一次?或者錯誤是否會將你從函數中分離出來,並且需要再次運行?

+0

沒關係...終於找到我的問題了。事件只適用於看起來異步的操作,我的代碼是同步操作。而不是事件,我做了這個,而現在它完美的作品!對於任何可能感興趣的人來說。 'try {} \t fileStream.open(file,FileMode.READ); (e:IOError){ \t \t createFile(); \t \t xmlSave(); \t}' – FlashNoob468

回答

2

正如我在自己的帖子的評論中提到的,我找到了處理這個同步操作的正確方法。下面是更正後的代碼,如果有人搜索這個想知道:

public class SaveGameFile extends MovieClip { 
private var file:File; 
private var savedGame:XML; 

public function SaveGameFile() { 
    addEventListener(Event.ADDED_TO_STAGE, addedFileSystem); 
} 

private function addedFileSystem(event:Event):void { 
    removeEventListener(Event.ADDED_TO_STAGE, addedFileSystem); 
    file = File.applicationStorageDirectory; 
    file = file.resolvePath("saveGame1.xml"); 
    xmlLoad(); 
} 

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

再「的CreateFile():」運行創建XML文件並將其保存到變量「savedGame」的功能。然後「xmlSave();」運行一個函數來實際保存文件,以便xmlLoad在新設備上第一次運行時加載一些東西。

相關問題