青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 96  文章 - 255  trackbacks - 0
<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

E-mail:zbln426@163.com QQ:85132383 長(zhǎng)期尋找對(duì)戰(zhàn)略游戲感興趣的合作伙伴。

常用鏈接

留言簿(21)

隨筆分類

隨筆檔案

SDL相關(guān)網(wǎng)站

我的個(gè)人網(wǎng)頁(yè)

我的小游戲

資源下載

搜索

  •  

積分與排名

  • 積分 - 495656
  • 排名 - 39

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

作者:龍飛

        最近幾篇教程基本上都是參考著Lazy Foo的教程順序來的。因?yàn)槲乙灿X得他的順序很實(shí)用。所不同的是,新的類型我都添加在了之前建立起來的surface類的基礎(chǔ)之上。所以,如果你覺得單獨(dú)看這些教程完全搞不明白,最好從頭按照順序來學(xué)習(xí)。另外,為了復(fù)習(xí)C++知識(shí),也為了遵循C++的理念,我有意的將程序風(fēng)格向C++靠攏。如果你更喜歡C風(fēng)格,相信你在其他地方可以找到更適合你的教程。

1.1:一個(gè)小細(xì)節(jié),SDL窗口的名稱

        因?yàn)樯婕暗轿谋镜娘@示了,我們提一個(gè)一直以來忽略的問題——SDL建立起來的窗口的名字。因?yàn)槲覀兯⑵饋淼腟creen Surface是唯一和特殊的。所以窗口名字這個(gè)行為是可以綁定在這個(gè)唯一的Screen Surface對(duì)象上的。SDL中的相關(guān)函數(shù)是:
void SDL_WM_SetCaption(const char *title, const char *icon);
        一般icon還暫時(shí)用不上,我們?cè)O(shè)置為空指針。我們修改一下Screen Surface的數(shù)據(jù)成員與構(gòu)造函數(shù)。在數(shù)據(jù)成員里面添加一個(gè)windowName,并且修改構(gòu)造函數(shù)
class ScreenSurface
{
private:
    
//
    char* windowName;
public:
   //
   ScreenSurface(int w, int h, char* window_name = 0, int b = 0, Uint32 f = 0); 
};

ScreenSurface::ScreenSurface():
width(
640), height(480), bpp(32), flags(0), windowName(0)
{
    
if ( screenNum > 0 )
        
throw ErrorInfo("DONOT create more than ONE screen!");
    
if ( SDL_Init(SDL_INIT_VIDEO < 0 ) )
        
throw ErrorInfo(SDL_GetError());
    pScreen 
= SDL_SetVideoMode(width, height, bpp, flags);
    screenNum
++;
}

ScreenSurface::ScreenSurface(
int w, int h, char* window_name, int b, Uint32 f):
width(w), height(h), bpp(b), flags(f)
{
    
if ( screenNum > 0 )
        
throw ErrorInfo("DONOT create more than ONE screen!");
    
if ( SDL_Init(SDL_INIT_VIDEO < 0 ) )
        
throw ErrorInfo(SDL_GetError());
    pScreen 
= SDL_SetVideoMode(width, height, bpp, flags);
    screenNum
++;
    
if ( window_name != 0 ) {
        windowName 
= window_name;
        SDL_WM_SetCaption(windowName, 
0);
    }
    
else
        windowName 
= 0;
}

這樣,我們?cè)趧?chuàng)建SceenSurface的時(shí)候,第三個(gè)參數(shù)如果指定,則可以用字符串表示窗口名稱。

1.2:使用*.ttf文件

        SDL使用*.ttf文件,仍然需要擴(kuò)展庫(kù)的支持。相關(guān)的下載和SDL_image的類似,大家可以參考前面的教程。下載地址如下:
http://www.libsdl.org/projects/SDL_ttf/
        使用ttf擴(kuò)展庫(kù)的程序如下:
(1)裝載擴(kuò)展庫(kù):TTF_Init();
(2)打開字庫(kù):TTF_OpenFont(const char* ttf_fileName, int ttf_size);
(3)構(gòu)建顯示文本的surface:TTF_RenderText_Solid(TTF_Font* pFont, const char* message, SDL_Color textColor);
(4)顯示(blit)文本surface;
(5)關(guān)閉字庫(kù):TTF_CloseFont();
(6)退出擴(kuò)展庫(kù):TTF_Quit();
(7)釋放顯示文本的surface:SDL_FreeSurface();
        我們考慮下這個(gè)TextSurface與之前的DisplaySurface之間的關(guān)系,希望通過類將二者有所聯(lián)系。

1.3:構(gòu)建TextSurface類

        我們分析下TextSurface與DisplaySurface的關(guān)系:他們都依賴于一個(gè)ScreenSurface對(duì)象,至少具有兩個(gè)一樣的私有數(shù)據(jù)成員pSurface和pScreen;他們有一致的行為blit();他們的構(gòu)造前提條件不同,析構(gòu)做的“善后”也不一樣。
        我在水木社區(qū)的CPP版請(qǐng)教有這樣關(guān)系的兩個(gè)類應(yīng)該是什么關(guān)系。有前輩指教說,一個(gè)類,用不同的flag加以區(qū)分。而我并不愿意多增加一個(gè)構(gòu)造函數(shù)的參數(shù),所以,我用構(gòu)造函數(shù)的重載實(shí)現(xiàn)構(gòu)造的不同;用繼承類實(shí)現(xiàn)方法代碼的重用;用繼承類的析構(gòu)函數(shù)為TextSurface類做額外的析構(gòu)工作。
        考慮到應(yīng)在第一次建立TextSurface對(duì)象的時(shí)候裝載ttf擴(kuò)展庫(kù),并在最后一個(gè)對(duì)象使用完畢后關(guān)閉ttf擴(kuò)展庫(kù),所以,在基類DisplaySurface中添加靜態(tài)私有成員作為計(jì)數(shù)器,并添加相應(yīng)的方法為派生類使用。這些方法,以及專門為派生類創(chuàng)建的基類構(gòu)造函數(shù),我們并不希望能被外部使用,所以,使用了關(guān)鍵字proteced。

class DisplaySurface
{
private:
    
//
    
//for TextSurafce
    static int textNum;
    TTF_Font
* pFont;
public:
    
//
protected:
    
//for TextSurface
    DisplaySurface(const std::string& msg_name, const std::string& message, const ScreenSurface& screen,
                    Uint8 r, Uint8 g, Uint8 b, 
                    
const std::string& ttf_fileName, int ttf_size);
    
int tellTextNum() const;
    
void reduceTextNum();
    
void deleteFontPoint();
};
pFont是TextSurface會(huì)用到的私有數(shù)據(jù),構(gòu)造基類的時(shí)候,直接設(shè)置成空指針就可以了。
保護(hù)成員的實(shí)現(xiàn)如下:
//for TextSurface
DisplaySurface::DisplaySurface(const std::string& msg_name, const std::string& message, const ScreenSurface& screen,
                    Uint8 r, Uint8 g , Uint8 b, 
                    
const std::string& ttf_fileName, int ttf_size):
fileName(msg_name)
{
    
if ( textNum == 0 )
        
if ( TTF_Init() < 0 )
            
throw ErrorInfo("TTF_Init() failed!");
    
    SDL_Color textColor;
    textColor.r 
= r;
    textColor.g 
= g;
    textColor.b 
= b;

    pFont 
= TTF_OpenFont(ttf_fileName.c_str(), ttf_size);
    
if ( pFont == 0 )
        
throw ErrorInfo("TTF_OpenFont() failed!");

    pSurface 
= TTF_RenderText_Solid(pFont, message.c_str(), textColor);
    
if ( pSurface == 0 )
        
throw ErrorInfo("TTF_RenderText_solid() failed!");
    pScreen 
= screen.point();

    textNum
++;
}

int DisplaySurface::tellTextNum() const
{
    
return textNum;
}

void DisplaySurface::reduceTextNum()
{
    textNum
--;
}

void DisplaySurface::deleteFontPoint()
{
    TTF_CloseFont(pFont);
}
有了這些數(shù)據(jù)成員和方法,我們可以構(gòu)建TextSurface類了。
class TextSurface: public DisplaySurface
{
public:
    TextSurface(
const std::string& msg_name, const std::string& message, const ScreenSurface& screen,
                    Uint8 r 
= 0xFF, Uint8 g = 0xFF, Uint8 b = 0xFF
                    
const std::string& ttf_fileName = "lazy.ttf"int ttf_size = 28);
    
~TextSurface();
};
可以看到,我們僅僅增添了派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù),實(shí)現(xiàn)如下:
//class TextSurface

TextSurface::TextSurface(
const std::string& msg_name, const std::string& message, const ScreenSurface& screen,
                    Uint8 r, Uint8 g, Uint8 b, 
                    
const std::string& ttf_fileName, int ttf_size):
DisplaySurface(msg_name, message, screen, r, g, b, ttf_fileName, ttf_size)
{}

TextSurface::
~TextSurface()
{
    deleteFontPoint();
    reduceTextNum();
    
if ( tellTextNum() == 0 )
        TTF_Quit();
}
我們?cè)谙鹿?jié)給出完整的代碼以及一個(gè)用于演示的例子。
posted on 2008-03-24 20:22 lf426 閱讀(4018) 評(píng)論(0)  編輯 收藏 引用 所屬分類: SDL入門教程
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产日韩综合一区| 久久精品欧美日韩精品| 狠狠色丁香久久婷婷综合丁香| 亚洲国产精品成人| 国产综合久久久久久鬼色| 亚洲精品免费在线播放| 国产有码一区二区| 亚洲欧美国内爽妇网| 亚洲精品一区二区三| 久久久久一本一区二区青青蜜月| 亚洲一区二区在线看| 欧美激情第二页| 欧美mv日韩mv国产网站app| 国产精品国产成人国产三级| 亚洲区免费影片| 亚洲国产欧美国产综合一区 | 久久精品99国产精品| 欧美日韩精品免费观看视频完整| 欧美成年人视频| 加勒比av一区二区| 欧美一区二区视频观看视频| 午夜欧美不卡精品aaaaa| 欧美日本在线看| 亚洲欧洲精品一区二区三区波多野1战4| 狠狠色狠狠色综合人人| 午夜免费电影一区在线观看| 亚洲欧美日韩精品久久久久| 国产精品国产三级国产专区53| 99re热这里只有精品免费视频| 99亚洲一区二区| 欧美日韩成人一区二区| 亚洲精选91| 亚洲视频碰碰| 欧美性一区二区| 亚洲一区视频在线观看视频| 午夜精品久久99蜜桃的功能介绍| 国产精品乱码人人做人人爱| 亚洲午夜女主播在线直播| 午夜精品久久久久久久久久久久| 国产精品视频观看| 午夜精品视频在线| 每日更新成人在线视频| 亚洲国产网站| 欧美日韩精品伦理作品在线免费观看| 99视频精品全国免费| 亚洲欧美成aⅴ人在线观看| 国产精品一区二区三区成人| 久久xxxx| 亚洲丰满少妇videoshd| 亚洲视屏在线播放| 国产三级精品在线不卡| 久久综合中文字幕| 亚洲免费观看高清完整版在线观看熊| 亚洲女人小视频在线观看| 国产精品自拍网站| 蜜臀99久久精品久久久久久软件| 亚洲高清视频一区| 亚洲综合日本| 亚洲国产成人在线| 欧美小视频在线观看| 欧美一级黄色网| 免费在线观看日韩欧美| 中日韩午夜理伦电影免费| 国产婷婷成人久久av免费高清 | 亚洲色图综合久久| 久久久欧美一区二区| 亚洲剧情一区二区| 国产午夜精品一区二区三区欧美 | 欧美日韩视频在线一区二区观看视频| 亚洲午夜91| 欧美大片免费观看在线观看网站推荐| 一本到12不卡视频在线dvd| 国产欧美日韩综合| 欧美久久成人| 久久九九久久九九| 亚洲婷婷综合久久一本伊一区| 久久综合99re88久久爱| 亚洲欧美精品在线观看| 91久久亚洲| 国产亚洲激情在线| 欧美午夜精品久久久久免费视| 久久久欧美一区二区| 中文在线资源观看网站视频免费不卡 | 亚洲欧美国产视频| 91久久午夜| 美玉足脚交一区二区三区图片| 午夜精品免费在线| 一本久道综合久久精品| 伊大人香蕉综合8在线视| 国产精品一区二区在线| 欧美日韩小视频| 欧美国产免费| 久久阴道视频| 久久国产综合精品| 亚洲欧美一级二级三级| 中文av一区特黄| 99re6热在线精品视频播放速度| 欧美激情一区三区| 老色鬼久久亚洲一区二区| 欧美伊人精品成人久久综合97| 在线一区亚洲| 一本久久青青| 一本色道**综合亚洲精品蜜桃冫 | 欧美午夜免费影院| 欧美日韩成人在线观看| 欧美黄色免费网站| 免费不卡视频| 蜜臀久久久99精品久久久久久| 久久久精品动漫| 久久se精品一区二区| 欧美专区一区二区三区| 香蕉久久夜色| 欧美在线免费观看亚洲| 欧美在线啊v一区| 欧美在线亚洲一区| 欧美综合77777色婷婷| 久久国产精品黑丝| 久久久免费精品视频| 久久人91精品久久久久久不卡| 久久九九精品| 免费成人性网站| 欧美精品激情blacked18| 欧美精品一区二区高清在线观看| 欧美激情精品久久久久久大尺度 | 亚洲尤物视频网| 亚洲欧美制服中文字幕| 午夜欧美不卡精品aaaaa| 久久都是精品| 久久中文精品| 欧美日韩国产页| 国产精品久久久久婷婷| 国产三级精品三级| 亚洲国产精品成人综合| 一本大道久久a久久综合婷婷| 亚洲在线播放| 久久久久一区二区三区四区| 欧美a一区二区| 亚洲美女视频在线免费观看| 亚洲一区二区少妇| 久久久久国色av免费看影院| 免费欧美网站| 国产精品久久久久一区二区三区共 | 亚洲国产精品黑人久久久| 日韩午夜av电影| 欧美一级在线视频| 欧美波霸影院| 亚洲私人黄色宅男| 久久久久久久久一区二区| 欧美日本一区二区三区| 国产精品一区二区三区免费观看 | 一区二区三区在线观看欧美| 99re66热这里只有精品3直播| 午夜视频一区二区| 亚洲高清一区二区三区| 亚洲欧美在线一区二区| 欧美黄色小视频| 国产有码一区二区| 亚洲视频精品| 欧美激情va永久在线播放| 亚洲直播在线一区| 欧美精品久久久久久久| 国产资源精品在线观看| 中文成人激情娱乐网| 欧美成人午夜视频| 校园春色综合网| 欧美日韩在线影院| 亚洲国产女人aaa毛片在线| 欧美一区二区三区在线观看| 亚洲国产精品美女| 久久九九99| 国产伦精品一区二区三区免费| 亚洲精选在线观看| 欧美gay视频激情| 欧美在线视频在线播放完整版免费观看| 欧美福利在线| 亚洲国产美女久久久久 | 亚洲一区二区三| 亚洲国产福利在线| 久久久夜色精品亚洲| 国产日韩欧美一区| 亚洲欧美色一区| 在线中文字幕一区| 欧美精品久久久久久久久老牛影院| 国内精品久久久| 久久精品视频99| 午夜精品国产精品大乳美女| 国产精品国产a级| 亚洲综合国产激情另类一区| 99热这里只有精品8| 欧美日韩免费观看中文| 日韩视频精品在线观看| 亚洲电影免费在线观看| 你懂的视频欧美| 亚洲麻豆一区| 亚洲毛片视频| 欧美午夜激情在线| 欧美一区二区三区在线观看| 亚洲尤物影院| 国产一区二区三区久久| 久久久久久久久久久一区 |