使用SDL打造游戏世界之入门篇 - 4
生活随笔
收集整理的這篇文章主要介紹了
使用SDL打造游戏世界之入门篇 - 4
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡單的象素繪制
?下文從使用SDL的編程函數開始,介紹了如何使用SDL在屏幕上進行象素繪制的基本知識,并給出了一個簡單的例子。
如果要在VC中用SDL庫,必須在源文件頭部包含以下頭文件:
初始化SDL是通過SDL_Init()函數來實現的。如果初始化失敗,函數返回值為0。函數只接受初始化對象作為參數。如果要 初始化視頻屏幕,傳入常數SDL_INIT_VIDEO作為參數;初始化音頻,傳入常數SDL_INIT_AUDIO;如果同時初始化視頻和音頻,傳入 SDL_INIT_VIDEO|SDL_INIT_AUDIO。其它還有一些量可以傳入作為參數的(如果同時傳入多個量要使用|將它們隔開):
如果我們要初始化,可以使用如下語句:
如果初始化失敗,則函數SDL_GetError()返回關于錯誤的一個字符串提示信息。
當從你的C++語句返回時,記住使用SDL_Quit()進行程序的清理工作,否則就會出現奇怪的現象。可以使用如下語句進行描述:
這樣的話就不需要在main函數中每個return語句前加入SDL_Quit()了。
在SDL中你可以擁有多個surface,每件物體都是一個surface。你可以在一個surface上進行繪圖或者在其他surface上繪制另外 一個surface。程序中一個surface的表示即為指向結構SDL_Surface的指針。如果要獲得一個surface只要如下定義:
如果需要對screen所指向的surface上進行繪圖,你可以使用函數SDL_SetVideoMode()來設置屏幕分辨率:
前三個參數分別為屏幕寬度,高度和屏幕上的每象素包含的位數(bits per pixel, BPP)。如果填入0則SDL自動選擇最合適的BPP。第四個參數用來給出某些特殊標志位。如果要在屏幕上進行圖形繪制就必須使用 SDL_HWSURFACE或者SDL_SWSURFACE。以下給出了一個你可以指定的標志位:
SDL_SWSURFACE:在系統內存中創建視頻Surface
SDL_HWSURFACE:在視頻內存中創建視頻Surface
SDL_ASYNCBLIT:允許在顯示surface上使用異步更新。在單CPU機器上會變慢,但在SMP系統上會有顯著的性能提升。
SDL_ANYFORMAT:一般的,如果指定位數的bpp不可用,那么SDL就會模擬使用陰影surface。如果傳入SDL_ANYFORMAT就會阻止這樣做,并且不管色深強制使用視頻surface。
SDL_HWPALETTE:給予SDL特許的畫盤的訪問權,使用這個標志位就不需要總是使用SDL_SetColors或者SDL_SetPalette來獲取所需的顏色。
SDL_DOUBLEBUF:允許硬件雙緩沖;只是和SDL_HWSURFACE一起使用時比較有用。調用SDL_Flip將會flip整個緩沖并且更 新屏幕。所有的繪制將會在當前未顯示的surface上發生。如果雙緩沖被允許,那么SDL_Flip將會對整個屏幕進行SDL_UpdateRect操 作。
SDL_FULLSCREEN:SDL將會嘗試使用全屏模式。如果硬件分辨率的調整由于某種情況無法完成,那么下一個稍高的分辨率將會被使用,并且顯示窗口將會處于一個黑色背景的中央。
SDL_OPENGL:創建一個OPENGL rendering context。使用前必須已經使用SDL_GL_SetAttribute對OpenGL視頻屬性進行設置。
SDL_OPENGLBLIT: 和上一個選項一樣創建一個 OPENGL rendering context, 但是允許使用正常的blitting操作。
SDL_RESIZABLE; 創建一個可伸縮大小的窗口。當用戶調整窗口大小時,將會觸發一個SDL_VIDEORESIZE事件,SDL_SetVideoMode將會使用新大小作為參數再次被調用。
SDL_NOFRAME: 如果可以的話,SDL_NOFRAME將會創建出一個沒有標題欄和邊界修飾的窗口,全屏方式自動設置此標志位。
建議使用SDL_HWSURFACE | SDL_DOUBLEBUF,如果出現錯誤可以嘗試使用SDL_SWSURFACE。
SDL_SetVideoMode如果操作成功,則返回一個指向SDL_Surface的指針,否則的話返回NULL。可以使用如下語句檢查發生的錯誤:
以上介紹了如何對SDL進行初始化,下面可以開始繪制了。但是還有一些需要注意的關鍵地方,首先是一些SDL使用的容易讓人產生迷惑的數據類型:
還有,有的時候如果初始化出現錯誤,沒必要完全退出。例如當初始化了SDL_INIT_VIDEO而沒有初始化SDL_INIT_AUDIO,那么你可 以繼續這個錯誤只是沒有音頻而已。要檢查是否音頻初始化是否成功,可以使用SDL_WasInit()函數來檢查。下面是一個例子:
你可以在程序初始化的某些地方加入以上語句。
以下是SDL介紹中進行象素繪制的語句,可以暫時不需要完全了解其中的意思:
通過這個函數,可以傳遞給surface要繪制的點的(x,y)坐標和RGB值。 更多內容請看游戲開發、網絡游戲攻略、Solaris基礎知識入門專題,或進入討論組討論。
?下文從使用SDL的編程函數開始,介紹了如何使用SDL在屏幕上進行象素繪制的基本知識,并給出了一個簡單的例子。
如果要在VC中用SDL庫,必須在源文件頭部包含以下頭文件:
| #include “SDL.h” |
初始化SDL是通過SDL_Init()函數來實現的。如果初始化失敗,函數返回值為0。函數只接受初始化對象作為參數。如果要 初始化視頻屏幕,傳入常數SDL_INIT_VIDEO作為參數;初始化音頻,傳入常數SDL_INIT_AUDIO;如果同時初始化視頻和音頻,傳入 SDL_INIT_VIDEO|SDL_INIT_AUDIO。其它還有一些量可以傳入作為參數的(如果同時傳入多個量要使用|將它們隔開):
| SDL_INIT_TIMER SDL_INIT_AUDIO SDL_INIT_VIDEO SDL_INIT_CDROM SDL_INIT_JOYSTICK SDL_INIT_NOPARACHUATE SDL_INIT_EVENTTHREAD SDL_INIT_EVERYTHING |
如果我們要初始化,可以使用如下語句:
| if ( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO) < 0 ) { printf(“Unable to init SDL: %s"n”, SDL_GetError()); return 1; } |
如果初始化失敗,則函數SDL_GetError()返回關于錯誤的一個字符串提示信息。
當從你的C++語句返回時,記住使用SDL_Quit()進行程序的清理工作,否則就會出現奇怪的現象。可以使用如下語句進行描述:
| atexit(SDL_Quit); |
這樣的話就不需要在main函數中每個return語句前加入SDL_Quit()了。
在SDL中你可以擁有多個surface,每件物體都是一個surface。你可以在一個surface上進行繪圖或者在其他surface上繪制另外 一個surface。程序中一個surface的表示即為指向結構SDL_Surface的指針。如果要獲得一個surface只要如下定義:
| SDL_Surface *screen; |
如果需要對screen所指向的surface上進行繪圖,你可以使用函數SDL_SetVideoMode()來設置屏幕分辨率:
| screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); |
前三個參數分別為屏幕寬度,高度和屏幕上的每象素包含的位數(bits per pixel, BPP)。如果填入0則SDL自動選擇最合適的BPP。第四個參數用來給出某些特殊標志位。如果要在屏幕上進行圖形繪制就必須使用 SDL_HWSURFACE或者SDL_SWSURFACE。以下給出了一個你可以指定的標志位:
SDL_SWSURFACE:在系統內存中創建視頻Surface
SDL_HWSURFACE:在視頻內存中創建視頻Surface
SDL_ASYNCBLIT:允許在顯示surface上使用異步更新。在單CPU機器上會變慢,但在SMP系統上會有顯著的性能提升。
SDL_ANYFORMAT:一般的,如果指定位數的bpp不可用,那么SDL就會模擬使用陰影surface。如果傳入SDL_ANYFORMAT就會阻止這樣做,并且不管色深強制使用視頻surface。
SDL_HWPALETTE:給予SDL特許的畫盤的訪問權,使用這個標志位就不需要總是使用SDL_SetColors或者SDL_SetPalette來獲取所需的顏色。
SDL_DOUBLEBUF:允許硬件雙緩沖;只是和SDL_HWSURFACE一起使用時比較有用。調用SDL_Flip將會flip整個緩沖并且更 新屏幕。所有的繪制將會在當前未顯示的surface上發生。如果雙緩沖被允許,那么SDL_Flip將會對整個屏幕進行SDL_UpdateRect操 作。
SDL_FULLSCREEN:SDL將會嘗試使用全屏模式。如果硬件分辨率的調整由于某種情況無法完成,那么下一個稍高的分辨率將會被使用,并且顯示窗口將會處于一個黑色背景的中央。
SDL_OPENGL:創建一個OPENGL rendering context。使用前必須已經使用SDL_GL_SetAttribute對OpenGL視頻屬性進行設置。
SDL_OPENGLBLIT: 和上一個選項一樣創建一個 OPENGL rendering context, 但是允許使用正常的blitting操作。
SDL_RESIZABLE; 創建一個可伸縮大小的窗口。當用戶調整窗口大小時,將會觸發一個SDL_VIDEORESIZE事件,SDL_SetVideoMode將會使用新大小作為參數再次被調用。
SDL_NOFRAME: 如果可以的話,SDL_NOFRAME將會創建出一個沒有標題欄和邊界修飾的窗口,全屏方式自動設置此標志位。
建議使用SDL_HWSURFACE | SDL_DOUBLEBUF,如果出現錯誤可以嘗試使用SDL_SWSURFACE。
SDL_SetVideoMode如果操作成功,則返回一個指向SDL_Surface的指針,否則的話返回NULL。可以使用如下語句檢查發生的錯誤:
| If ( screen == NULL ) { printf(“Unable to set 640x480 video: %s"n”, SDL_GetError()); return 1; } |
以上介紹了如何對SDL進行初始化,下面可以開始繪制了。但是還有一些需要注意的關鍵地方,首先是一些SDL使用的容易讓人產生迷惑的數據類型:
| Uint8 – 相當于unsigned char Uint16 – 16位(2字節) unsigned integer Uint32 – 32位(4字節) unsigned integer Uint64 - 64位(8字節) unsigned integer Sint8 – 相當于signed char Sint16 – 16位(2字節) signed integer Sint32 – 32位(4字節) signed integer Sint64 - 64位(8字節) signed integer |
還有,有的時候如果初始化出現錯誤,沒必要完全退出。例如當初始化了SDL_INIT_VIDEO而沒有初始化SDL_INIT_AUDIO,那么你可 以繼續這個錯誤只是沒有音頻而已。要檢查是否音頻初始化是否成功,可以使用SDL_WasInit()函數來檢查。下面是一個例子:
| Uint32 init = SDL_WasInit(SDL_INIT_AUDIO); If (init & SDL_INIT_AUDIO) { sound = 1; } else { sound = 0; } |
你可以在程序初始化的某些地方加入以上語句。
以下是SDL介紹中進行象素繪制的語句,可以暫時不需要完全了解其中的意思:
| void DrawPixel(SDL_Surface *screen, int x, int y, Uint8 R, Uint8 G, Uint8 B) { Uint32 color = SDL_MapRGB(screen->format, R, G, B); switch (screen->format->BytesPerPixel) { case 1: // Assuming 8-bpp { Uint8 *bufp; bufp = (Uint8 *)screen->pixels + y*screen->pitch + x; *bufp = color; } break; case 2: // Probably 15-bpp or 16-bpp { Uint16 *bufp; bufp = (Uint16 *)screen->pixels + y*screen->pitch/2 + x; *bufp = color; } break; case 3: // Slow 24-bpp mode, usually not used { Uint8 *bufp; bufp = (Uint8 *)screen->pixels + y*screen->pitch + x * 3; if(SDL_BYTEORDER == SDL_LIL_ENDIAN) { bufp[0] = color; bufp[1] = color >> 8; bufp[2] = color >> 16; } else{ bufp[2] = color; bufp[1] = color >> 8; bufp[0] = color >> 16; } } break; case 4: // Probably 32-bpp { Uint32 *bufp; bufp = (Uint32 *)screen->pixels + y*screen->pitch/4 + x; *bufp = color; } break; } } |
通過這個函數,可以傳遞給surface要繪制的點的(x,y)坐標和RGB值。 更多內容請看游戲開發、網絡游戲攻略、Solaris基礎知識入門專題,或進入討論組討論。
轉載于:https://www.cnblogs.com/Henrya2/archive/2009/03/24/1420864.html
總結
以上是生活随笔為你收集整理的使用SDL打造游戏世界之入门篇 - 4的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Silverlight3 Tools D
- 下一篇: owls-uddi-matchmaker