簡體   English   中英

實現游戲播放的最佳方式?

[英]Best way to implement game playback?

我正在用Java創建一個基於網格的游戲,我想實現游戲錄制和播放。 我不知道怎么做,雖然我已經考慮了兩個想法:

  1. 每秒幾次,我會記錄整個游戲狀態。 為了回放它,我寫了一個渲染器來讀取狀態並嘗試創建一個可視化表示。 但是,有了這個,我可能會有一個大的保存文件,任何播放嘗試都可能會有明顯的延遲。

  2. 我也可以將每個按鍵和鼠標點擊寫入保存文件。 這會給我一個較小的文件,並可以減少滯后回放。 然而,游戲開始時的最輕微錯誤(例如,1毫秒后拍攝)將導致游戲幾分鍾內完全不同的游戲狀態。

那么,實現游戲播放的最佳方式是什么?

編輯 - 我不確定我的游戲究竟有多確定,所以我不確定整個游戲是否只​​能通過按鍵和鼠標點擊來拼湊。

良好的播放機制不是可以簡單地添加到游戲中而沒有重大困難的東西。 最好的方法是設計游戲基礎設施。 命令模式可用於實現這樣的游戲基礎設施。

例如:

public interface Command{
    void execute();
}
public class MoveRightCommand implements Command {
   private Grid theGrid;
   private Player thePlayer;

   public MoveRightCommand(Player player, Grid grid){
        this.theGrid = grid;
        this.thePlayer = player;
       }

   public void execute(){
     player.modifyPosition(0, 1, 0, 0);
   } 
}

然后在命令可在兩個當用戶按下鍵盤按鍵,移動鼠標或不與再生機構的觸發執行隊列被推動。 命令對象可以有一個時間戳值(相對於播放的開始),以便精確播放...

Shawn Hargreaves最近在他的博客上發表了關於他們如何在MotoGP中實施重播的帖子。 討論了幾種不同的方法及其優缺點。

http://blogs.msdn.com/shawnhar/archive/2009/03/20/motogp-replays.aspx

假設您的游戲是確定性的,那么如果您記錄了用戶的輸入(選項2)就足夠了。 但是,您需要確保識別這些事件的正確和一致的時間,例如服務器識別它們的時間。 我不確定你是如何處理網格中的事件的。

我擔心的是,如果您沒有可以統一引用定時事件的機制,則代碼處理分布式用戶的方式可能存在問題。

例如,在XBOX 360上考慮像Halo 3這樣的游戲 - 每個客戶都記錄他對游戲的看法,包括基於服務器的更正。

為什么不記錄幾次然后壓縮輸出,或者這樣做:

recordInitialState();
...
runs 30 times a second:
recordChangeInState(previousState, currentState);
...

如果您只記錄具有時間戳的狀態更改(並且每個更改都很小,並且如果沒有更改,則不記錄任何內容),您應該以合理的文件大小結束。

無需為每個幀保存場景中的所有內容。 逐步保存更改並使用一些好的插值技術。 我不會真正使用基於命令模式的方法,而是以固定的速率為每個游戲對象進行檢查,看看它是否已經改變了任何屬性。 如果存在更改,則會在某些良好的編碼中記錄更改,並且重放甚至不會變得那么大。

你如何處理這個問題在很大程度上取決於你為游戲使用的語言,但總的來說,有很多方法,取決於你是想要使用大量存儲還是想要一些延遲。 如果你能對你願意做出的犧牲有所了解,那將會很有幫助。

但是,如上所述,最好的方法似乎是保存用戶的輸入,並同時存儲游戲中所有演員/精靈的位置,這就像保存方向一樣簡單,速度和瓦片x,y,或者,如果一切都可以確定,那么忽略演員/精靈,因為你可以獲得他們的信息。

你的游戲如何不確定性對於提供更好的建議也是有用的。

如果存在大量動態動作,例如崩潰德比,那么您可能希望每幀保存信息,因為您應該以特定幀速率更新玩家/演員。

我只想說錄制游戲重播的最佳方式完全取決於游戲的本質。 以網格為基礎不是問題; 問題在於狀態變化后的可預測行為,系統新輸入的頻率,是否隨時注入隨機數據等等,您可以通過依次記錄每個動作來存儲整個國際象棋游戲,但這對於沒有明確轉彎的第一人稱射手來說不適用。 您可以通過記錄每個輸入的確切時間來存儲第一人稱射擊游戲,但這對於RPG無效,其中輸入的結果可能會被隨機骰子滾動的結果修改。 如果重要信息即時出現並且不以任何可捕獲的形式存在,即使是盡可能經常拍攝快照的看似萬無一失的想法也不夠好。

有趣的是,這與網絡問題非常相似。 一台計算機如何確保讓另一台計算機知道游戲狀態,而不必以不切實際的高頻率發送整個游戲狀態? 典型的方法最終是事件通知和狀態更新的定制混合,這可能是您在這里需要的。

我通過借用視頻壓縮的一個想法來做到這一點:關鍵幀和中間幀。 基本上,每隔幾秒就可以保存完整的世界狀態。 然后,每次游戲更新,您將所有更改保存到自上次游戲更新以來發生的世界狀態。 詳細信息(您多久保存一次關鍵幀?究竟什么是“改變世界狀態”?)將取決於您需要保留哪種類型的游戲信息。

在我們的例子中,世界由許多很多游戲對象組成,其中大多數都在任何給定的時間都保持不變,所以這種方法在記錄沒有移動的物體的位置時節省了大量的時間和記憶。 在你的權衡中,權衡可能會有所不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM