2009-08-26 108 views
5

我剛剛閱讀了一些當我輸入主題時出現的相關問題,所以我會盡量不要重複這些問題。C++遊戲,課堂設計和責任

我最近開始重新研究一個大約兩三年前開始的學習項目 - 一個Mega Man引擎的C++端口。是的,我使用了撕裂的精靈。我也正在使用一個遊戲引擎庫進行繪圖,音樂和輸入。

我原來的代碼非常殘酷。儘管它可以(但幾乎)被稱爲面向對象,但它完全錯過了這一點。我已經開始添加諸如接口之類的東西,並且刪除了很多重複的代碼。有些事情我不確定,因爲有時遊戲設計變得非常複雜。

代表我的遊戲庫的對象目前是全局的(我知道全局變量通常是不好的),因爲許多對象可能會依賴它來加載它們的藝術或音樂。將對象拉出全局範圍的最佳方式是什麼,而不必將五十個參數傳遞給一切直接使用它的東西?

下一個問題:衆所周知,洛克人射出許多小白色射彈。目前,Player對象負責他發射的子彈對象,更新它們的位置等等(字面上,在Player :: Update()方法內,每次擊球時都調用一次Projectile :: Update()方法)。這是做錯了嗎?我的第一個改進是所有這些對象都實現了一個DrawnObject接口,這樣我的遊戲就可以繪製一切。爲更新做同樣的事情意味着我可以控制遠離玩家的投射物並將其投放到更廣泛的遊戲對象。我對此猶豫不決的原因是感覺上帝反對反模式。或者我誤解了這個反模式?還有額外的複雜性 - 拋射物如果離開可見屏幕就會死亡,所以任何更新炮彈的調用都需要調用者訪問屏幕對象。

這就是現在,當我到達他們時我會回來更多的問題。第一篇文章結束!

回答

7

就製作全局類而言,我會使用一個單例,然後調用Game :: GetInstance(),它將返回一個指向全局類的指針。

就粒子而言,我一直處理遊戲的方式是創建一個管理所有對象的類。在我的遊戲主循環中,我會調用該類的UpdateObjects函數,它會通過它存儲的項目列表並調用每個Update函數。與渲染和碰撞一樣的東西。

2

我過去曾經玩過遊戲設計,但我不能聲稱自己是專家。

對於全局訪問一個對象,我建議使用一個singleton

於移動物體,我建議使一切能夠理解的屏幕位置,並且具有更新方法的父類。無論何時創建新對象,都將其添加到包含所有對象的矢量中,每幀一次,您將遍歷矢量並在所有對象上運行更新。

2

代表我的遊戲 庫中的對象是目前全球(我知道 全局通常是不好的),因爲許多 對象可能對於像裝載他們的藝術或音樂 這裏依靠它有 。 將全局 範圍內的對象拉出的最佳方式是什麼,而不必將50個參數設置爲 直接使用 ?

我同意上述的單身解決方案。

下一個問題:我們都知道,兆豐 人拍攝大量的白色小 彈。目前,玩家 對象負責,他將觸發 彈對象,更新 自己的位置,這樣(從字面上看, 調用炮彈::更新() 方法每進行一次投籃不中, 球員::更新中()方法)。

代碼構建有一個敏捷的設計原則:「單一職責原則」。據它說:「對於 等級改變,絕不應該超過一個原因。」所以我想我會先把Player類的職責分開來分類:一個用於定位,另一個用於射擊。

看到一個例子,更多關於這個問題SRP

+0

誰寫了SRP文章?我一直在努力尋找那本書,因爲它是我真正關心的主題,你能指出我的意思嗎? – Goles 2009-09-21 01:11:22

+0

我在閱讀「敏捷軟件開發:原則,模式和實踐」一書時第一次遇到這個詞。由羅伯特C.馬丁(2002年)。 Martin是Object Mentor(發佈文章的網站)的創始人和總裁。 – Harry 2009-09-22 17:16:03