您的位置:首页 > 编程语言

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

2017-08-05 17:41 176 查看
(翻译的)因为现在你可能已经习惯于使用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,建立窗口,设立标题并且如果发生错误的话返回false
bool
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;

}
//装载函数,它用来装载图片,并且在出问题的时候返回false
bool
load_files()

{
 //装载图片
 image=load_image("X.png");
 //如果装载过程中发生了错误
 if(image==NULL)

  return false;

 return true;

}
//在程序结尾用来清除的函数,它释放所有的表面并且停止SDL
void
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:提出事件,但事件本身仍然在队列中

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: