在2D引擎圖底層進行圖形模組分析(轉)

post0發表於2007-08-12
在2D引擎圖底層進行圖形模組分析(轉)[@more@]

  想當年,當我開始研究DirectDraw的時候,網上的資料實在是太有限了,在那個沒有google的年代裡面找到適合自己的文章真的像是在撈針一樣.而當我找到了合適的資料,寫出了第一個控制圖片元素在螢幕上移動的時候,我不禁想到了這樣一個問題:如果遊戲中每一個元素都需要自己寫程式碼把BMP或者JPG檔案載入頁面,然後再手工BLT到主頁面上去,那麼把一個遊戲全部載入記憶體顯示出來就足夠把你累的半死了.

  

  而當我思考如何解決這個問題的時候,我已經沒有時間了,我不得不整理我的行裝到大學軍訓去了.不過這個問題一直遺留了下來.如何管理圖形資源才可以夠方便,而且可以把更多的心思放在遊戲設計上面.

  

  起初我想到的是一個功能複雜的圖片類,在需要使用圖片的時候生成一個然後載入圖片,並且在適當的時候渲染它自己.我本以為這個是一個不錯的方法,一直到寫LAZYMAN2.0的2D部分的時候,我不得不考慮這樣的問題,圖片的半透明效果怎麼辦?因為考慮到效率的原因,我必須先渲染沒有半透明效果的圖片,之後再渲染有半透明效果的圖片.而如果不這樣做,渲染的結果就有可能會出錯,而這點是絕對不允許的.

  

  唯一的辦法只有把圖片都統一集中管理,並且把圖片分類,半透明的和不透明的.維持一個顯示列表.這起初讓我覺得很麻煩,因為集中管理的結果就是讀取圖片必須透過這個管理的類(之後我將這個類稱為管理器).而設定圖片的屬性,比如在螢幕上的位置啊什麼的,也都必須透過管理器.而後來我發現這樣的結果是讓程式碼變的規範了,在寫程式碼的時候就考慮了結構上的一些問題,程式碼看起來好看了不少.

  

  2D圖片管理器實現了集中化管理,而使用控制程式碼作為外部對圖片的唯一標識,也使得看起來更像專業的程式碼.這裡的控制程式碼其實只是為了標識出全域性唯一一個圖片的作用,最簡單而有效的辦法是把管理器裡面的那個圖片元素的地址賦值給控制程式碼.

  

  以下的是OniEngine中的部分程式碼

  

  (我之後會拿OniEngine或者Lazyman做為例子,OniEngine只是我作為例子寫的,Lazyman是一個可以用的底層)

  

  class OniEngine2D

  {

  public:

  OniEngine2D();

  virtual ~OniEngine2D();

  

  // 初始化函式,引數列表裡面相關的引數省略了

  bool Init(...);

  // 外部呼叫的渲染迴圈

  bool Render();

  // 釋放所有資源

  bool Release();

  ......

  

  // 載入圖片

  HPIC LoadPicture(const char* file);

  // 設定圖片顯示位置

  bool SetPos(HPIC hPic, int x, int y);

  ......

  

  // 顯示圖片

  bool Show(HPIC hPic);

  // 隱藏圖片

  bool Hide(HPIC hPic);

  

  // 還有很多其他函式,不一一列舉了,看實際情況新增

  }

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-951976/,如需轉載,請註明出處,否則將追究法律責任。

相關文章