2009-12-28 49 views
0

我目前正在構建一個多人遊戲系統,並且我有一個關於如何管理很多對象之間很多數據變化的設計問題。如何管理數據的小變化?

我將以一個例子開始:比方說,我有3名玩家:A,B和C. A對B和敵人C是友好的。這意味着,我必須證明C是A是敵人,B A很友善。 現在我有2個不同的(但很小)的相同數據的變化。這只是一個例子。另一種變化是A會隱身,B會看到A,但C不會看到A. 如上所述,這些僅僅是示例。計劃擁有更多不同的玩家數據狀態,大多數情況下會在每個對象之間變化。

我該如何管理?一噸如果塊,還是有一些明顯的設計模式,我錯過了?由於這是一款多人遊戲,因此對於這件事,將會有不止3名玩家/對象或國家。

回答

1

要做的最好的事情是儘量掌握面向對象的編程,如果你正在爲這個概念而努力。你似乎沒有一個清楚的模型來說明你需要存儲哪些狀態數據。嘗試繪製遊戲的「狀態」圖;把它看作是在給定時間遊戲中存在什麼對象的簡單快照,以及它們是如何組織的。像player.canSee(otherPlayer)之類的東西可以計算出來,並不一定需要存儲。

儘管您可能根本不會使用數據庫,但您可能會發現通過關係數據庫設計進行一些閱讀和練習很有幫助。關係設計的概念將幫助您以清晰,一致的方式組織您的想法和存儲信息。

+0

我玩過這樣一種想法,即只需將其他玩家的「看起來像」轉換爲給定玩家的獨立方法,而不需要修改任何現有數據。那會是你的建議,對吧? – Chaosteil 2009-12-28 22:07:36

+0

這真的取決於你想要的遊戲/視覺風格。你在寫什麼類型的遊戲?我希望你認識到,從頭開始,第一人稱射手是一項相當雄心勃勃的任務。 =)如果你以前從未寫過遊戲,那麼先從一個相當簡單的2D遊戲開始,瞭解它是如何工作的(主循環,使用用戶輸入,繪圖等)。 – RMorrisey 2009-12-30 04:55:08

+0

哦,不,不,我已經寫了大量的遊戲,有些甚至在專業的環境中。我現在做的甚至不是第一人稱射擊遊戲,正如我所說的,這些僅僅是一些例子。這可能意味着這個問題出現了錯誤的例子。這可能也是完全錯誤的,因爲我沒有完全得到我希望得到的答覆。但是,我得到了一個指針,但是這對我很有幫助。現在看起來似乎很清楚,所以我一定寫了這個問題,真的很累。無論如何感謝您的幫助:) – Chaosteil 2010-01-01 15:51:56

1

那麼,一個球員的類,並在其中列出的朋友,以及敵人名單。

這是一個非常簡單的問題,或者是一個非常複雜的問題;如果真的很複雜,你還沒有給我們足夠的時間去繼續。

+0

謝謝,我在示例中添加了更多內容。我的主要問題是,不僅有兩種不同的狀態,而且還有很多,並且它們可以在每個玩家/對象之間有所不同。 – Chaosteil 2009-12-28 21:34:02

1

您的問題在於將國家視爲人們可以看到的所有排列組合。一般來說,你應該將國家視爲情況的事實,並根據需要計算出這些事實的個別觀點。

// pseudocode - make it properly object oriented for best results 
struct player 
{ 
    int teamNumber; 
    bool hidden; 
}; 

bool is_friend(player other_guy) 
{ 
    return me.teamNumber == other_guy.teamNumber; 
} 

bool can_see(player other_guy) 
{ 
    return (is_friend(other_guy) || !other_guy.hidden); 
} 

如果一個播放器(例如,A),不能看到其他玩家(如B),那麼你就是不發玩家B的信息,玩家A,直到形勢的變化。