使用SDL打造游戏世界之入门篇 - 5
生活随笔
收集整理的這篇文章主要介紹了
使用SDL打造游戏世界之入门篇 - 5
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
同時,由于繪制的屏幕不能同時接受兩個函數(shù)的同時操作,我們需要其他兩個輔助函數(shù),用于在繪制前對屏幕進行鎖定,以及在繪制完成之后解除鎖定。這兩個 工作一般由SDL_MUSTLOK(SDL_Surface *screen)和SDL_UnlockSurface(SDL_Surface *screen)完成。使用如下兩個自定義的函數(shù)會更加簡單:
這樣,我們可以得到一個簡單的主程序框架如下:
如果對該程序進行編譯運行,那么只能得到一閃而過的一個黑色的窗口。我們需要對窗口進行繪制,并且對基本的鍵盤鼠標事件進行處理。
繪制的基本原理是,先在緩沖區(qū)繪制,再一次性將緩沖區(qū)繪制到屏幕上。這樣比起一次一個象素點在屏幕上繪圖的方式效率更高,速度更快,也不易出錯。首先使 用循環(huán)在screen所指向的surface(緩沖區(qū))上繪制,然后調(diào)用SDL_Flip函數(shù)將screen surface繪制到真實電腦屏幕上。SDL_Flip函數(shù)的作用是:在支持雙緩沖(double-buffering)的硬件上,建立flip并返回。 硬件將等待vertical retrace,然后在下一個視頻surface blit或者執(zhí)行鎖定返回前交換視頻緩沖區(qū)。如果硬件不支持雙緩沖,那么等同于調(diào)用SDL_UpdateRect(screen, 0, 0, 0, 0),即對整個screen的繪制區(qū)域進行刷新。
在SDL中對采用結(jié)構(gòu)SDL_Event來描述事件,并采用輪詢的機制對事件進行處理,程序中使用一個SDL_Event的實例(Instance)來檢查事件的發(fā)生:
輪詢采用while循環(huán)來檢查:
事件輪詢完畢之后,調(diào)用DrawScene(sreen)進行一次繪制。 更多內(nèi)容請看游戲開發(fā)、網(wǎng)絡(luò)游戲攻略、Solaris基礎(chǔ)知識入門專題,或進入討論組討論。
| void Slock(SDL_Surface *screen) { if ( SDL_MUSTLOCK(screen) ) { if ( SDL_LockSurface(screen) < 0 ) { return; } } } void Sulock(SDL_Surface *screen) { if ( SDL_MUSTLOCK(screen) ) { SDL_UnlockSurface(screen); } } |
這樣,我們可以得到一個簡單的主程序框架如下:
| #include <stdio.h> #include <stdlib.h> #include "SDL.h" // The functions are not shown to save space void DrawPixel(SDL_Surface *screen, int x, int y, Uint8 R, Uint8 G, Uint8 B); void Slock(SDL_Surface *screen); void Sulock(SDL_Surface *screen); int main(int argc, char *argv[]) { if ( SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO) < 0 ) { printf("Unable to init SDL: %s"n", SDL_GetError()); exit(1); } atexit(SDL_Quit); SDL_Surface *screen; screen=SDL_SetVideoMode(640,480,32,SDL_HWSURFACE|SDL_DOUBLEBUF); if ( screen == NULL ) { printf("Unable to set 640x480 video: %s"n", SDL_GetError()); exit(1); } // DRAWING GOES HERE return 0; } |
如果對該程序進行編譯運行,那么只能得到一閃而過的一個黑色的窗口。我們需要對窗口進行繪制,并且對基本的鍵盤鼠標事件進行處理。
繪制的基本原理是,先在緩沖區(qū)繪制,再一次性將緩沖區(qū)繪制到屏幕上。這樣比起一次一個象素點在屏幕上繪圖的方式效率更高,速度更快,也不易出錯。首先使 用循環(huán)在screen所指向的surface(緩沖區(qū))上繪制,然后調(diào)用SDL_Flip函數(shù)將screen surface繪制到真實電腦屏幕上。SDL_Flip函數(shù)的作用是:在支持雙緩沖(double-buffering)的硬件上,建立flip并返回。 硬件將等待vertical retrace,然后在下一個視頻surface blit或者執(zhí)行鎖定返回前交換視頻緩沖區(qū)。如果硬件不支持雙緩沖,那么等同于調(diào)用SDL_UpdateRect(screen, 0, 0, 0, 0),即對整個screen的繪制區(qū)域進行刷新。
| void DrawScene(SDL_Surface *screen) { Slock(screen); for(int x=0;x<640;x++) { for(int y=0;y<480;y++) { DrawPixel(screen, x,y,y/2,y/2,x/3); } } Sulock(screen); SDL_Flip(screen); } |
在SDL中對采用結(jié)構(gòu)SDL_Event來描述事件,并采用輪詢的機制對事件進行處理,程序中使用一個SDL_Event的實例(Instance)來檢查事件的發(fā)生:
| SDL_Event event; |
輪詢采用while循環(huán)來檢查:
| while ( SDL_PollEvent(&event)) { if ( event.type == SDL_QUIT) { //code here…. } if ( event.type == SDL_KEYDOWN) { //code here…. } //….. } |
事件輪詢完畢之后,調(diào)用DrawScene(sreen)進行一次繪制。 更多內(nèi)容請看游戲開發(fā)、網(wǎng)絡(luò)游戲攻略、Solaris基礎(chǔ)知識入門專題,或進入討論組討論。
轉(zhuǎn)載于:https://www.cnblogs.com/Henrya2/archive/2009/03/24/1420866.html
總結(jié)
以上是生活随笔為你收集整理的使用SDL打造游戏世界之入门篇 - 5的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在WinCE中实现Screen Rota
- 下一篇: [转载]C#中,让组合框(ComboBo