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

SDL入門(轉,方便自己)

Posted on 2010-06-11 17:00 莫失莫忘 閱讀(563) 評論(0)  編輯 收藏 引用

第一章 基礎

初始化

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

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

SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);SDL_Init對應SDL_Quit(和SDL_QuitSubSystem)。SDL_Quit關閉所有子系統,必須在程序關閉前調用。

除此之外,我們還必須進行錯誤處理。很多SDL函數返回一個值指示成功與否。例如SDL_Init失敗時返回-1。每當SDL出錯時,錯誤信息被保存,并可用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最完整的子系統。下面的初始化過程是每個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);

}

初始化最佳視頻模式

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

例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文件

當SDL已經初始化,視頻模式已經選擇,下面的函數將讀取并顯示指定的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);

}

直接在顯示上繪圖

下面兩個函數實現在圖像平面的像素讀寫。它們被細心設計成可以用于所有色深。記住在使用前要先鎖定圖像平面,之后要解鎖。

在像素值和其紅、綠、藍值間轉換,使用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()在屏幕中心畫一個黃點

/* 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可以在多種平臺(Linux/X11, Win32, BeOS, MacOS Classic/Toolbox, MacOS X, FreeBSD/X11 and Solaris/X11)上創建和使用OpenGL上下文。這允許你在OpenGL程序中使用SDL的音頻、事件、線程和記時器,而這些通常是GLUT的任務。

初始化

和普通的初始化類似,但有三點不同:必須傳SDL_OPENGL參數給SDL_SetVideoMode;必須使用SDL_GL_SetAttribute指定一些GL屬性(深度緩沖區位寬,幀緩沖位寬等);如果您想使用雙緩沖,必須作為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 );

}

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

Copyright © 莫失莫忘

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲免费网址| 国产精品视频99| 亚洲最新在线视频| 亚洲高清一区二| 欧美国产亚洲精品久久久8v| 久久偷窥视频| 欧美电影免费观看高清| 欧美激情在线有限公司| 亚洲免费av片| 亚洲欧美日韩在线综合| 欧美专区在线观看一区| 浪潮色综合久久天堂| 欧美黄免费看| 国产欧美日韩在线视频| 伊人影院久久| 一本色道久久99精品综合| 亚洲综合国产| 欧美成人福利视频| 99精品久久久| 久久gogo国模啪啪人体图| 欧美电影免费观看网站| 国产精品久久久久久久久免费| 国产精品人人爽人人做我的可爱 | 欧美另类人妖| 国产精品一区二区久久国产| 亚洲激情第一页| 亚洲欧美另类在线观看| 免费观看一级特黄欧美大片| 亚洲美女中文字幕| 久久久久久有精品国产| 国产精品成人一区二区网站软件| 精品51国产黑色丝袜高跟鞋| 一本色道久久综合| 老司机免费视频一区二区三区| 亚洲精品欧美日韩专区| 久久九九久精品国产免费直播| 欧美日韩中文字幕精品| 精品av久久707| 欧美一区免费视频| 亚洲人成免费| 亚洲国内精品在线| 欧美电影电视剧在线观看| 亚洲国产美女| 亚洲激情一区二区| 一本色道久久综合亚洲精品高清| 亚洲一区在线播放| 国产精品久久二区二区| 午夜久久久久久| 亚洲电影成人| 一区在线免费| 久久精品盗摄| 亚洲嫩草精品久久| 欧美日韩在线观看一区二区| 亚洲乱码一区二区| 亚洲激情在线观看| 欧美—级在线免费片| 亚洲人成毛片在线播放女女| 免费亚洲婷婷| 久久久久久一区二区三区| 国内久久视频| 老司机一区二区三区| 久久久久久亚洲精品不卡4k岛国| 国产日韩欧美在线一区| 久久久777| 老司机精品视频网站| 亚洲精品国产系列| 99精品视频免费观看| 国产精品久久久久99| 午夜久久久久| 久久精品视频一| 亚洲精品国产精品乱码不99按摩| 亚洲精品免费观看| 国产精品一区二区黑丝| 欧美亚洲自偷自偷| 久久久久久**毛片大全| 亚洲黄一区二区| 日韩视频在线一区二区| 国产精品久久久久久久9999| 久久国产手机看片| 老司机午夜精品视频在线观看| 亚洲精品欧美一区二区三区| 一本色道久久综合一区| 国产主播一区二区| 亚洲激情在线激情| 国产精品福利久久久| 久久成人精品电影| 欧美99在线视频观看| 亚洲欧美三级伦理| 久久久久久久久伊人| 一区二区三区欧美视频| 亚洲欧美中文在线视频| 亚洲激情成人| 欧美一区二区日韩| 一区二区三欧美| 久久精品国产第一区二区三区| 亚洲精品乱码久久久久| 亚洲欧美怡红院| 亚洲高清免费| 免费在线观看一区二区| 欧美国产日韩精品| 亚洲大胆av| 久久国产精品72免费观看| 欧美一区午夜精品| 国产一区二区福利| 亚洲欧美日韩视频二区| 亚洲免费av电影| 亚洲无玛一区| 亚洲国产高清视频| 亚洲一区二区在线免费观看| 亚洲国产黄色| 欧美中文字幕在线观看| 中文精品99久久国产香蕉| 久久久夜夜夜| 久久激情视频久久| 国产精品嫩草99a| 日韩视频―中文字幕| 亚洲欧洲精品一区二区精品久久久 | 欧美日韩成人综合| 欧美成人精品不卡视频在线观看| 国产欧美日韩高清| 亚洲一区二区三区免费在线观看| 亚洲精品日本| 开心色5月久久精品| 久久一区二区三区四区| 国产精品一页| 亚洲综合国产激情另类一区| 亚洲一区二区四区| 欧美日韩精品在线视频| 最新国产乱人伦偷精品免费网站| 黑丝一区二区| 久久精品亚洲国产奇米99| 久久精品国产清高在天天线| 国产老女人精品毛片久久| 亚洲视频一二三| 午夜视频一区在线观看| 国产精品香蕉在线观看| 午夜精品一区二区三区四区| 欧美在线关看| 国内不卡一区二区三区| 欧美中文在线字幕| 欧美成人精品激情在线观看| 91久久国产自产拍夜夜嗨| 欧美jizz19性欧美| 亚洲激情成人| 亚洲午夜日本在线观看| 欧美视频导航| 午夜日韩在线观看| 久久亚洲一区二区三区四区| 亚洲国产精品久久人人爱蜜臀| 欧美成人精品不卡视频在线观看| 最近中文字幕mv在线一区二区三区四区| 亚洲精品在线一区二区| 欧美视频一区| 欧美一区二区三区四区在线观看| 久久国产主播精品| 亚洲电影天堂av| 国产伦精品一区二区三区照片91| 亚洲国产天堂久久国产91| 久久黄色小说| 欧美激情一区二区三区在线视频观看| 亚洲人成艺术| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 亚洲经典三级| 亚洲一区二区成人在线观看| 国产乱子伦一区二区三区国色天香| 性18欧美另类| 亚洲黄网站黄| 久久精品亚洲一区二区三区浴池| 伊人婷婷久久| 国产精品久久久久久妇女6080 | 欧美日韩综合久久| 欧美一区二区三区播放老司机| 欧美成人一二三| 宅男噜噜噜66一区二区| 国产亚洲激情在线| 欧美精品久久久久久久久老牛影院| 亚洲欧美成人一区二区三区| 亚洲丰满在线| 久久婷婷久久| 亚洲综合导航| 亚洲精品国精品久久99热| 国产欧美一区二区三区久久人妖| 欧美电影免费观看网站| 久久国产日本精品| 一区二区精品在线| 噜噜噜噜噜久久久久久91| 亚洲欧美日韩一区二区| 亚洲精品乱码久久久久久久久| 国产麻豆视频精品| 欧美日韩视频在线第一区| 久久综合一区| 久久高清国产| 亚洲一区二区影院| 夜夜爽夜夜爽精品视频| 亚洲电影下载| 免费观看在线综合| 久热国产精品视频| 久久激情久久| 久久精品国产欧美亚洲人人爽| 亚洲欧美日韩在线观看a三区|