• <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>

            VC++ C++ C# Algorithm

            C++博客 首頁 新隨筆 聯系 聚合 管理
              21 Posts :: 3 Stories :: 31 Comments :: 0 Trackbacks

            #

            SDL本身只支持加載BMP文件,如果你想顯示其他類型的圖像文件,就要用到擴展類庫,擴展類庫里面還有其他一些組件,你可以在這里下載到 http://www.libsdl.org/projects/SDL_image/
            下載完以后,按照教程一配置,我們就可以顯示一張PNG圖片了。
            以下是具體的代碼,與教程二很相似,如有疑問請參考教程二。
            #include?
            " SDL.h "

            #include?
            < SDL_image.h >
            #include?
            < string >
            SDL_Surface?
            * screen;
            SDL_Surface?
            *
            background;
            SDL_Surface?
            * load_image(?std:: string
            ?filename?)?
            {
            ????
            // The?image?that's?loaded

            ????SDL_Surface * ?loadedImage? = ?NULL;

            ????
            // The?optimized?image?that?will?be?used

            ????SDL_Surface * ?optimizedImage? = ?NULL;

            ????
            // Load?the?image?using?SDL_image

            ????loadedImage? = ?IMG_Load(?filename.c_str()?);

            ????
            // If?the?image?loaded

            ???? if (?loadedImage? != ?NULL?)
            ????
            {
            ????????
            // Create?an?optimized?image

            ????????optimizedImage? = ?SDL_DisplayFormat(?loadedImage?);

            ????????
            // Free?the?old?image

            ????????SDL_FreeSurface(?loadedImage?);
            ????}


            ????
            // Return?the?optimized?image
            ???? return ?optimizedImage;
            }

            void ?apply_surface( int ?x, int ?y,SDL_Surface? * source?,SDL_Surface? * destinaion)
            {
            ????SDL_Rect?rect;
            ????rect.x
            =
            x;
            ????rect.y
            =
            y;
            ????SDL_BlitSurface(source,NULL,destinaion,
            &
            rect);

            }

            int ?main(? int ?argc,? char * ?args[]?)
            {
            ????
            // Start?SDL

            ????SDL_Init(?SDL_INIT_EVERYTHING?);

            ????
            // Quit?SDL

            ????screen = SDL_SetVideoMode( 640 , 480 , 32 ,SDL_SWSURFACE);
            ????background
            = load_image( " Dockxrt5.jpg "
            );

            ????apply_surface(
            0 , 0
            ,background,screen);

            ????
            if (SDL_Flip(screen) ==- 1
            )
            ????????
            return ? - 1
            ;
            ????SDL_FreeSurface(background);
            ????SDL_Delay(
            2000
            );
            ????SDL_FreeSurface(background);
            ????SDL_Quit();

            ????
            return ? 0
            ;????
            }

            以下代碼用SDL_TTF擴展類庫加載一個TTF字體文件,并用該字體顯示一段文字。
            ?1 #include? " SDL.h "
            ?2 #include? < SDL_ttf.h >
            ?3 #include? < string >
            ?4 SDL_Surface? * screen;
            ?5 SDL_Surface? *
            background;
            ?6 void ?apply_surface( int ?x, int ?y,SDL_Surface? * source?,SDL_Surface? *
            destinaion)
            ?7
            {
            ?8
            ????SDL_Rect?rect;
            ?9 ????rect.x =
            x;
            10 ????rect.y =
            y;
            11 ????SDL_BlitSurface(source,NULL,destinaion, &
            rect);
            12

            13 }

            14 int ?main(? int ?argc,? char * ?args[]?)
            15
            {
            16 ???? // Start?SDL

            17
            18 ????SDL_Init(?SDL_INIT_EVERYTHING?);
            19 ???? if (TTF_Init() ==- 1
            )
            20 ???????? return ? - 1
            ;
            21 ????TTF_Font? * font =
            NULL;
            22 ????font = TTF_OpenFont( " verdana.ttf " , 14
            );
            23 ???? if (font? ==
            ?NULL)
            24 ???????? return ? - 1
            ;
            25

            26 ???? // Quit?SDL

            27 ????SDL_Color?textColor = { 255 , 255 , 255 } ;
            28 ????SDL_Color?textBgColor = { 0 , 0 , 0 ,}
            ;
            29 ????screen = SDL_SetVideoMode( 640 , 480 , 32
            ,SDL_SWSURFACE);
            30 ????background = TTF_RenderText_Blended(?font,? " why?it?can?not?display?chinese "
            ,?textColor);
            31

            32 ????apply_surface( 0 , 0
            ,background,screen);
            33

            34 ???? if (SDL_Flip(screen) ==- 1
            )
            35 ???????? return ? - 1
            ;
            36

            37 ????SDL_Delay( 100000
            );
            38
            ????SDL_Quit();
            39

            40 ???? return ? 0
            ;????
            41 }

            42
            posted @ 2007-03-05 22:30 大熊貓 閱讀(3448) | 評論 (4)編輯 收藏

            ?

            我們可以把表面想象成一張畫布, blit 表面就是把一個表面的某個區域 COPY 到另外一個表面上去。

            //The headers

            #include " SDL.h"

            #include <string>

            以上就是我們需要的頭文件了。

            //The attributes of the screen

            const int SCREEN_WIDTH = 640;

            const int SCREEN_HEIGHT = 480;

            const int SCREEN_BPP = 32;

            3 個描述屏幕屬性的變量

            SCREEN_BPP 是顏色深度,就是每個象素用多少為來表示,我們這里用 4 個字節。

            //The surfaces that will be used

            SDL_Surface *message = NULL;

            SDL_Surface *background = NULL;

            SDL_Surface *screen = NULL;

            接著我們又定義了 3 個表面,一個用于顯示背景,一個用于顯示 Hello World ,還有一個當然是代表屏幕了。

            SDL_Surface *load_image( std::string filename )

            {

            ??? //Temporary storage for the image that's loaded

            ??? SDL_Surface* loadedImage = NULL;

            ???

            ??? //The optimized image that will be used

            SDL_Surface* optimizedImage = NULL;

            好了,我們可以寫一個自己的圖像裝載函數,該函數負責 Load 圖片,并返回一個經過優化的表面,當然圖片已經在表面上了。

            //Load the image

            ??? loadedImage = SDL_LoadBMP( filename.c_str() );

            首先我們使用 SDL_LoadBMP() 函數 Load 一張 BMP 格式的圖片。應為位圖是 24 位,所以我們不應該立即使用該表面,因為屏幕是 32 位的。如果在二各具有不同 format 表面進行 Blit ,那么 SDL 將會不停地進行格式之間的轉換,程序就會變得很慢。 .

            ?

            ??? if( loadedImage != NULL )

            ??? {

            ??????? //Create an optimized image

            ?? ?????optimizedImage = SDL_DisplayFormat( loadedImage );

            ???????

            ??????? //Free the old image

            ??????? SDL_FreeSurface( loadedImage );

            }

            以上幾行代碼檢查了圖片是否被正確加載了,如果有錯誤的話,那么 loadedImage 將是 NULL

            SDL_DisplayFormat() 用于創建一個和屏幕表面相同格式的 Surface 。之所以這樣做就是為了加快程序速度,避免 SDL 類庫在對二個不同格式表面進行 Blit 時進行格式轉換。

            ?

            好了,現在我們擁有二個表面了,一個上面有圖片,還有一個是前一個經過格式轉換得到的。

            ?

            displayformat.jpg
            freesurface.jpg

            ?

            因為第一表面我們不需要了,所以我們就要釋放掉, SDL_FreeSurface() 函數就是干這件事情的。

            ??? //Return the optimized image

            ??? return optimizedImage;

            }

            好了,我們返回經過優化的表面。

            void apply_surface( int x, int y, SDL_Surface* source, SDL_Surface* destination )

            {

            ??? //Make a temporary rectangle to hold the offsets

            ??? SDL_Rect offset;

            ???

            ??? //Give the offsets to the rectangle

            ??? offset.x = x;

            offset.y = y;

            接下來,我們再寫一個 Blit 函數。 X,Y 是目標表面的偏移量,另外二個自然是要進行 Blit 的二個表面了。

            首先我們把偏移量塞入到一個 SDL_Rect 變量里面,這樣做的原因很簡單,就是 SDL_BlitSurface 只接受 SDL_Rect 結構中的偏移。

            SDL_Rect 結構代表一個長方形 . 它有四個成員,左上角的坐標,長和寬。

            ??? //Blit the surface

            ??? SDL_BlitSurface( source, NULL, destination, &offset );

            }

            好了,調用 SDL_BlitSurface 實現 Blit 。第二個參數是源表面的要被 Blit 的區域,我們用 NULL 表示要對整個源表面進行 Blit

            int main( int argc, char* args[] )

            {

            ??? if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )

            ??? {

            ??????? return 1;???

            ??? }

            SDL_Init() 函數中,我們使用 SDL_INIT_EVERYTHING 參數,表示我們希望啟動所有 SDL 子系統,其中包括,視頻,聲音,時間,以及其他一些制作游戲所用到的組建。

            ?? screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );

            現在我們用 SDL_SetVideoMode 函數新建一個窗口,它返回一個指向窗口表面的指針,這樣我們就可以把圖像往屏幕上 Blit 了。

            ?

            ??? if( screen == NULL )

            ??? {

            ??????? return 1;???

            ??? }

            如果函數有問題的話,就返回 NULL 。下面我們也可以改變一下窗口的標題。 ??? SDL_WM_SetCaption( "Hello World", NULL );

            ?? message = load_image( "hello_world.bmp" );

            ?? background = load_image( "background.bmp" );

            ?? apply_surface( 0, 0, background, screen );

            現在我們把背景 Blit 到屏幕上,在 Blit 背景之前,窗口是黑色,如下圖。

            ?blank.jpg

            ?

            再這之后,窗口的背景就改變了。
            background.jpg

            用同樣的方法,我們把 message Blit 到屏幕上去。

            apply_surface( 180, 140, message, screen );

            ?

            ??? if( SDL_Flip( screen ) == -1 )

            ??? {

            ??????? return 1;???

            ??? }

            雖然我們把背景表面和消息表面都 Blit 到屏幕表面上去了,窗口還是一片漆黑,因為我們沒有調用 SDL_Flip 函數來更新窗口,記住,屏幕表面是建立在系統內存當中的。

            ? SDL_Delay( 2000 );

            好了,讓窗口停頓二秒,以免我們什么也不到。

            ??? //Free the surfaces

            ??? SDL_FreeSurface( message );

            ??? SDL_FreeSurface( background );

            ???

            ??? //Quit SDL

            ??? SDL_Quit();

            ???

            ??? //Return

            ??? return 0;

            }

            好了,我們的主函數也寫完了,最后我釋放了二個表面,并調用了 SDL_Quit 函數,清理我們所使用到其他資源。

            ?

            好了,運行一下程序,你不意外你就能看到如下的效果了。如果有什么錯誤的話,看看第一個教程。
            coorddemo.jpg

            posted @ 2007-03-05 19:00 大熊貓 閱讀(854) | 評論 (0)編輯 收藏


            ?(1)把類庫從 www.libsdl.org 上下載下來。
            ?(2)在VC2005中,添加一個庫文件目錄,和頭文件目錄。
            directory.jpg
            (3)把動態鏈接庫COPY到C:\\Windows\System下面。
            (4)建立一個Win32空項目。
            new_project.jpgempty_project.jpg

            (5)新建一個C++源文件。
            new_cpp.jpg
            敲下如下代碼
            #include <sdl.h>
            int?main(?int?argc,?char*
            ?args[]?)
            {
            ????
            // Start?SDL

            ????SDL_Init(?SDL_INIT_EVERYTHING?);
            ????
            ????
            // Quit?SDL

            ????SDL_Quit();
            ????
            ????
            return ? 0
            ;????
            }

            (6)設置一下工程的屬性
            project_properties.jpg
            multithreadeddll.jpg
            (7)加入二各引入庫
            linker.jpg
            (8)編譯運行一下,沒有錯誤的話就成功了,有錯誤的話,檢查前面的幾個步驟是否出錯了。
            posted @ 2007-03-04 19:45 大熊貓 閱讀(710) | 評論 (0)編輯 收藏

            拉登說:中國是全世界唯一絕對不能惹的國家。原因是這樣的,基地組織曾向中國派出五名恐怖分子,結果一人炸立交橋,轉暈于立交橋上;一人炸公交車,沒擠上車;一人炸超市,炸彈遙控器被盜;一人炸政府大樓,被保安狂揍,叫你討薪,叫你上訪;一人成功炸礦,死傷數百人,半年沒有任何新聞報道,潛回基地后被以撒謊罪處決了。最后一次曾經嘗試去炸廣州,結果一出火車站就被飛車黨把炸藥包搶了
            posted @ 2007-01-03 22:59 大熊貓 閱讀(699) | 評論 (0)編輯 收藏

            起因,昨天寫的一段小程序
            #include? < iostream >
            #include?
            < map >
            #include?
            < iterator >
            #include?
            < vector >
            #include?
            < algorithm >
            using ? namespace ?std;
            ostream?
            & operator << (ostream? & os, const ?pair < int , int > ? &
            mp)
            {
            ???os
            <<
            mp.first;
            ???os
            <<
            mp.second;
            ???
            return
            ?os;
            }

            int ?_tmain( int ?argc,?_TCHAR * ?argv[])
            {
            ???pair
            < int , int > ?mmp( 100 , 200
            );
            ???cout
            <<
            mmp;
            ???map
            < int , int >
            ?imap;
            ???map.insert(make_pair(
            100 , 100
            ));
            ???imap.insert(make_pair(
            22 , 123
            ));
            ???copy(imap.begin(),imap.end(),ostream_iterator
            < pair < int , int > ? > (cout, " \n "
            ));
            ???
            return ? 0
            ;
            }

            未能通過編譯,報的錯誤是:沒有找到接受“<未知>”類型的右操作數的運算符(或沒有可接受的轉換),百思不得其解,應為我覺得 我明明重載了<<運算符。再沒有辦法的情況下請教了CSDN論壇上的一些朋友,終于弄明白了其中的原因(可能這個知識點很菜,高手 不要見笑)。
            ostream_iterator<_Ty, _Elem, _Traits>& operator=(const _Ty& _Val)
            {
            ? *_Myostr << _Val;///~~~~~~~~~~~~~~~~~~~~~~~這是在ostream_iterator類源代碼當中,就是這里報錯了
            ? if (_Mydelim != 0)
            ? *_Myostr << _Mydelim;
            ? return
            }
            在上面那到程序當中_Val類型是pair<int,int> *_Myostr類型是ostream,顯然這里出錯,代表編譯器就好像沒有看到我的重載。出現以上現象的原因就是當編譯器看到*_Myostr<<_Val時候,它會先在自己的名字空間查找<<,這個估計發生在模板編譯的第一個階
            段(不知道是不是該這么說),它看到了一個范型的<<重載(估計),于是就不在去別的地方查找。可是到了實例化的時候,編譯器發現 沒有匹配的<<運算,于是就報錯了。如果我們把重載寫在std空間里,也就是和ostream_iterator一個空間里,編譯器在實例化的時 候也會把它納入考慮對象之一,這個時候它就會選擇我們的重載,一切就OK了。注意,如果編譯器在*_Myostr<<_Val所在名字空間沒有找到 <<重載,則它會進行類型相關查找。就是去定義*_Myostr類型或_Va類型的空間查找,再找不到那它就會去全局空間去查找。
            個人理解,不是很肯定,誠請高手糾正,感謝CSDN上周星星和晨星。

            posted @ 2006-12-29 19:42 大熊貓 閱讀(1872) | 評論 (13)編輯 收藏

            僅列出標題
            共5頁: 1 2 3 4 5 
            伊人精品久久久久7777| 亚洲AV成人无码久久精品老人 | 亚洲第一极品精品无码久久 | 久久这里只有精品首页| 久久AV高潮AV无码AV| 久久精品国产半推半就| 色播久久人人爽人人爽人人片aV| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 亚洲欧美久久久久9999| 国产精品久久久亚洲| 久久久99精品成人片中文字幕 | 国产精品免费看久久久| 亚洲精品美女久久久久99小说| 无码伊人66久久大杳蕉网站谷歌| 久久香蕉国产线看观看乱码| 亚洲国产婷婷香蕉久久久久久| 国产美女久久久| 国内精品伊人久久久久777| 久久久黄片| 国产欧美一区二区久久| 伊人伊成久久人综合网777| 久久午夜电影网| 2021精品国产综合久久| 亚洲精品国产字幕久久不卡| 人妻无码久久精品| 久久精品国产精品亚洲| 久久99精品国产99久久| 久久精品无码一区二区无码| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 亚洲天堂久久精品| 奇米综合四色77777久久| 人妻无码αv中文字幕久久琪琪布 人妻无码精品久久亚瑟影视 | 国产精品免费看久久久| 久久久噜噜噜久久中文福利| 久久天天躁夜夜躁狠狠| 偷窥少妇久久久久久久久| 无码任你躁久久久久久| 97香蕉久久夜色精品国产| 久久夜色精品国产| 2020久久精品亚洲热综合一本| 久久中文字幕精品|