(翻译的)因为现在你可能已经习惯于使用cin和cout的命令行驱动编程方式,这个教程会教你如何检查事件和句柄事件。
事件——顾名思义,简单的说就是某些事发生了,它可能是键盘按键按下、鼠标移动、改变窗口的大小或者是用户想要关闭窗口。
因为本身教程内容不多所以我只能从源码来理解事件驱动机制了:
#include"SDL.h" #include<string> //我们还是使用与之前一样的常量和表面定义 //常量表示屏幕大小和像素的位const int SCREEN_WIDTH=640; const int SCREEN_HEIGHT=480; const int SCREEN_BPP=32; //下面的表面将要被使用SDL_Surface *image=NULL; SDL_Surface *screen=NULL;
//将要被用到的事件结构SDL_Event ,其存储了供我们使用的事件数据SDL_Event event;
//原先的装载图片的函数SDL_Surface *load_image(std::string filename) { SDL_Surface *loadedImage=NULL; SDL_Surface *optimizedImage=NULL; loadedInmage=IMG_Load(filename.c_str); if(loadedImage!=NULL) { optimizedImage=SDl_DisplayFormat(loadedImage); SDL_FreeSurface(loadedImage); } return optimizedImage; }
//原先stick两表面的函数void apply_surface(int x,int y,SDL_Surface *source,SDL_Surface *destination) {
SDL_Rect offset; offset.x=x; offset.y=y; SDL_BlitSurface(source,NULL,destination,&offset); }
//初始化函数,这个函数开始SDL,建立窗口,设立标题并且如果发生错误的话返回falsebool init() { //初始化所有的SDL子系统 if(SDL_Init(SDL_INIT_EVETYTHING)==-1) { return false; } //建立窗口 screen=SDL_SetVideoMode(SCREEN_WIDTH,SCREEN_HEIGHT,SCREEN_BPP,SDL_SWSURFACE); //如果建立窗口的时候发生了错误 if(screen==NULL) { return false; } //设立窗口标题 SDL_WM_SetCaption("Event test",NULL); return true; }
//装载函数,它用来装载图片,并且在出问题的时候返回falsebool load_files() { //装载图片 image=load_image("X.png"); //如果装载过程中发生了错误 if(image==NULL) return false; return true; }
//在程序结尾用来清除的函数,它释放所有的表面并且停止SDLvoid clean_up() { //释放表面 SDL_FreeSurface(image); //退出SDL SDL_Quit(); }
int main(int argc,char *argv[]) { //用来保证程序等待一个终止 bool quit=fase;//此变量用来标记用户是否想要退出,一旦程序开始我们将其设置为false否则程序会马上终止
//初始化 if(init()==false) { return 1; } //装载图片 if(load_files()==false) { return 1; } //现在可以用前面教程的函数了 apply_surface(0,0,image,screen); //更新screen if(SDL_Flip(screen)==-1) { return 1; } //现在可以开始我们的循环了,此循环只有在用户设置quit为true的时候终止 while(quit==false) { while(SDL_PollEvent(&event)) {//从消息队列中取得事件 if(event.type==SDL_QUIT) {//当用户X了window的时候,事件类型就会变成SDL_QUIT quit=true; } }//while }//while //最后的清扫工作 clean_up(); return 0; }
除了SDL_PollEvent(&event)【事件轮询】,还有SDL_WaitEvent()【等待事件】和SDL_PeepEvent()【】 SDL_WaitEvent:等待不确定的下一次可用事件,返回1,当发生错误的时候返回0,如果传入的event区域不空,那个就会将下一次事件放入其中保存 SDL_PeepEvnet:提出事件,但事件本身仍然在队列中