2013-12-15 67 views
1

我有用C#編寫XNA 4.0的Windows Phone 7遊戲。如何檢測用戶在禁用時再次運行WP7 XNA應用程序?

,似乎都可以,如果用戶將執行以下操作來避免Game.OnExiting方法:

  1. 通過Windows手機操作系統瓷磚開始遊戲。
  2. 在遊戲過程中,按下WINDOWS按鈕離開遊戲(導致Game.OnDeactivated的調用,但不是Game.OnExiting)。
  3. 用戶通過Windows Phone OS中的Tile再次啓動遊戲。

我看了很多關於WP7應用程序生命週期,但一直沒能找到任何觸及了用戶運行相同的應用程序連續兩次這種情況。

我有一些邏輯,只有在遊戲關閉時纔有意義,並且不會錯過(比如上面的情況)。我無法在OnDeactivated中調用它,因爲它會導致糟糕的用戶體驗。

這裏是有問題的代碼(我的執行Game類的內找到):

protected override void OnExiting(object sender, EventArgs args) 
{ 
    // This is what is getting missed! 
    ForceSave(); 

    base.OnExiting(sender, args); 
} 

protected override void OnDeactivated(object sender, EventArgs args) 
{ 
    base.OnDeactivated(sender, args); 

    // I don't want to put ForceSave here because it will get called even if the user is not exiting the game. 

    ... 
} 

protected override void OnActivated(object sender, EventArgs args) 
{ 
    base.OnActivated(sender, args); 

    ... 
} 

回答

0

我不認爲你可以處理這種情況。
我不知道你的遊戲是什麼,但最簡單的解決方案是在電平結束時或顯示另一個菜單之前調用ForceSave(我想這是一種保存方法),但不能僅在用戶之前保存用戶進度關閉應用程序。有時遊戲可能會無緣無故地崩潰,你必須防止這種情況發生。
簡而言之,您必須修改您的保存邏輯。

+0

對ForceSave的調用使用玩家的當前分數填充排行榜(如果足夠高)。在正常流程中(例如在關卡結束時),我也會這樣做,但要處理遊戲退出中級的情況。如果用戶退出遊戲,這是有道理的,但如果用戶在實際完成遊戲之前回到了會話並在排行榜中看到了他們的高分,那將是非常奇怪的。 – Goose

+0

我不明白,爲什麼你想要更新球員得分,如果他還沒有完成目前的水平?你應該在開始之前做到這一點。 – pinckerman

+0

這只是爲了更好的用戶體驗。想象一下,我的遊戲是俄羅斯方塊或吃豆人。如果用戶在實際死亡之前退出,那麼保存他的成績與他退出時似乎是公平的,因爲如果他留在比賽中,他的得分不會下降。希望這有助於解釋我的動機。如果您對如何解決這個問題有其他想法,我非常開放!例如,也許我將分數序列化到臨時字段OnDeactived,然後OnActivated檢查該字段當前是否存儲任何內容,如果是,請將其保存到真實的高分值字段。儘管希望有一般的解決方案。 – Goose

相關問題