摘要:許多遊戲軟體的開發中,實現高速平滑的動畫需要許多比較深的技術,如:opengl、directx,並且可能還要開發人員有深厚的數學功底。但是,我們在開發一些小遊戲,或為應用程式的介面實現一些動畫效果,就可能不用以上這些技術了,我們更多的是用windows api提供或mfc封裝後的gdi繪圖函式來實現。為此我們可不可以用gdi來實現高速平滑的動畫呢?答案是肯定的。本文教您如何用gdi函式來開發平滑無閃的動畫,並以乙個應用例項來介紹這些用法。
gdi,mfc,bitmap,記憶體裝置環境
一、動畫原理。
我已採用此技術開發了一款紙牌遊戲:「撲克麻將」。讀者可到
二、實現方法。
其實本技術也很簡單,其關鍵就是在記憶體中建立乙個與顯示動畫的視窗區域一樣大的點陣圖,先用gdi函式繪製位圖,然後在適當的時候從記憶體中顯示出來。因為位圖已經繪製好,不象平時程式設計一樣邊繪製邊顯示,所以,顯示一幀圖形時,減速少了閃爍,從而實現平滑動畫;並且,圖形是從記憶體中直接顯示到當前窗體,所以速度也很快,從而實現高速動畫。下面我們將介紹實現這些技術的步驟:
1、啟動vc++,建立乙個mfc支援的單文件應用程式。
2、選擇選單項inert/new class建立乙個從cbitmap類繼承的類,取名為:cmembitmap。我們建立了乙個點陣圖類來模仿電影中的一幀畫面,作為將要顯示在視窗區域(電影螢幕)的影象。今後,所有的繪圖操作都針對這個點陣圖類進行,而這些繪圖操作,我們可以用成員函式來實現,比如:顯示乙個位圖、一段文字及gdi函式中所有的繪圖函式。
3、建立好位圖類後,為了同窗體聯絡起來,用窗體的cdc記憶體裝置環境指標建立該位圖與窗體的客戶區一樣大。為此在位圖類標頭檔案membitmap.h可宣告乙個cwnd指標成員變數:m_pwnd,用以指向窗體,如下**所示:
private: cwnd* m_pwnd;
再宣告乙個成員函式來建立位圖,其宣告**如下所示:
public:
void init(cwnd* pwnd);
在membitmap.cpp中實現**如下:
void cmembitmap::init(cwnd *pwnd)
createcompatiblebitmap函式作用是初始化點陣圖類,其原型如下:
boolcreatecompatiblebitmap(cdc*pdc,intnwidth,intnheight);
pdc是裝置環境指標,本例用窗體的裝置環境指標。nwidth和nheight是指定該位圖尺寸的高度與寬度,單位為象素。
4、新增成員函式完成繪圖功能。為了能在動畫中顯示文字資訊,我們新增乙個成員變更來顯示文字資訊。其原型的**如下:
檔案中
void cmembitmap::textout(int x, int y, int isize, lpcstr strtext, colorref color)
textout函式用於在指定位置用指定的大小,顏色顯示文字。引數x,y分別是顯示文字的位置,isize指定文字字型的大小,color指定文字的顏色,strtext指定要顯示的內容。從以上**中,用乙個記憶體裝置環境dcmem來顯示文字:首先從窗體裝置環境建立,再選擇該位圖類,之後,即可用cdc類的繪圖函式進行繪圖了。同樣,讀者可、以用該記憶體裝置環境變數dcmem來繪製乙個位圖(從檔案或資源來的)、畫直線等所有gdi函式的操作,而我們新增函式功能在於將這些gdi函式進行封裝,以便呼叫方便,這也是物件導向程式設計的思想。
5、我們再實現乙個清位圖函式,以便在適當時候用指定的顏色將位圖填充,達到清圖的效果,其**如下:
//清除點陣圖的乙個區
void cmembitmap::clear(int x1, int y1, int x2, int y2, colorref color)
引數x1,y1,x2,y2指定了矩形區的尺寸,color指定了填充色。其實現方法與4中所述一樣,在此不必多介紹。
6、新增了繪圖函式,下面再介紹如何使用cmembitmap類,來實現動畫效果:
首先,我們在檢視類(也可以是其它視窗類)中宣告乙個cmembitmap成員變數m_membitmap,**如下:
private:
cmembitmap m_membitmap;
然後,我們過載cview類函式oninitialupdate(),直接在標頭檔案中新增void oninitialupdate();以便檢視初始化結束後初始化位圖物件,並且檢視指標傳遞過去,其實現**如下:
void cmyview::oninitialupdate()
在函式最後,啟動了乙個定時器, 我們將用定時來實現動畫功能。
接著,我們過載定時器訊息函式ontimer實現動畫功能。其實現**如下:
// cmyview 訊息處理程式 void cmyview::ontimer(uint nidevent)
讀者可根據注釋理解**的含義,需要說明的是:在記憶體中繪製點陣圖時,本例採用了乙個靜態顯示文字和乙個隨機動態顯示的文本來比較,從運**況可以看出動態顯示的文字0.1秒就隨機移動一次位置,雖然每次繪製點陣圖都使用clear函式清屏,但靜態文字的顯示沒有一點閃動,動畫非常平滑,速度也很快。
怎麼樣,很簡單吧?如果您再建立乙個執行緒後台繪製圖形,將會實現很多特殊效果的動畫來,我們可以將這項技術用在使用者介面上或其他地方,將會收到意想不到的動畫效果。
三、結束語
通過以例子,用gdi函式實現高速平滑的動畫也很簡單。我們可以新增繪製位圖,畫線、畫矩形等成員函式,便能實現各種gdi繪圖函式的操作,如果讀者還有興趣,可以在顯示位圖,作優化顯示,如:不是將位圖全部顯示出來,而是顯示其中動畫的一部分,因為bitblt函式作位傳輸很慢。我開發的紙牌遊戲「撲克麻將」就經過優化,其動畫速很快
VC中用GDI函式實規高速平滑動畫
摘要 許多遊戲軟體的開發中,實現高速平滑的動畫需要許多比較深的技術,如 opengl directx 並且可能還要開發人員有深厚的數學功底。但是,我們在開發一些小遊戲,或為應用程式的介面實現一些動畫效果,就可能不用以上這些技術了,我們更多的是用 windows api 提供或mfc 封裝後的 gdi...
在VC中用GDI 繪製角度可變的顏色漸變效果
gdi 是gdi windows 早期版本提供的圖形裝置介面 的後續版本,是microsoft windows xp作系統即後續版本的圖形顯示技術。它已經整合到了.net開發環境中,所以不管你的os是什麼版本,只要安裝了.net框架,就有了gdi 注意 是.net框架,而不是.net開發環境,所以w...
在VC中用GDI 繪製角度可變的顏色漸變效果
gdi 是gdi windows 早期版本提供的圖形裝置介面 的後續版本,是microsoft windows xp作系統即後續版本的圖形顯示技術。它已經整合到了.net開發環境中,所以不管你的os是什麼版本,只要安裝了.net框架,就有了gdi 注意 是.net框架,而不是.net開發環境,所以w...