追蹤
兔子也會的遊戲設計
關於部落格
一個推廣XNA與OGRE的園地,當然還有其他關於遊戲設計的主題,歡迎有興趣的同好交流指教
  • 104845

    累積人氣

  • 0

    今日人氣

    0

    追蹤人氣

包裝者模式

借用此網頁的程式碼:

假設現在有一個類別叫做Thing

class Thing 

          private string m_string; 
          public string ThingString
         
                    get { return m_string; } 
                    set { m_string = value; } 
           

          public void PrintThingString() 
         
                    Console.WriteLine(m_string); 
         
}

但假設現在不能用Thing這個類別了,我用另一個類別包起來:

class ThingWrapper 
{       
          private Thing m_thing; 
          public ThingWrapper(Thing pThing) 
        
                    m_thing = pThing; 
         
          public string ThingString 
         
                    get { return m_thing.ThingString; } 
                    set { m_thing.ThingString = value; } 
         
          public void PrintThingString() 
            
        
          m_thing.PrintThingString(); 
         
}
從程式碼可以很清楚了解到骨子裡還是用到Thing這個類別。


或許很多人還是不了解什麼情況下會有這種需求,現在我們談到要在.Net上使用OGRE,就會了解為什麼需要用到包裝者模式。我們都知道OGRE是C++編寫而成,.Net平台上不能直接使用原生的C++程式碼,所以勢必要透過一層包裝介面來達成我們的需求。當然在.Net平台上使用原成程式有許多方法,例如pInvoke、SWIG自動解譯、COM物件等,但我現在要介紹的是透過C++/CLI的方式來實現。C++/CLI是.Net上的一種類似C++語言,但他可以使用記憶體託管,也就是gcnew的方式讓垃圾回收器自動幫你回收記憶體,並且可以使用.Net的函式庫,當然也可以使用C++的STL等函式庫,最重要的是可以連結C++原生動態鏈結檔,這就給了我們一個機會可以透過C++/CLI來使用OGRE的函式庫,換句話說,我今天用C++/CLI來包裝OGRE函式庫,並將此介面編譯成managed dll,不就可以給.Net上的所有語言使用了嗎?


介紹到這裡,讀者應該對包裝有個概念,那要從哪邊開始呢?這裡有一個書的附錄,有簡介C++/CLI的用法以及基本的包裝方法,讀者看過之後應該會有個概念,接下來就是實做的部分,還記得上次介紹的ETM地形工具嗎?MOGRE社群其實有一個包裝好的版本叫做MET,建議初學者可以透過此包裝來了解基本的運作模式,只要下載ETM跟MET來比對,就可以知道如何包裝,因為ETM並不複雜,所以閱讀起來容易上手。


要記得一個原則,只包裝使用者會用到的部分就好,也就是說他內部的類別是可以以不用包裝的,不然包下去可是會累死人,一般而言,只要它寫得非常物件化,我們就只要包裝標頭檔部分就好,實作根本不用理會,等完全了解基本的包裝方式之後,讀者再去看MOGRE這種包裝整個OGRE的專案,觀念上不會差太多,只是複雜度增加不少,有些部分可以簡化不用完全依樣化葫蘆的包裝。


透過C++/CLI包裝類別有個好處,未來即使原生專案升級,只要給使用者的介面沒什麼變動,就可以很輕易的作修改,甚至他如果只是改內部實作或修一些bug,我們可以連改都不用改,節省人力。目前MOGRE很活躍,但還有很多好東西沒有包裝起來,如果以上所講的東西對你有幫助,說不定可以包裝一下其它好用的Addons,替MOGRE社群貢獻一份心力,相信對社群發展是很有益處的。

最後GameDev有一篇文章介紹類似的東西,有興趣的人可以參考一下。




 

 

 

 

相簿設定
標籤設定
相簿狀態