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

来源:互联网 发布:博客app软件下载 编辑:程序博客网 时间:2024/05/29 19:21

(翻译的)因为现在你可能已经习惯于使用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,inty,SDL_Surface *source,SDL_Surface *destination)
{

SDL_Rect offset;
 offset.x=x;
 offset.y=y;
 SDL_BlitSurface(source,NULL,destination,&offset);
}

//初始化函数,这个函数开始SDL,建立窗口,设立标题并且如果发生错误的话返回false
boolinit()
{
 //初始化所有的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("Eventtest",NULL);
 return true;
}

//装载函数,它用来装载图片,并且在出问题的时候返回false
boolload_files()
{
 //装载图片
 image=load_image("X.png");
 //如果装载过程中发生了错误
 if(image==NULL)
  return false;
 return true;
}

//在程序结尾用来清除的函数,它释放所有的表面并且停止SDL
voidclean_up()
{
 //释放表面
 SDL_FreeSurface(image);
 //退出SDL
  SDL_Quit();
}

int main(int argc,char *argv[])
{
 //用来保证程序等待一个终止
 boolquit=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:提出事件,但事件本身仍然在队列中

 

原创粉丝点击