作者:龍飛
今天是元宵節,新年過去,又要開始抓緊時間奮斗了。祝大家都能繼續追逐自己的夢想。BS的書上引過一句話,“一個人要是不耕作,就必須寫作”,所以,不耕作的我不能停止寫作,time is money, my friend!
1.1:整理兩種SDL_Surface的關系。
前面一直在用面向過程的思想寫程序,因為OOP細分到每一個具體的方法,還是過程。OOP的難點其實在于理清楚不同類之間的關系。說實話,我只是為了自己的理想,為了實現我計劃的項目,剛剛開始學習C++的菜鳥。兩個多月的C++能有什么水平,希望前輩們不要見笑,我會繼續努力的。而且,可能因為對于C++的偏愛,再加上我目前能找到的SDL相關教程都是C風格的,所以我充滿了用C++來寫SDL教程挑戰的熱情。
SDL_Surface是SDL的一個結構。在我們前面的知識中,學習了構建這個結構的兩種方法:一種是通過SDL_SetVideoMode();一種是SDL_LoadBMP()。其實,通過SDL_SetVideoMode()構建的SDL_Surface是一種特殊的surface,因為,實際上,其他的surface都是通過blit到這個surface上,最終通過flip這個surface,才能顯示出來。所以,這個surface可以看成是SDL庫中,數據形式的surface(儲存在電腦中)與實體形式的surface(通過屏幕顯示出來)的唯一接口。另外,因為構建這兩種surface需要的數據成員小同大異,類方法也不盡相同。所以,雖然我也考慮過建立一個基類把兩種surface作為派生類,但是我最終選擇了建立兩個類。
1.2:構建SDL screen surface類。
class ScreenSurface
{
private:
static int screenNum;
int width;
int height;
int bpp;
Uint32 flags;
SDL_Surface* pScreen;
public:
ScreenSurface();
ScreenSurface(int w, int h, int b = 0, Uint32 f = 0);
~ScreenSurface();
SDL_Surface* point() const;
bool flip() const;
};
我先設定了一個靜態int作為計數器。我的考慮是,screen surface實際上只需要建立一個。并且,其他的surface實際上都是“依賴”于這個surface才能顯示出來的。在SDL中,多次SDL_SetVideoMode()的效果實際上是保留了最后一次的surface作為了screen surface,所以,多次SDL_SetVideoMode()其實是沒有實際意義的。計數器screenNum用于保證只創建一次screen surface,多次創建我傾向讓程序拋出異常。
構建函數除了調用SDL_SetVideoMode()函數,還作為SDL_Init()的啟動載入。所以,我專門定義析構函數的目的,是因為C++會在類對象消亡的時候自動調用析構函數。因為保證了只建立一個screen surface,并且在創建對象的時候載入了SDL_Init(),所以,如果析構函數中使用SDL_Quit(),則可以在手動調用析構函數或者程序結束的時候調用SDL_Quit()了。
方法point()返回對象中的pScreen,其實就是SDL_Surface結構的指針。因為SDL庫是C風格的,所以,直接使用指針的函數很多。
方法flip()用于把screen surface最終顯示出來。
1.3:screen surface的類方法。
int ScreenSurface::screenNum = 0;
首先為靜態變量附初值。
ScreenSurface::ScreenSurface():
width(640), height(480), bpp(32), flags(0)
{
if ( screenNum > 0 )
throw "DONOT create more than ONE screen!";
if ( SDL_Init(SDL_INIT_VIDEO < 0 ) )
throw SDL_GetError();
pScreen = SDL_SetVideoMode(width, height, bpp, flags);
screenNum++;
}
ScreenSurface::ScreenSurface(int w, int h, int b, Uint32 f):
width(w), height(h), bpp(b), flags(f)
{
if ( screenNum > 0 )
throw "DONOT create more than ONE screen!";
if ( SDL_Init(SDL_INIT_VIDEO < 0 ) )
throw SDL_GetError();
pScreen = SDL_SetVideoMode(width, height, bpp, flags);
screenNum++;
}
構造函數。如果創建1個以上的screen surface,則會拋出異常。
ScreenSurface::~ScreenSurface()
{
SDL_Quit();
}
析構函數。在對象消亡時,退出SDL系統。
SDL_Surface* ScreenSurface::point() const
{
return pScreen;
}
返回screen surface中SDL_Surface結構的指針,主要提供給SDL的函數調用。
bool ScreenSurface::flip() const
{
if ( SDL_Flip(pScreen) < 0 )
return false;
else return true;
}
顯示(彈出flip)screen surface到屏幕上。
posted on 2008-02-21 13:13
lf426 閱讀(6219)
評論(2) 編輯 收藏 引用 所屬分類:
SDL入門教程