2012-06-08 113 views
0

我想弄清楚如何爲我的遊戲設置一種通用遊戲元素類。我想嘗試,創造類似於太..AS3遊戲元素結構

GameElementPositionMovement(根類)的結構 - > GameElementVisual(處理所有的圖形) - > GameElementPersonality(處理遊戲邏輯)

我當時想只需創建一個GameElementPersonality的實例即可建立不同的人物(怪物,英雄,圖標等),但在其構造函數中也可以設置視覺和定位/移動方面。

我在另外一個問題提到了這一點,這回來就是答案......

看來你需要一種「數據模型」類來存儲邏輯和 視覺(「視圖」 )類。 Visual類不應該繼承數據模型,它應該使用它。這是OOP相關的問題:爲VS HAS(繼承 VS組成)

但我不知道如果我理解這一點。沒有任何視覺數據的位置/移動似乎是一個很好的第一根類,然後你添加視覺方面(GameElementVisual),然後最後添加個性「特徵」(GameElementPersonality),如護甲,傷害,健康等因此,我保持着定位/運動,視覺和邏輯的分離,並且我推測,我已經制定出的這種流感是最好的方法,但這不是一個好的方法來做到這一點?它應該更平坦嗎?與GameElementPositionMovement,創建一個視覺和邏輯實例,並存儲它本身?

回答

0

是的,MVC的想法是保持事物的解耦,在你的情況下,你最終將所有東西都砸成一個繼承鏈,最終會有一種類型的對象繼承繼承的另一個對象的所有屬性來自另一個對象的所有屬性,所以你將擁有一個代表所有事物的實例,這就是爲什麼這不是一個好的模式。

如果你有一個GameElementPositionMovement類(你的主類)創建一個GameElementVisual的實例並且在GameElementPersonality的實例中(或者需要多個實例)。然後,任何時候在GameElementPersonality中(或者如果您選擇創建集合時在集合中的任何屬性)對屬性進行更改都可以派發事件,則主類GameElementPositionMovement可以監聽派發事件,並在派生事件發生時可以設置/傳遞GameElementPersonality實例或數組添加到GameElementVisual。然後在GameElementVisual中,您只需要始終處理基於當前模型的繪圖,模型與視圖邏輯分離,您可能還想在單獨的類或GameElementPositionMovement中處理控制。 (控制是對模型的修改,在這種情況下,它可能也是註冊用戶事件,鍵盤,鼠標的監聽器的地方)

這樣模型保持清潔的控制邏輯和視圖邏輯,這是一個清晰的什麼地方和什麼地方分離視圖類型取決於模型和控制器類型取決於視圖,但如果爲模型視圖控制器每個需要以這種方式相互通信建立接口,則可以交換任何具有實現接口的新類的部分(不是小遊戲中的問題,但是設計適合於這種能力並因此具有未來的可擴展性)。

2

您可以創建類似這樣的結構:

(僞)
elementData中

//it doesn't have to extend any particular class 
//however it would be nice if it could dispatch events and register listeners 
class ElementData implements IEventDispatcher 
{ 
    public function ElementData() //constructor 
    { 
     //do some stuff 
    } 

    public function setSomeProperty(value:int):void 
    { 
     // 
    } 

    public function doSomeCrazyStuff():void 
    { 
     // 
    } 
} 

ElementVisual

class ElementVisual extends MovieClip //or just Sprite or even DiplayObjectContainer 
{ 
    public function ElementVisual(elementData) 
    { 
     //constructor takes an instance of ElementData class 

     elementData.addEventListener(CHANGE, onDataChange) 

     elementData.doSomeCrazyStuff(); 
     if (userCliked) 
     { 
      elementData.setSomeProperty(15); 
     } 

     //you can have here some interactions with user (keyboard, mouse) 
     //then it can communicate with elenemtData and 'listen' what it says. 
    } 

    function onDataChange 
    { 
     //react accordingly 
    } 
} 

一些視覺表現(您可能需要很多這樣的)

class Monster extends ElementVisual 
{ 
    //do all the graphic, animations etc 
} 

然後,你需要一個類來設置所有的數據,視覺效果等...在最簡單的實現中,它可以是「文檔類」。

這不是一個合適的MVC模型 - 它是一個簡單的例子來展示解耦邏輯與可視化的概念。

MVC是不是唯一的解決方案,還有其他所謂的「設計模式」,這可能是有用的...

+0

與例子,都非常好,我喜歡比我自己的答案:)更好。也完全同意其他選項可用,但這是一個很好的開始,它不是隻選擇一種情況。我搜索谷歌和維基百科的設計模式是好的,但我更喜歡圖表,他們似乎缺乏,圖像搜索工作得很好http://tinyurl.com/d4l7qkj < - MVC http://tinyurl.com/bqtbs23 < - 軟件設計模式。顯然寫得很好。另外,同意思考當你使用模式時,如果事情穩定後,你需要優化思考。 – shaunhusain

+0

感謝所有的答案。我會研究所說的內容,儘管我從來沒有真正使用過一個類的監聽器來與另一個類進行通信,但似乎不需要額外的工作,當你可以調用一個實例到另一個實例的方法時,我想知道你是否有很多如果這會減緩遊戲速度,這些情況會持續下去。 話雖如此,我目前還在學習obj-c,所以我試圖以我可以在obj-c中設置相同結構的方式設置AS3代碼。 – Phil

+0

事件調度程序模式非常有用。在上面的例子中,它允許數據模型與其可視表示完全分離。數據類不需要知道有一個可視化表示,它只是在事件發生時分派事件。如果模式被正確應用,那麼與直接進行通信的類相比,代碼是**少**複雜。 – strah