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:提出事件,但事件本身仍然在队列中
事件——顾名思义,简单的说就是某些事发生了,它可能是键盘按键按下、鼠标移动、改变窗口的大小或者是用户想要关闭窗口。
因为本身教程内容不多所以我只能从源码来理解事件驱动机制了:
#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:提出事件,但事件本身仍然在队列中
相关文章推荐
- Java学习疑惑(8)----可视化编程, 对Java中事件驱动模型的理解
- Chap 7 学习笔记-事件驱动编程技术和回送
- 三. 学习Unix/Linux编程之事件驱动编程:编写一个视频游戏
- Java学习笔记(15)Event-Driven Programming and Animations 事件驱动编程与动画
- 事件驱动的编程模型(学习)
- 韩顺平 javascript教学视频_学习笔记27_dom对象(window对象3.history.location.navigator.screen.event)_js事件驱动编程
- 事件驱动编程---队列应用--银行排队模拟--学习与思考
- Java学习疑惑(8)----可视化编程, 对Java中事件驱动模型的理解
- LINUX 网络编程---多路复用和信号驱动I/O(王德仙)2012-04-07 客户端和服务器端编写完成,明天开始学习poll 和epoll
- 驱动编程学习笔记之IO处理
- Reactive框架:简化异步及事件驱动编程
- windows驱动编程学习(2)--------第一个驱动 hello
- 事件与状态机 事件驱动编程
- Reactive框架:简化异步及事件驱动编程
- Reactive框架:简化异步及事件驱动编程
- Reactive框架:简化异步及事件驱动编程
- 事件驱动的JScript面对象编程
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Linux内核抢占实现机制分析
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】深入剖析Linux中断机制之二--Linux中断的组织形式
- 驱动编程学习----注册表操作