• <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>
            隨筆 - 96  文章 - 255  trackbacks - 0
            <2008年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

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

            常用鏈接

            留言簿(21)

            隨筆分類

            隨筆檔案

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

            我的個人網(wǎng)頁

            我的小游戲

            資源下載

            搜索

            •  

            積分與排名

            • 積分 - 493174
            • 排名 - 39

            最新評論

            閱讀排行榜

            評論排行榜

            作者:龍飛

            今天是元宵節(jié),新年過去,又要開始抓緊時間奮斗了。祝大家都能繼續(xù)追逐自己的夢想。BS的書上引過一句話,“一個人要是不耕作,就必須寫作”,所以,不耕作的我不能停止寫作,time is money, my friend!

            1.1:整理兩種SDL_Surface的關(guān)系。

                    前面一直在用面向過程的思想寫程序,因為OOP細(xì)分到每一個具體的方法,還是過程。OOP的難點(diǎn)其實在于理清楚不同類之間的關(guān)系。說實話,我只是為了自己的理想,為了實現(xiàn)我計劃的項目,剛剛開始學(xué)習(xí)C++的菜鳥。兩個多月的C++能有什么水平,希望前輩們不要見笑,我會繼續(xù)努力的。而且,可能因為對于C++的偏愛,再加上我目前能找到的SDL相關(guān)教程都是C風(fēng)格的,所以我充滿了用C++來寫SDL教程挑戰(zhàn)的熱情。
                    SDL_Surface是SDL的一個結(jié)構(gòu)。在我們前面的知識中,學(xué)習(xí)了構(gòu)建這個結(jié)構(gòu)的兩種方法:一種是通過SDL_SetVideoMode();一種是SDL_LoadBMP()。其實,通過SDL_SetVideoMode()構(gòu)建的SDL_Surface是一種特殊的surface,因為,實際上,其他的surface都是通過blit到這個surface上,最終通過flip這個surface,才能顯示出來。所以,這個surface可以看成是SDL庫中,數(shù)據(jù)形式的surface(儲存在電腦中)與實體形式的surface(通過屏幕顯示出來)的唯一接口。另外,因為構(gòu)建這兩種surface需要的數(shù)據(jù)成員小同大異,類方法也不盡相同。所以,雖然我也考慮過建立一個基類把兩種surface作為派生類,但是我最終選擇了建立兩個類。

            1.2:構(gòu)建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;
            };
                    我先設(shè)定了一個靜態(tài)int作為計數(shù)器。我的考慮是,screen surface實際上只需要建立一個。并且,其他的surface實際上都是“依賴”于這個surface才能顯示出來的。在SDL中,多次SDL_SetVideoMode()的效果實際上是保留了最后一次的surface作為了screen surface,所以,多次SDL_SetVideoMode()其實是沒有實際意義的。計數(shù)器screenNum用于保證只創(chuàng)建一次screen surface,多次創(chuàng)建我傾向讓程序拋出異常。
                    構(gòu)建函數(shù)除了調(diào)用SDL_SetVideoMode()函數(shù),還作為SDL_Init()的啟動載入。所以,我專門定義析構(gòu)函數(shù)的目的,是因為C++會在類對象消亡的時候自動調(diào)用析構(gòu)函數(shù)。因為保證了只建立一個screen surface,并且在創(chuàng)建對象的時候載入了SDL_Init(),所以,如果析構(gòu)函數(shù)中使用SDL_Quit(),則可以在手動調(diào)用析構(gòu)函數(shù)或者程序結(jié)束的時候調(diào)用SDL_Quit()了。
                    方法point()返回對象中的pScreen,其實就是SDL_Surface結(jié)構(gòu)的指針。因為SDL庫是C風(fēng)格的,所以,直接使用指針的函數(shù)很多。
                    方法flip()用于把screen surface最終顯示出來。

            1.3:screen surface的類方法。
            int ScreenSurface::screenNum = 0;
            首先為靜態(tài)變量附初值。
            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
            ++;
            }
            構(gòu)造函數(shù)。如果創(chuàng)建1個以上的screen surface,則會拋出異常。
            ScreenSurface::~ScreenSurface()
            {
                SDL_Quit();
            }
            析構(gòu)函數(shù)。在對象消亡時,退出SDL系統(tǒng)。
            SDL_Surface* ScreenSurface::point() const
            {
                
            return pScreen;
            }
            返回screen surface中SDL_Surface結(jié)構(gòu)的指針,主要提供給SDL的函數(shù)調(diào)用。
            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 閱讀(6225) 評論(2)  編輯 收藏 引用 所屬分類: SDL入門教程

            FeedBack:
            # re: SDL入門教程(五):1、構(gòu)建SDL screen surface類 2009-08-07 15:17 王芳杰
            LZ,這個變量應(yīng)該是沒有必要的吧。

            不是有個函數(shù)SDL_wasInit的方法嗎,可以判斷他是否為0,來判斷pScreen
            是否被初始過了,還有這個既然pScreen擔(dān)任內(nèi)存至顯示唯一接口的作用,那么這個CScreenSurface貌似做個單鍵更合理些。

            很佩服lz.  回復(fù)  更多評論
              
            # re: SDL入門教程(五):1、構(gòu)建SDL screen surface類[未登錄] 2013-06-13 10:06 jk
            SetVideoMode是在構(gòu)造函數(shù)中調(diào)用的,那就有一個問題:實例化該類的線程就要負(fù)責(zé)進(jìn)行PollEvent,但這樣會暴露出SDL內(nèi)部操作,同時會增加線程輪詢的負(fù)擔(dān).

            個人更傾向于將SetVideoMode封裝到類中的靜態(tài)線程中進(jìn)行,同時該線程也負(fù)責(zé)PollEvent的操作.  回復(fù)  更多評論
              
            久久天天躁狠狠躁夜夜不卡| 99久久伊人精品综合观看| 久久久久久久久66精品片| 色欲综合久久中文字幕网| 久久99精品久久只有精品| 国产成人AV综合久久| 久久婷婷五月综合国产尤物app| 午夜精品久久久久久99热| 99久久国产主播综合精品| 欧美亚洲国产精品久久高清 | 一级做a爰片久久毛片看看| 久久亚洲精精品中文字幕| 久久九九久精品国产| 亚洲va中文字幕无码久久| 久久精品国产一区二区电影| 亚洲中文久久精品无码| 国产精品免费久久久久电影网| 久久天天躁狠狠躁夜夜不卡| 精品多毛少妇人妻AV免费久久| 九九久久自然熟的香蕉图片| 无码乱码观看精品久久| 国产成人无码精品久久久免费| 亚洲伊人久久大香线蕉综合图片| 久久夜色精品国产| 91精品无码久久久久久五月天| 无码人妻精品一区二区三区久久久 | 狠狠色噜噜色狠狠狠综合久久| 久久99精品久久久久久水蜜桃 | 女人高潮久久久叫人喷水| 久久久久国产一级毛片高清版| 久久99精品久久久久久hb无码| 中文国产成人精品久久不卡 | 亚洲精品成人久久久| 久久乐国产精品亚洲综合| 久久播电影网| 久久性精品| 中文字幕无码久久精品青草| 青春久久| 久久久久亚洲AV片无码下载蜜桃| 一本久久综合亚洲鲁鲁五月天| 亚洲精品美女久久久久99小说|