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

            第一章 基礎(chǔ)

            初始化

            SDL由八個(gè)子系統(tǒng)組成——音頻、CDROM、事件處理、文件I/O、游戲桿、線程、記時(shí)器和視頻。使用前必須調(diào)用SDL_Init或 SDL_InitSubSystem初始化。SDL_Init必須早于其他所有SDL調(diào)用,它將自動(dòng)初始化事件處理、文件I/O和線程子系統(tǒng),并根據(jù)參數(shù) 選擇啟動(dòng)其他子系統(tǒng)。例如,初始化缺省和視頻子系統(tǒng):

            SDL_Init(SDL_INIT_VIDEO);初始化缺省、視頻和記時(shí)器子系統(tǒng):

            SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);SDL_Init對(duì)應(yīng)SDL_Quit(和SDL_QuitSubSystem)。SDL_Quit關(guān)閉所有子系統(tǒng),必須在程序關(guān)閉前調(diào)用。

            除此之外,我們還必須進(jìn)行錯(cuò)誤處理。很多SDL函數(shù)返回一個(gè)值指示成功與否。例如SDL_Init失敗時(shí)返回-1。每當(dāng)SDL出錯(cuò)時(shí),錯(cuò)誤信息被保存,并可用SDL_GetError取得。

            例1-1 初始化SDL

            #include "SDL.h" /* All SDL App's need this */

            #include <stdio.h>

            int main() {

            printf("Initializing SDL.\n");

            /* Initialize defaults, Video and Audio */

            if((SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)==-1)) {

            printf("Could not initialize SDL: %s.\n", SDL_GetError());

            exit(-1);

            }

            printf("SDL initialized.\n");

            printf("Quiting SDL.\n");

            /* Shutdown all subsystems */

            SDL_Quit();

            printf("Quiting....\n");

            exit(0);

            }

            第二章 圖像和視頻

            SDL Vidow顯示

            初始化SDL Video顯示

            視頻是最常用的部分,也是SDL最完整的子系統(tǒng)。下面的初始化過(guò)程是每個(gè)SDL程序都要做的,即使可能有些不同。

            例2-1 初始化視頻

            SDL_Surface *screen;

            /* Initialize the SDL library */

            if( SDL_Init(SDL_INIT_VIDEO) < 0 ) {

            fprintf(stderr,

            "Couldn't initialize SDL: %s\n", SDL_GetError());

            exit(1);

            }

            /* Clean up on exit */

            atexit(SDL_Quit);

            /*

            * Initialize the display in a 640x480 8-bit palettized mode,

            * requesting a software surface

            */

            screen = SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE);

            if ( screen == NULL ) {

            fprintf(stderr, "Couldn't set 640x480x8 video mode: %s\n",

            SDL_GetError());

            exit(1);

            }

            初始化最佳視頻模式

            如果你希望某種色深(顏色數(shù))但如果用戶的顯示器不支持也可以接受其他色深,使用加SDL_ANYFORMAT參數(shù)的SDL_SetVideoMode。您還可以用SDL_VideoModeOK來(lái)找到與請(qǐng)求模式最接近的模式。

            例2-2 初始化最佳視頻模式

            /* Have a preference for 8-bit, but accept any depth */

            screen = SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE|SDL_ANYFORMAT);

            if ( screen == NULL ) {

            fprintf(stderr, "Couldn't set 640x480x8 video mode: %s\n",

            SDL_GetError());

            exit(1);

            }

            printf("Set 640x480 at %d bits-per-pixel mode\n",

            screen->format->BitsPerPixel);

            讀取并顯示BMP文件

            當(dāng)SDL已經(jīng)初始化,視頻模式已經(jīng)選擇,下面的函數(shù)將讀取并顯示指定的BMP文件。

            例2-3 讀取并顯示BMP文件

            void display_bmp(char *file_name)

            {

            SDL_Surface *image;

            /* Load the BMP file into a surface */

            image = SDL_LoadBMP(file_name);

            if (image == NULL) {

            fprintf(stderr, "Couldn't load %s: %s\n", file_name, SDL_GetError());

            return;

            }

            /*

            * Palettized screen modes will have a default palette (a standard

            * 8*8*4 colour cube), but if the image is palettized as well we can

            * use that palette for a nicer colour matching

            */

            if (image->format->palette && screen->format->palette) {

            SDL_SetColors(screen, image->format->palette->colors, 0,

            image->format->palette->ncolors);

            }

            /* Blit onto the screen surface */

            if(SDL_BlitSurface(image, NULL, screen, NULL) < 0)

            fprintf(stderr, "BlitSurface error: %s\n", SDL_GetError());

            SDL_UpdateRect(screen, 0, 0, image->w, image->h);

            /* Free the allocated BMP surface */

            SDL_FreeSurface(image);

            }

            直接在顯示上繪圖

            下面兩個(gè)函數(shù)實(shí)現(xiàn)在圖像平面的像素讀寫(xiě)。它們被細(xì)心設(shè)計(jì)成可以用于所有色深。記住在使用前要先鎖定圖像平面,之后要解鎖。

            在像素值和其紅、綠、藍(lán)值間轉(zhuǎn)換,使用SDL_GetRGB()和SDL_MapRGB()。

            例2-4 getpixel()

            /*

            * Return the pixel value at (x, y)

            * NOTE: The surface must be locked before calling this!

            */

            Uint32 getpixel(SDL_Surface *surface, int x, int y)

            {

            int bpp = surface->format->BytesPerPixel;

            /* Here p is the address to the pixel we want to retrieve */

            Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;

            switch(bpp) {

            case 1:

            return *p;

            case 2:

            return *(Uint16 *)p;

            case 3:

            if(SDL_BYTEORDER == SDL_BIG_ENDIAN)

            return p[0] << 16 | p[1] << 8 | p[2];

            else

            return p[0] | p[1] << 8 | p[2] << 16;

            case 4:

            return *(Uint32 *)p;

            default:

            return 0; /* shouldn't happen, but avoids warnings */

            }

            }

            例2-5 putpixel()

            /*

            * Set the pixel at (x, y) to the given value

            * NOTE: The surface must be locked before calling this!

            */

            void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel)

            {

            int bpp = surface->format->BytesPerPixel;

            /* Here p is the address to the pixel we want to set */

            Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;

            switch(bpp) {

            case 1:

            *p = pixel;

            break;

            case 2:

            *(Uint16 *)p = pixel;

            break;

            case 3:

            if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {

            p[0] = (pixel >> 16) & 0xff;

            p[1] = (pixel >> 8) & 0xff;

            p[2] = pixel & 0xff;

            } else {

            p[0] = pixel & 0xff;

            p[1] = (pixel >> 8) & 0xff;

            p[2] = (pixel >> 16) & 0xff;

            }

            break;

            case 4:

            *(Uint32 *)p = pixel;

            break;

            }

            }

            例2-6 使用上面的putpixel()在屏幕中心畫(huà)一個(gè)黃點(diǎn)

            /* Code to set a yellow pixel at the center of the screen */

            int x, y;

            Uint32 yellow;

            /* Map the color yellow to this display (R=0xff, G=0xFF, B=0x00)

            Note: If the display is palettized, you must set the palette first.

            */

            yellow = SDL_MapRGB(screen->format, 0xff, 0xff, 0x00);

            x = screen->w / 2;

            y = screen->h / 2;

            /* Lock the screen for direct access to the pixels */

            if ( SDL_MUSTLOCK(screen) ) {

            if ( SDL_LockSurface(screen) < 0 ) {

            fprintf(stderr, "Can't lock screen: %s\n", SDL_GetError());

            return;

            }

            }

            putpixel(screen, x, y, yellow);

            if ( SDL_MUSTLOCK(screen) ) {

            SDL_UnlockSurface(screen);

            }

            /* Update just the part of the display that we've changed */

            SDL_UpdateRect(screen, x, y, 1, 1);

            return;


            并用SDL和OpenGL

            SDL可以在多種平臺(tái)(Linux/X11, Win32, BeOS, MacOS Classic/Toolbox, MacOS X, FreeBSD/X11 and Solaris/X11)上創(chuàng)建和使用OpenGL上下文。這允許你在OpenGL程序中使用SDL的音頻、事件、線程和記時(shí)器,而這些通常是GLUT的任務(wù)。

            初始化

            和普通的初始化類似,但有三點(diǎn)不同:必須傳SDL_OPENGL參數(shù)給SDL_SetVideoMode;必須使用SDL_GL_SetAttribute指定一些GL屬性(深度緩沖區(qū)位寬,幀緩沖位寬等);如果您想使用雙緩沖,必須作為GL屬性指定

            例2-7 初始化SDL加OpenGL

            /* Information about the current video settings. */

            const SDL_VideoInfo* info = NULL;

            /* Dimensions of our window. */

            int width = 0;

            int height = 0;

            /* Color depth in bits of our window. */

            int bpp = 0;

            /* Flags we will pass into SDL_SetVideoMode. */

            int flags = 0;

            /* First, initialize SDL's video subsystem. */

            if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) {

            /* Failed, exit. */

            fprintf( stderr, "Video initialization failed: %s\n",

            SDL_GetError( ) );

            quit_tutorial( 1 );

            }

            /* Let's get some video information. */

            info = SDL_GetVideoInfo( );

            if( !info ) {

            /* This should probably never happen. */

            fprintf( stderr, "Video query failed: %s\n",

            SDL_GetError( ) );

            quit_tutorial( 1 );

            }

            /*

            * Set our width/height to 640/480 (you would

            * of course let the user decide this in a normal

            * app). We get the bpp we will request from

            * the display. On X11, VidMode can't change

            * resolution, so this is probably being overly

            * safe. Under Win32, ChangeDisplaySettings

            * can change the bpp.

            */

            width = 640;

            height = 480;

            bpp = info->vfmt->BitsPerPixel;

            /*

            * Now, we want to setup our requested

            * window attributes for our OpenGL window.

            * We want *at least* 5 bits of red, green

            * and blue. We also want at least a 16-bit

            * depth buffer.

            *

            * The last thing we do is request a double

            * buffered window. '1' turns on double

            * buffering, '0' turns it off.

            *

            * Note that we do not use SDL_DOUBLEBUF in

            * the flags to SDL_SetVideoMode. That does

            * not affect the GL attribute state, only

            * the standard 2D blitting setup.

            */

            SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 );

            SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 );

            SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 );

            SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 );

            SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );

            /*

            * We want to request that SDL provide us

            * with an OpenGL window, in a fullscreen

            * video mode.

            *

            * EXERCISE:

            * Make starting windowed an option, and

            * handle the resize events properly with

            * glViewport.

            */

            flags = SDL_OPENGL | SDL_FULLSCREEN;

            /*

            * Set the video mode

            */

            if( SDL_SetVideoMode( width, height, bpp, flags ) == 0 ) {

            /*

            * This could happen for a variety of reasons,

            * including DISPLAY not being set, the specified

            * resolution not being available, etc.

            */

            fprintf( stderr, "Video mode set failed: %s\n",

            SDL_GetError( ) );

            quit_tutorial( 1 );

            }


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            posts - 15, comments - 0, trackbacks - 0, articles - 0

            Copyright © 莫失莫忘

            性做久久久久久久久| 69久久精品无码一区二区| 国产精品一区二区久久国产| 综合久久给合久久狠狠狠97色| 久久免费小视频| 国产精品无码久久综合| 亚洲午夜久久久久久久久电影网| 久久97久久97精品免视看| 国产精品久久久久久| 国产精品青草久久久久婷婷 | 久久91精品国产91久久小草| 精产国品久久一二三产区区别| 国产精品久久久久a影院| 香蕉久久久久久狠狠色| 亚洲?V乱码久久精品蜜桃| 中文成人久久久久影院免费观看 | 久久www免费人成看国产片| 国产精品久久久天天影视香蕉| 99久久人人爽亚洲精品美女| 品成人欧美大片久久国产欧美| 精品水蜜桃久久久久久久| 开心久久婷婷综合中文字幕| 一本综合久久国产二区| 亚洲午夜久久久久久久久电影网| 久久丫精品国产亚洲av| 国产L精品国产亚洲区久久| 天天综合久久一二三区| 少妇久久久久久被弄高潮| 国产精品视频久久久| 亚洲成av人片不卡无码久久| 久久久久久精品久久久久| 婷婷综合久久狠狠色99h| 久久国产精品无码网站| 成人午夜精品无码区久久| 久久综合狠狠色综合伊人| 午夜精品久久久久| 国产精品久久久天天影视| 精品久久久久久国产| aaa级精品久久久国产片| 色偷偷91久久综合噜噜噜噜| 精品久久久久久中文字幕|