SDL学习(三)事件驱动编程

xiaoxiao2021-02-28  104

(翻译的)因为现在你可能已经习惯于使用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:提出事件,但事件本身仍然在队列中

 

转载请注明原文地址: https://www.6miu.com/read-31790.html

最新回复(0)