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

隨筆 - 96  文章 - 255  trackbacks - 0
<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

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

常用鏈接

留言簿(21)

隨筆分類

隨筆檔案

SDL相關網站

我的個人網頁

我的小游戲

資源下載

搜索

  •  

積分與排名

  • 積分 - 495347
  • 排名 - 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
        我們通過最常可能用到的audio和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 閱讀(8206) 評論(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的正常現象嗎?  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
              亚洲一区国产视频| 国产精品国产福利国产秒拍| 亚洲国产岛国毛片在线| 久久av一区二区三区漫画| 午夜久久影院| 久久久av网站| 欧美大片91| 亚洲精品日产精品乱码不卡| 亚洲人成网站精品片在线观看| 蜜臀va亚洲va欧美va天堂| 欧美成人自拍| 亚洲精品国产精品乱码不99| 欧美www视频| 一本色道久久综合亚洲精品小说| 国内精品久久久久影院色| 亚洲国产日韩欧美在线99| 亚洲精品欧美激情| 亚洲永久精品国产| 久久天天躁夜夜躁狠狠躁2022| 欧美暴力喷水在线| 一本色道综合亚洲| 欧美亚洲一区二区三区| 欧美高清在线| 国产精品尤物| 日韩亚洲精品在线| 久久欧美中文字幕| 亚洲美女视频网| 久久精品人人做人人爽电影蜜月| 欧美交受高潮1| 精品福利免费观看| 欧美亚洲系列| 夜夜夜精品看看| 欧美成人网在线| 极品少妇一区二区| 欧美专区中文字幕| 一本色道久久88亚洲综合88| 老妇喷水一区二区三区| 国产一区自拍视频| 欧美亚洲在线| 一本色道久久综合狠狠躁篇怎么玩| 久久成人免费日本黄色| 国产精品久久一区主播| 亚洲美女中文字幕| 女主播福利一区| 性娇小13――14欧美| 欧美日韩午夜在线视频| 亚洲激情偷拍| 欧美成人精品影院| 久久久亚洲高清| 国产日韩精品视频一区| 午夜精品在线视频| 亚洲小视频在线观看| 欧美华人在线视频| 一区二区亚洲欧洲国产日韩| 欧美一区二区在线播放| 亚洲午夜av电影| 国产精品毛片大码女人| 亚洲一区国产视频| 亚洲一区激情| 国产精品午夜视频| 欧美一区二区大片| 国产一区二区三区丝袜| 欧美呦呦网站| 亚洲欧美日韩成人| 国产日本欧美一区二区三区在线| 欧美亚洲三区| 久久久99久久精品女同性| 欧美激情一区二区| 欧美高清视频免费观看| 日韩亚洲欧美高清| 久久一区二区三区av| 亚洲激情小视频| 亚洲国产高清视频| 欧美国产视频一区二区| 亚洲精品在线视频| 夜夜精品视频| 欧美日韩影院| 欧美伊人久久| 久久一综合视频| 日韩一级在线| 午夜在线成人av| 亚洲国产综合91精品麻豆| 亚洲国产视频a| 欧美性猛交xxxx免费看久久久 | 亚洲日韩欧美一区二区在线| 亚洲黄色一区二区三区| 国产精品久久久久久av福利软件 | 91久久精品日日躁夜夜躁欧美 | 亚洲国产欧美一区二区三区丁香婷| 欧美激情第3页| 欧美无乱码久久久免费午夜一区| 久久精品成人| 欧美激情久久久| 亚洲一区久久久| 久久久久久一区二区三区| 99热精品在线| 欧美中文在线视频| 一区二区三区国产盗摄| 羞羞视频在线观看欧美| 国产嫩草一区二区三区在线观看| aa级大片欧美三级| 亚洲午夜久久久| 欧美成人激情在线| 亚洲视频综合| 久久久欧美精品| 在线精品福利| 欧美三区不卡| 午夜在线视频观看日韩17c| 美女精品自拍一二三四| 欧美三级视频在线播放| 欧美日韩免费在线视频| 久久久久国产一区二区三区| 欧美精品一区二区三区在线播放 | 日韩亚洲欧美精品| 亚洲精品小视频在线观看| 亚洲欧美韩国| 欧美激情一区二区三区高清视频| 老色鬼精品视频在线观看播放| 中文一区字幕| 久久天天狠狠| 久久久999国产| 国产精品制服诱惑| 亚洲最新中文字幕| 日韩一级片网址| 欧美国产日韩免费| 美国十次成人| 黄色亚洲大片免费在线观看| 亚洲一区二区av电影| 亚洲午夜精品一区二区| 欧美激情视频一区二区三区免费| 欧美在线影院在线视频| 国产精品日本精品| 在线亚洲精品| 亚洲欧美日韩精品久久久久| 欧美日韩国产综合视频在线观看中文| 免费一级欧美片在线观看| 国自产拍偷拍福利精品免费一| 亚洲欧美日韩综合一区| 先锋影音久久| 欧美精品激情在线| 国产精品亚洲片夜色在线| 国产精品久久毛片a| 另类人畜视频在线| 一区二区三区国产精品| 久久精品国产96久久久香蕉| 国产精品网站视频| 久久精品日韩一区二区三区| 午夜电影亚洲| 午夜在线一区| 午夜精品久久久久久久久久久久久| 91久久精品日日躁夜夜躁国产| 亚洲日韩欧美视频一区| 国产精品成人观看视频免费| 亚洲天堂男人| 久久国产精品久久精品国产| 羞羞色国产精品| 老司机一区二区| 亚洲国产视频一区| 欧美激情四色| 亚洲另类一区二区| 亚洲综合二区| 欧美激情一区在线观看| 国产精品爱久久久久久久| 欧美三日本三级三级在线播放| 国产精品一区久久久| 亚洲精品在线观| 久久蜜桃资源一区二区老牛| 亚洲电影成人| 久久不见久久见免费视频1| 欧美精品一区三区| 在线观看亚洲一区| 欧美伊久线香蕉线新在线| 日韩视频在线一区二区| 久久精品99久久香蕉国产色戒| 欧美日韩一级黄| 老司机免费视频久久| 亚洲麻豆av| 国产精品国产三级国产aⅴ9色| 99综合精品| 一区二区精品在线观看| 国产一区二区三区黄视频| 国产一区再线| 久久久久国产精品人| 欧美在线日韩精品| 亚洲第一黄色| 日韩一级二级三级| 欧美三级免费| 久久精品视频在线播放| 激情综合激情| 久久在线91| 亚洲免费av片| 欧美极品一区二区三区| 午夜精品一区二区三区在线播放 | 亚洲午夜电影| 亚洲韩国青草视频| 久久九九国产| 欧美一区二区三区喷汁尤物| 91久久在线视频| 亚洲国产精品999| 红桃视频欧美|