• <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年2月>
            272829303112
            3456789
            10111213141516
            17181920212223
            2425262728291
            2345678

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

            常用鏈接

            留言簿(21)

            隨筆分類

            隨筆檔案

            SDL相關網站

            我的個人網頁

            我的小游戲

            資源下載

            搜索

            •  

            積分與排名

            • 積分 - 492313
            • 排名 - 39

            最新評論

            閱讀排行榜

            評論排行榜

            作者:龍飛

            1.1:SDL_Init!

                    我們回顧一下前面的那個小程序,所使用到的第一個SDL函數是:SDL_Init(SDL_INIT_EVERYTHING);
                    這是SDL的裝載函數,也就是說,SDL的其他函數必須在這個函數將SDL裝載之后才能夠正常調用。我們看一下函數原形:
            int SDL_Init(Uint32 flags);

                    它的返回值是int,這個我們很熟悉。如果SDL成功初始化裝載,函數返回0,如果異常,則返回-1。接下來,這個函數的形參列表不屬于標準C++的內容。

            1.1.1:Uint32 是什么?

                    根據Uint32在函數原形中的位置,我們可以猜想到它是一種類類型的名字。因為SDL是跨平臺的,而且還支持多種計算機語言,當我們在Windows的VC編譯器里面簡單的通過sizeof(int)可以看到int類型占用4個字節(32位)的時候,我們并不清楚其他平臺,其他編譯器和其他語言里面對int的大小是如何定義的。所以,為了讓大家在任何情況下都能比較直觀的閱讀類類型的大小,SDL使用了一個簡單的約定:U就是unsigned(無符號,意味著非負)的意思,與之對應的S代表signed(有符號,可正可負);int還是整數的意思;32表示占32位,類似的,還可以占1至4個字節,即8,16,32,64位。Uint32的意思就是無符號的,占32位的整數類。

            1.1.2:flag 是什么意思?

                    flag就是旗幟……別k我……多想想,旗幟可用于什么呢?旗幟可用于發信號和標記。在計算機里,通常把flag叫做位標——其實,bit flag才是位標,不過這種用法貌似已經是一種習慣。所以,從flags字面,我們至少可以理解到三層含義-_-!!!
            1) 關鍵字“位”,這意味著我們需要用二進制的觀點看這個值,并且,這個值可以參與位運算;
            2) 關鍵字“標”,這顯然是標記的意思。小狗通常采用一些不文明的手段表明某個區域是自己的勢力范圍,而人類則通常采用插一面代表自己勢力的旗幟,所以這就是flag的本意。
            3) 關鍵字"s",這里使用了復數,表明我們可以不止插一面旗。
                    我們看看這個函數的位標的定義:(就在SDL.h文件中)

            #define    SDL_INIT_TIMER        0x00000001
            #define SDL_INIT_AUDIO        0x00000010
            #define SDL_INIT_VIDEO        0x00000020
            #define SDL_INIT_CDROM        0x00000100
            #define SDL_INIT_JOYSTICK    0x00000200
            #define SDL_INIT_EVERYTHING    0x0000FFFF
                    我們通過最??赡苡玫降腶udio和video來簡單說明下。SDL_INIT_AUDIO和SDL_INIT_VIDEO顯然實際上只用到了2個字節,為了少寫8*6個無謂的0,我們就簡單的看成是0x10和0x20,寫成2進制,則
            SDL_INIT_AUDIO = 0001 0000
            SDL_INIT_VIDEO = 0010 0000
            位運算或(|)的結果是若兩數相對應的位,有一個是1則得1。(與(&)則是兩數相對應的位全是1才得1。)
            所以,SDL_INIT_AUDIO | SDL_INIT_VIDEO的結果是 0011 0000,即0x30(這里要是一不小心覺得貌似1+2=3,第一,理解錯了;第二,是個巧合)。

            1.2:SDL_WasInit?

                    當我們坐上公共汽車,我們真正關心的問題,是這車是開還是停。同樣,當SDL已經裝載,我們更關心的問題是它的運行狀態,并且,有哪些“旗子”插在了上面?所以,我們可以問問SDL:xx_flag was init?
            int SDL_WasInit(Uint32 flags);
                    這里,我們可以將SDL_INIT_*的5個具體旗子看成一種用法;使用了“|”的復合旗子以及那個EVERYTHING的概念看成另外一種用法。當flag為某個具體旗子的時候,如果該旗子插上了,則返回該旗子的位標值本身,否則就返回0。當參數不止一面旗子的時候,則返回這些旗子中插上了的那部分的“|”值。(其實就是返回那些在你指定的旗子中插上的那些,只是電腦看起來很直觀,人看起來很不直觀——特別在使用非2進制表示的時候)。
                    官方文檔里面舉了3個例子,后面我將舉一個我個人覺得比較直觀的程序例子。
            /* Get init data on all the subsystems */
            Uint32 subsystem_init;

            subsystem_init
            =SDL_WasInit(SDL_INIT_EVERYTHING);

            if(subsystem_init&SDL_INIT_VIDEO)
              printf(
            "Video is initialized.\n");
            else
              printf(
            "Video is not initialized.\n");

            /* Just check for one specific subsystem */

            if(SDL_WasInit(SDL_INIT_VIDEO)!=0)
              printf(
            "Video is initialized.\n");
            else
              printf(
            "Video is not initialized.\n");

            /* Check for two subsystems */

            Uint32 subsystem_mask
            =SDL_INIT_VIDEO|SDL_INIT_AUDIO;

            if(SDL_WasInit(subsystem_mask)==subsystem_mask)
              printf(
            "Video and Audio initialized.\n");
            else
              printf(
            "Video and Audio not initialized.\n");


            1.3:一段用于演示flags的程序。

                    需要補充說明的一點是:當SDL_Init(SDL_INIT_EVERYTHING);的時候,SDL_WasInit(SDL_INIT_EVERYTHING)返回的并非SDL_INIT_EVERYTHING的原值0xFFFF,而是5個基本旗子的“|”和,即0x0331,所以,程序里面我定義了一個const Uint32 EVERYTHING = 0x331;,來正確的反應EVERYTHING的實際情況。

            /////////////////////////////
            //本程序用于演示SDL_Init()函數的flags
            //有關SDL的信息請訪問SDL的官方網站
            //http://www.libsdl.org/
            //任何疑問和建議請聯系我 zbln426@163.com
            //再別流年的技術實驗室
            //http://m.shnenglu.com/lf426/
            /////////////////////////////

            /////////////////////////////
            //<iomanip>包含了
            //setw(n) 用于設置下次輸出的字寬
            //setfill(ch) 用于將字寬多出部分用char ch填充
            /////////////////////////////
            #include <iostream>
            #include 
            <iomanip>
            #include 
            "SDL/SDL.h"
            using namespace std;

            inline 
            void showHex(int SDLflags);
            void testSDLflags(Uint32 SDLflags, char* inf);

            int main(int argc, char* argv[])
            {
                cout 
            << "*****flags*****" << endl;
                cout 
            << "SDL_INIT_EVERYTHING = ";
                showHex(SDL_INIT_EVERYTHING);
                cout 
            << "SDL_INIT_VIDEO = ";
                showHex(SDL_INIT_VIDEO);
                cout 
            << "SDL_INIT_AUDIO = ";
                showHex(SDL_INIT_AUDIO);
                cout 
            << "SDL_INIT_TIMER = ";
                showHex(SDL_INIT_TIMER);
                cout 
            << "SDL_INIT_CDROM = ";
                showHex(SDL_INIT_CDROM);
                cout 
            << "SDL_INIT_JOYSTICK = ";
                showHex(SDL_INIT_JOYSTICK);
                cout 
            << endl << endl;
                
                testSDLflags(SDL_INIT_EVERYTHING, 
            "SDL_INIT_EVERYTHING");
                testSDLflags(SDL_INIT_VIDEO, 
            "SDL_INIT_VIDEO");
                testSDLflags(SDL_INIT_AUDIO, 
            "SDL_INIT_AUDIO");
                testSDLflags(SDL_INIT_VIDEO 
            | SDL_INIT_AUDIO, "SDL_INIT_VIDEO | SDL_INIT_AUDIO");
                testSDLflags(SDL_INIT_VIDEO 
            | SDL_INIT_AUDIO | SDL_INIT_TIMER | SDL_INIT_CDROM | SDL_INIT_JOYSTICK,
                            
            "SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER | SDL_INIT_CDROM | SDL_INIT_JOYSTICK");
                
            return 0;
            }

            ////////////////////////
            //該函數用于測試不同的flags所產生的效果
            ///////////////////////
            void testSDLflags(Uint32 SDLflags, char* inf)
            {
                Uint32 subsystem_init 
            = SDLflags;
                
            const Uint32 EVERYTHING = 0x331;
                SDL_Init(subsystem_init);
                cout 
            << "SDL_Init(" << inf << ") Loading" <<endl;
                
                cout 
            << "*****runtime*****" << endl;
                cout 
            << "SDL_WasInit(SDL_INIT_EVERYTHING) = ";
                showHex(SDL_WasInit(SDL_INIT_EVERYTHING));
                cout 
            << "SDL_WasInit(SDL_INIT_VIDEO) = ";
                showHex(SDL_WasInit(SDL_INIT_VIDEO));
                cout 
            << "SDL_WasInit(SDL_INIT_AUDIO | SDL_INIT_VIDEO) = ";
                showHex(SDL_WasInit(SDL_INIT_AUDIO 
            | SDL_INIT_VIDEO));

                cout 
            << "*****runtime in bool*****" << endl;
                cout 
            << boolalpha;
                Uint32 runtimeThing 
            = SDL_WasInit(SDL_INIT_EVERYTHING);
                cout 
            << "SDL_INIT_EVERYRHING? " << (runtimeThing == EVERYTHING) << endl;
                cout 
            << "SDL_INIT_VIDEO? " << bool(runtimeThing & SDL_INIT_VIDEO) << endl;
                cout 
            << "SDL_INIT_AUDIO? " << bool(runtimeThing & SDL_INIT_AUDIO) << endl;
                cout 
            << noboolalpha;
                cout 
            << "SDL_Quit\n\n\n";

                SDL_Quit();
                
                
            return;
            }

            /////////////////////////////
            //該函數用于將flags打印為16進的格式
            /////////////////////////////
            void showHex(int SDLflags)
            {
                cout 
            << hex;
                cout 
            << "0x" << setw(8<< setfill('0'<< SDLflags << endl;
                cout 
            << dec;
            }

            運行結果如下:
            *****flags*****
            SDL_INIT_EVERYTHING 
            = 0x0000ffff
            SDL_INIT_VIDEO 
            = 0x00000020
            SDL_INIT_AUDIO 
            = 0x00000010
            SDL_INIT_TIMER 
            = 0x00000001
            SDL_INIT_CDROM 
            = 0x00000100
            SDL_INIT_JOYSTICK 
            = 0x00000200


            SDL_Init(SDL_INIT_EVERYTHING) Loading
            *****runtime*****
            SDL_WasInit(SDL_INIT_EVERYTHING) 
            = 0x00000331
            SDL_WasInit(SDL_INIT_VIDEO) 
            = 0x00000020
            SDL_WasInit(SDL_INIT_AUDIO | SDL_INIT_VIDEO) 
            = 0x00000030
            *****runtime in bool*****
            SDL_INIT_EVERYRHING? true
            SDL_INIT_VIDEO? true
            SDL_INIT_AUDIO? true
            SDL_Quit


            SDL_Init(SDL_INIT_VIDEO) Loading
            *****runtime*****
            SDL_WasInit(SDL_INIT_EVERYTHING) 
            = 0x00000020
            SDL_WasInit(SDL_INIT_VIDEO) 
            = 0x00000020
            SDL_WasInit(SDL_INIT_AUDIO | SDL_INIT_VIDEO) 
            = 0x00000020
            *****runtime in bool*****
            SDL_INIT_EVERYRHING? false
            SDL_INIT_VIDEO? true
            SDL_INIT_AUDIO? false
            SDL_Quit


            SDL_Init(SDL_INIT_AUDIO) Loading
            *****runtime*****
            SDL_WasInit(SDL_INIT_EVERYTHING) 
            = 0x00000010
            SDL_WasInit(SDL_INIT_VIDEO) 
            = 0x00000000
            SDL_WasInit(SDL_INIT_AUDIO | SDL_INIT_VIDEO) 
            = 0x00000010
            *****runtime in bool*****
            SDL_INIT_EVERYRHING? false
            SDL_INIT_VIDEO? false
            SDL_INIT_AUDIO? true
            SDL_Quit


            SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) Loading
            *****runtime*****
            SDL_WasInit(SDL_INIT_EVERYTHING) 
            = 0x00000030
            SDL_WasInit(SDL_INIT_VIDEO) 
            = 0x00000020
            SDL_WasInit(SDL_INIT_AUDIO | SDL_INIT_VIDEO) 
            = 0x00000030
            *****runtime in bool*****
            SDL_INIT_EVERYRHING? false
            SDL_INIT_VIDEO? true
            SDL_INIT_AUDIO? true
            SDL_Quit


            SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER | SDL_INIT_CDROM | SDL
            _INIT_JOYSTICK) Loading
            *****runtime*****
            SDL_WasInit(SDL_INIT_EVERYTHING) 
            = 0x00000331
            SDL_WasInit(SDL_INIT_VIDEO) 
            = 0x00000020
            SDL_WasInit(SDL_INIT_AUDIO | SDL_INIT_VIDEO) 
            = 0x00000030
            *****runtime in bool*****
            SDL_INIT_EVERYRHING? true
            SDL_INIT_VIDEO? true
            SDL_INIT_AUDIO? true
            SDL_Quit

            1.4:一段用于演示flags二進制的演示程序

            #include <iostream>
            #include 
            <bitset>
            #include 
            "SDL/SDL.h"
            using namespace std;

            int main(int argc, char* argv[])
            {
                cout 
            << "SDL_INIT_EVERYTHING = " << bitset<32>(SDL_INIT_EVERYTHING) << endl;
                cout 
            << "SDL_INIT_VIDEO = " << bitset<32>(SDL_INIT_VIDEO) << endl;
                cout 
            << "SDL_INIT_AUDIO = " << bitset<32>(SDL_INIT_AUDIO) << endl;
                cout 
            << "SDL_INIT_VIDEO | SDL_INIT_AUDIO = " << bitset<32>(SDL_INIT_VIDEO | SDL_INIT_AUDIO) << endl;
                
            return 0;
            }
            運行結果如下:
            SDL_INIT_EVERYTHING = 00000000000000001111111111111111
            SDL_INIT_VIDEO 
            = 00000000000000000000000000100000
            SDL_INIT_AUDIO 
            = 00000000000000000000000000010000
            SDL_INIT_VIDEO | SDL_INIT_AUDIO 
            = 00000000000000000000000000110000
            posted on 2008-02-01 22:40 lf426 閱讀(8179) 評論(3)  編輯 收藏 引用 所屬分類: SDL入門教程

            FeedBack:
            # re: SDL入門教程(二):1、SDL的裝載,位標(flags) 2010-04-01 07:14 dsw
            hex 都沒聲明....什么東西?  回復  更多評論
              
            # re: SDL入門教程(二):1、SDL的裝載,位標(flags) 2012-03-25 23:12 y
            @dsw
            hex是std里面的東西。  回復  更多評論
              
            # re: SDL入門教程(二):1、SDL的裝載,位標(flags) 2012-05-10 15:21 原罪流觴
            你好,請問我運行之后,并沒有在窗口中出現結果,而是在debug文件夾里自動生成了一個stdcout的txt文檔……這個是sdl的正常現象嗎?  回復  更多評論
              
            久久久久人妻一区精品| 亚洲午夜久久久久久久久久| 久久午夜羞羞影院免费观看| 婷婷综合久久中文字幕蜜桃三电影| 午夜天堂精品久久久久| 国产精品久久久久影院色| 久久国产三级无码一区二区| 久久AV无码精品人妻糸列| 久久久久国产精品| 久久丫忘忧草产品| 97久久精品人人澡人人爽| 国产色综合久久无码有码| 久久夜色tv网站| 一本久久a久久精品综合香蕉| 国产午夜久久影院| 久久久亚洲裙底偷窥综合| 久久99久久成人免费播放| 精品久久久噜噜噜久久久| 2021国内精品久久久久久影院| 精品一区二区久久| 久久久久亚洲av无码专区导航 | 亚洲国产精品无码久久久不卡 | 久久久99精品一区二区| 久久综合亚洲欧美成人| 人妻无码久久精品| 99久久无码一区人妻| 国产Av激情久久无码天堂| 久久久久亚洲精品日久生情 | 国产成人香蕉久久久久| 久久精品人成免费| 日本久久久久亚洲中字幕| 亚洲色欲久久久久综合网| 久久精品国产第一区二区| 久久综合九色综合精品| 久久综合久久综合九色| 老司机国内精品久久久久| 久久99精品久久久久久| 亚洲国产精品久久久久网站 | www.久久热.com| 国产精品久久久福利| 久久精品国产一区|