2011-05-26 70 views
1

我只是想知道,難以保存/加載遊戲狀態?什麼是我保存並加載遊戲狀態的最佳方式

我正在創建一款遊戲,並且我希望能夠保存遊戲狀態以防萬一出現通話或玩家結束遊戲繼續玩另一次遊戲或遊戲崩潰時,則可選擇開始新遊戲比賽或繼續他/她離開的地方。

遊戲狀態包含SFX,背景音樂(背景音樂應該繼續它結束的地方)。 (兩個按鈕),一個充滿uiimages的網格(圖像應該重新出現在遊戲結束之前的相同位置),得分(高分和玩家核心),等級和3個以外的網格。

你有什麼建議?

有沒有好的教程呢?我已經檢查過,但我似乎只能找到cocos2d,而我目前沒有使用cocos2d。

//Load the saved gamestate 
- (void)loadGameState { 
    // Set up the file manager and documents path 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; NSMutableData *gameData; 
    NSKeyedUnarchiver *decoder; 
    NSString *documentPath = [documentsDirectory stringByAppendingPathComponent:@"gameState.dat"]; 
    gameData = [NSData dataWithContentsOfFile:documentPath]; 
    decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:gameData]; 

    NSLog(@"INFO - GameScene: Loading saved game duration."); 
    //timeSinceGameStarted = [[decoder decodeObjectForKey:@"timeSinceGameStarted"] floatValue]; 
    NSLog(@"INGO - GameScene: Loading saved game score."); 
    playerscore = [[decoder decodeObjectForKey:@"playerscore"] floatValue]; 
    NSLog(@"INGO - GameScene: Loading saved high score."); 
    highscore = [[decoder decodeObjectForKey:@"highscore"] floatValue]; 
    NSLog(@"INGO - GameScene: Loading saved level."); 
    level = [[decoder decodeObjectForKey:@"Level"] floatValue]; 
    NSLog(@"INFO - GameScene: Loading game time data."); 

    [decoder release]; 
} 

//Saving the current gamestate 
-(void)saveGameState { 
    NSLog(@"Saving game state"); 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *gameStatePath = [documentsDirectory stringByAppendingPathComponent:@"gameState.dat"]; 

    NSMutableData *gameData; 
    NSKeyedArchiver *encoder; 
    gameData = [NSMutableData data]; 
    encoder = [[NSKeyedArchiver alloc] initForWritingWithMutableData:gameData]; 

    // Archive the games timer settings 
    NSNumber *savedGameStartTime = [NSNumber numberWithFloat:totalSeconds]; 
    //NSNumber *savedTimeSinceGameStarted = [NSNumber numberWithFloat:timeSinceGameStarted]; 
    NSNumber *savedPlayerScore = [NSNumber numberWithFloat:playerscore]; 
    NSNumber *savedHighScore = [NSNumber numberWithFloat:highscore]; 
    NSNumber *savedcurrentlevel = [NSNumber numberWithFloat:level]; 

    [encoder encodeObject:savedGameStartTime forKey:@"gameStartTime"]; 
    //[encoder encodeObject:savedTimeSinceGameStarted forKey:@"timeSinceGameStarted"]; 

    [encoder encodeObject:savedPlayerScore forKey:@"playerscore"]; 
    [encoder encodeObject:savedHighScore forKey:@"highscore"]; 

    [encoder encodeObject:savedcurrentlevel forKey:@"Level"]; 

    // Finish encoding and write the contents of gameData to file 
    [encoder finishEncoding]; 
    [gameData writeToFile:gameStatePath atomically:YES]; 
    [encoder release]; 

    // Tell the game controller that a resumed game is available 
    //sharedGameController.resumedGameAvailable = YES; 
} 
+0

你可以保存gamestate在Sqlite數據庫 – 2011-05-26 07:46:40

+0

好嗎?我該怎麼做?這如果我的第一場比賽,所以我還是相當新的這個東西 – iphonedevonthemake 2011-05-26 07:47:59

回答

1

我想到的一種方法是將所有這些信息存儲在plist或類似的東西中;事物的座標和位置,音樂曲目的時間等等,然後當用戶被提出恢復他們上一次會話的選項時,您可以只讀取所述plist的內容並將所有內容放回原來的位置。

我知道這是一個特別粗糙的答案,但是這種方法已經在我以前工作過的2個應用程序中使用過了 - 我承認我們只跟蹤了幾十個項目 - 我相信你的遊戲很可能會要大得多。

在回答您的評論:

要做到這一點,我NSUserDefaults的使用 - 所以你會發現通過看在蘋果網站上的類引用一些有用的信息。在一個相關的地方創建一個NSUserDefaults成員,然後可以輪詢你的圖形的實例和音樂類等等,因此你需要編寫一個方法來爲你想要保存的每個類返回這個信息,或者:對於每一幀,獲取相應的類自動將他們的最新職位等寫入默認文件。設置默認文件...

yourNSUserDefaultsMember = [NSUserDefaults standardUserDefaults]; 
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithContentsOfFile: [[NSBundle mainBundle]pathForResource: @"Defaults" ofType: @"plist"]]]; 

爲了這個工作,你需要創建一個名爲Defaults或任何你喜歡的plist文件。然後使用位於類引用中的方法調用,您可以輕鬆地將字符串和整數等寫入它。

+0

感謝您的意見。你有什麼好的例子,URL鏈接或類似的東西,我可以看看? 我認爲我的遊戲實際上更小。它只是一個益智遊戲:) – iphonedevonthemake 2011-05-26 08:02:36

+0

我會看看它。謝謝!如果我遇到問題或有任何問題,是否有辦法聯繫到您?我猜你喜歡我們大多數人不會在這裏花24-7;) – iphonedevonthemake 2011-05-26 08:44:48

+0

只是拋出另一個評論,我會盡我所能建議:)祝你好運! – Luke 2011-05-26 09:15:27

相關問題