2.SDL遊戲開發:把代碼寫長一點(一)

接着上一篇講,裏面有幾個值得研究的函數,儘管理API裏已經說得很清楚了,調用SDL_Init()動態的加載和初始化SDL庫。 該函數帶有一組標記來表示哪部分須要激活:
SDL_INIT_AUDIO
SDL_INIT_VIDEO
SDL_INIT_CDROM
SDL_INIT_TIMER

在SDL。H  裏有這麼一段宏定義 php

/* These are the flags which may be passed to SDL_Init() -- you should
   specify the subsystems which you will be using in your application.
*/
#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_NOPARACHUTE    0x00100000      /* Don't catch fatal signals */
#define SDL_INIT_EVENTTHREAD    0x01000000      /* Not supported on all OS's */
#define SDL_INIT_EVERYTHING     0x0000FFFF

它能夠同時初始和加載幾個SDL庫,使用以下方法 SDL_Init( SDL_INIT_AUDIO | SDL_INIT_VIDEO); 使用完畢最後調用SDL_Quit();接着關於使用 SDL_SetVideoMode()函數,函數原型以下 安全

SDL_Surface *SDL_SetVideoMode(int width, int height, int bitsperpixel, Uint32 flags);
採用 SDL_SetVideoMode()來初始化屏幕。這個屏幕是特指SDL繪製的窗口,並非指整個屏幕。

  width,height是輸出高和寬,bitsperpixel 就是指bpp.即每點像素數,取值 8,16,32,值越大,說明屏幕表現力越豐富。它取決於顯示器或LCD的硬件性能。通常桌面顯示器是32.嵌入式設備的bpp能夠用fbset 命令來查看。在個人本本上結果以下 app

[root@localhost bluesky]# fbset
mode "1366x768"
    geometry 1366 768 1366 768 32
    timings 0 0 0 0 0 0 0
    rgba 8/16,8/8,8/0,0/0
endmode
[root@localhost bluesky]#

flags 常見取值有以下(能夠取多個值)  less

SDL_SWSURFACE :                  數據區創建在系統內存之上
SDL_HWSURFACE:                 數據區創建在顯存之上
SDL_FULLSCREEN:                   全屏模式
SDL_NOFRAME:                         取消邊框和標題欄

SDL_DOUBLEBUF:                      硬件雙緩衝,必須與SDL_HWSURFACE同時使用。                                                        /*還有其它一些值,就不一一例舉*/ ide

這個函數,差很少了,不理解不要緊,知道用就會,我但是實實大的實用主義,當初用SDL完成一個項目,都還不知道SDL是什麼意思?今天看條新聞說美國最大的悲劇,居然是都不知道下一屆領導人是誰?其實咱們也不同,知道了又怎麼樣,知之爲知之,不知爲不知,不知者無罪。                                                                                                         其實函數還沒講完,若是有看過Linux內核或Linux驅動的,咱們須要一雙犀利眼,眼前一亮 函數

SDL_Surface

必定是一個結構體,是的這麼簡單的問題還說,直接上結構體來得快一點 性能

Name
SDL_Surface -- Graphical Surface Structure
Structure Definition
typedef struct SDL_Surface {
        Uint32 flags;                           /* Read-only */
        SDL_PixelFormat *format;                /* Read-only */
        int w, h;                               /* Read-only */
        Uint16 pitch;                           /* Read-only */
        void *pixels;                           /* Read-write */

        /* clipping information */
        SDL_Rect clip_rect;                     /* Read-only */

        /* Reference count -- used when freeing surface */
        int refcount;                           /* Read-mostly */

	/* This structure also contains private fields not shown here */
} SDL_Surface;

暫放到這裏,這個結構體總要填滿的。接着講SDL_LoadBMP();這樣的函數,就亂費口水了,下面要講一個重量級的函數。 ui

int SDL_BlitSurface(SDL_Surface *src, SDL_Rect *srcrect, SDL_Surface *dst, SDL_Rect *dstrect);

src指的是要進行blit的源surface,dst指的是blit這個surface要去的目的地——另一個surface。這不SDL_Rect結構出來了吧!因爲過於簡單,        typedef struct{  Sint16  x,   y;      Uint16 w,  h;} SDL_Rect;                            由於顯示器一般是矩形的,因此,矩形是計算機圖形學中最基本的操做區域單元。這個結構很簡單,x和y是矩形的左上角座標。x從左到右增長;y從上到下增長。左上角的座標就是(0,0)——SDL中就是這樣的。w是矩形的寬,h是矩形的高。而對於整個函數來講,僅僅須要瞭解的是,若是srcrect爲空指針,意味着整個源surface將被blit;若是dstrect爲空指針,意味着源surface與目的surface的左上角重合(座標(0,0))。        blit是個有淵源的詞語,這個詞的本意就是塊(block)移動(transfer)的縮寫blt,由於這個縮寫缺乏元音很差讀,因此後來加上了i,就變成blit。      若是blit成功,則返回0;不然返回-1。 spa

如今回過頭去看sdl01.cpp 程序,SDL_Surface是否是填滿了呢??       .net

接着顯示,暫停,釋放,關閉就很少說了,函數太簡單。

那接下幹什麼呢?把代碼寫長一點,這不手癢了,還把代碼貼上,若是不想動手的直接去http://lazyfoo.net/SDL_tutorials/lesson02/index.php下,固然,作爲好學生的你,動動手仍是能夠的。

#include "SDL/SDL.h"
#include <string>
//設置屏幕屬性,此屏非彼屏
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;

SDL_Surface *message = NULL;
SDL_Surface *background = NULL;
SDL_Surface *screen = NULL;

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;

    loadedImage = SDL_LoadBMP( filename.c_str() );

    if( loadedImage != NULL ){
        //Create an optimized image
        optimizedImage = SDL_DisplayFormat( loadedImage );
        SDL_FreeSurface( loadedImage );
    }
  
    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;

    //塊移表面
    SDL_BlitSurface( source, NULL, destination, &offset );
}

int main( int argc, char* args[] )
{
    //初努化SDL子系統
    if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 ){
        return 1;
    }

    //設置屏幕屬性
    screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );

    if( screen == NULL ){
        return 1;
    }

    //設置窗口 caption
    SDL_WM_SetCaption( "Hello World", NULL );

    message = load_image( "hello.bmp" );
    background = load_image( "background.bmp" );

    //Apply the background to the screen
    apply_surface( 0, 0, background, screen );
    apply_surface( 320, 0, background, screen );
    apply_surface( 0, 240, background, screen );
    apply_surface( 320, 240, background, screen );

    //Apply the message to the screen
    apply_surface( 180, 140, message, screen );

    //顯示到屏幕
    if( SDL_Flip( screen ) == -1 ){
        return 1;
    }

    //等待2S
    SDL_Delay( 2000 );

    //釋放表面
    SDL_FreeSurface( message );
    SDL_FreeSurface( background );
    SDL_Quit();

    return 0;
}

保存爲sdl02.cpp ,而後

[bluesky@localhost sdl]$ g++ -o sdl02 sdl02.cpp -lSDL
[bluesky@localhost sdl]$ ./sdl02

先看效果,直接上圖來的實在,


有圖有真像,圖不知道害死了多少人,那個誰和誰。這圖不又把我又害了,出現如上一節同樣的現象,慢慢來了,知道有這什麼一回事就能夠了。總有一天會解決的。

把代碼寫長一點,從其中的三個if可知是爲安全起見,必竟人有失手,馬有失蹄,計算機也出問題的時候,總得寫個if足以體現咱們對代碼,對事,對人的嚴謹。

相關文章
相關標籤/搜索