2010-05-11 53 views
0

我正在研究一個簡單的遊戲設計,並且我想將我的遊戲對象分解爲更多可重用的組件。但是我陷入瞭如何實現我所想到的設計。這裏有一個例子:如何避免遊戲渲染組件循環引用?

我有一個Logger對象,其工作只是存儲一個消息列表並呈現給屏幕。你知道,伐木。記錄器最初只是列表,遊戲循環呈現出它的內容。然後我將渲染邏輯移入Logger.Draw()方法,現在我想將它進一步移動到LoggerRenderer對象中。

實際上,我想讓遊戲循環調用RenderAll,然後調用Logger.Render,然後調用LoggerRenderer.Render並最終輸出文本。所以Logger需要包含一個Renderer對象,但是Renderer需要訪問Logger的狀態(消息隊列)才能渲染。

我該如何解決?我應該將消息隊列和其他狀態信息顯式傳遞給Render方法嗎?或者遊戲循環直接調用渲染器並且鏈接回記錄器,但RenderAll方法從來不會真正看到記錄器對象本身?

這種感覺有點像命令模式,但我把它搞砸了。

回答

2

或者應該遊戲循環直接調用渲染器並且鏈接回記錄器,但RenderAll方法從來沒有真正看到記錄器對象本身?

這一個。

+0

那麼Logger對象也缺少「_renderer = new Renderer()」?唯一的連接來自Renderer - > Rendered_Object,而不是以另一種方式返回? – CodexArcanum 2010-05-11 21:48:32

+0

正確。否則,首先將你的渲染器代碼分解成它自己的類是什麼意思? – 2010-05-11 21:49:31

0

這是我會怎麼做

class Logger { 
    List<Message> messages; 
    Message[] getMostRecent(int numMostRecent) { ... } 
} 

class MyGame { 
    void draw() { 
     // all my ui stuff 
     Message[] messagesToRender = myLogger.getMostRecent(numRowsInLogWindow); 
     String formattedMessages = magicalFormattingIfNecessary(messagesToRender); 
     logWindow.setText(formattedMessages); 
    } 
} 

物件分斷是好的,但對於一些簡單的像一個消息日誌,您會更好保持它的簡單和直接。我監督了數十款遊戲的開發,其中大部分問題都來自過分複雜的設計。

如果你想創建一個MessageFormatter對象,你可以這樣做,但前提是你需要適應多種格式。

注意:是的,我的僞代碼真的在Java中。根據需要適應=)

1

任何時候你有一個對象需要訪問另一個對象的內部,你應該考慮的代碼味道特徵嫉妒。不要這樣做。

如果你真的需要有一個LogRenderer,讓它只需一次渲染一條消息,讓你的日誌根據需要調用它。

E.g.日誌說「對於每個消息,renderer-> RenderMessage(消息)」。

這假定Log擁有LogRenderer。如果你有其他架構,那麼你可能需要稍微改動一些東西,但是儘量減少Feature Envy。