2012-07-20 80 views
0

我使用DirectX在C++中製作了一個圖形化簡單的3D遊戲。我遇到的主要問題是如何有效地構建一些事情。現在我知道我的某些領域的目標,但不知道如何理想地執行它們。遊戲:一般結構和遊戲項目結構

例如,現在我將所有網格和紋理存儲在Asset類中,枚舉定義指向每個資源。所有網格和紋理都是在遊戲開始時通過創建一個Asset對象並初始化它來加載的。從那裏我通過分配由Asset對象給出的指針將網格和紋理加載到對象。這是最好的方式去做這件事嗎?

難題是題目。爲了辯論的緣故,我要說我們正在處理風景。現在我的風景需要如下:

  • 的名稱
  • 網狀
  • 紋理(可選)
  • 標誌(如可破壞的,易燃等)
  • 狀態(如燃燒,鎖定,詛咒等)
  • 能力(事物的對象實際上呢,比如燃燒時被損壞)

此列表中的前5項僅僅是變量。但是能力打擾了我。前5個可以全部存在於一個項目類別中。但是我不知道該怎麼做才能以某種方式將物體附加到物體上。

例如;我希望物體具有「火焰新星」的能力。在每回合開始時,物體會對附近的任何物體造成傷害。對於我來說,這意味着每個對象都需要一個「Trigger_Phase_TurnStart()」或者一些類似命名的方法,然後需要一個新的「火焰新星」類以及它自己的唯一動作來觸發這個觸發器和它自己的額外變量(Damage ,範圍等)。所以現在我有了基礎對象類和一個繼承自它的新的Fire Nova類。

但是現在如果我需要一個具有火焰新星和冰霜新星以及減速光環和其他類似技能的物體。基本上我需要一種方法來將觸發的效果添加到對象,而不需要每個對象的新對象類。所以

最後我將能夠有發言權:

(pseudo code of the object's components) 
name = Elemental Orb 
mesh = "Mesh_Sphere" 
textures[] = "Tex_Ice", "Tex_Fire" 
flags = OF_Destructible 
status = SF_Cursed | SF_Burning 
abilities[] = Fire_Nova, Frost_Nova, Slowing_Aura 

而這個天體將僅僅是對象類所有這些屬性。對象然後會在適當的轉向階段激活每個存儲的異能觸發器,以執行任何動作。

現在我想我可能需要爲擁有每個轉身階段或行動觸發器(從基本能力類繼承)的每個技能製作一個類,讓他們在對象從數組中調用它們時執行適當的操作的能力。這是做這件事的最好方法嗎?

作爲一個單獨的問題。一些標誌將需要額外的變量,否則將是不必要的。例如,可破壞將意味着對象將具有健康性,而沒有該標誌則不需要它,或者可打開項目將需要一組內容。在需要時將這些變量分配給什麼是一個好方法?例如,我不需要每個牆都有健康和空的內容數組。

最後。假設上面列出的項目屬性都是項目需求,那麼您如何建議我最好地存儲它們?爲了澄清,我希望能夠寫出:

CreateItem(ITEM_CHAIR); 

並有此返回與名稱,網格,紋理,標誌,狀態和能力創建的對象。什麼樣的結構可能適合達到這樣的最終效果?

總結:

  1. 難道我目前的資產存儲似乎是可行的?
  2. 什麼是最好的方式來創建附加到對象類的能力,而無需製作大量單獨的對象類?
  3. 當關聯標誌不存在時,是否有辦法限制變量(或至少是內存使用情況)?
  4. 哪種結構或格式最適合存儲固定項目定義?

對不起,如果這是一個有點長的囉嗦。如果你不能回答所有的問題,那麼答案仍然值得讚賞。問題二現在可能是我的最大優先事項。

感謝您的時間:)

回答

0

我只想回答問題2,它看起來像你需要一個裝飾圖案。在OOP中,裝飾者模式很有用,當你有很多成分並且想要裝飾一個物體時,比如披薩。不幸的是,您需要爲每種成分創建一個單獨的課程,因此我認爲您有正確的方法。好的一點是,使用decorator模式,你可以用abilites類重複包裝對象,並在最後調用一個方法來完成所有的工作。

+0

這當然看起來像我之後。儘管從一些例子來看,它們中的大多數似乎要求裝飾器存儲初始對象而不是存儲裝飾器的對象。理想情況下,我希望獲得一系列我可以訪問他們和他們的能力的項目。這是可能的裝飾者,或者我需要創建一個新的特定的物品每次我添加一個能力? 這是我正在看[裝飾器示例]的示例(http://advancedcppwithexamples.blogspot.co.uk/2010/09/c-example-for-decorator-design-pattern.html) – user1539405 2012-07-20 02:23:00

+0

我沒有認爲這是可能的。裝飾者就像一個包裝類,你像洋蔥一樣重複包裹你的物體。 – Bytemain 2012-07-20 02:30:01

+0

啊,我主要問,因爲我的主要擔心是我不確定如何使用此方法來添加多個裝飾器,我不確定如何添加這些裝飾器,同時仍然能夠使用單個對象數組列表來訪問我的遊戲組件。 – user1539405 2012-07-20 02:32:24