文档章节

SDL编程四(事件)

来来叔叔
 来来叔叔
发布于 2017/08/04 23:56
字数 374
阅读 4
收藏 0
 

SDL中常用的事件类型为键盘和鼠标。

SDL中描述事件的数据结构为SDL_Event,是一个union类型(SDL_events.h/SDL_Event),包含了keyboard,motion(mouse),resize等事件的定义。
typedef union{
Uint8 type;//SDL_EventType
SDL_ActiveEvent active;
SDL_KeyboardEvent key;
SDL_MouseMotionEvent motion;
SDL_MouseButtonEvent button;
SDL_JoyAxisEvent jaxis;
SDL_JoyBallEvent jball;
SDL_JoyHatEvent jhat;
SDL_JoyButtonEvent jbutton;
SDL_ResizeEvent resize;
SDL_ExposeEvent expose;
SDL_QuitEvent quit;
SDL_UserEvent user;
SDL_SysWMEvent syswm;
} SDL_Event;

keyboard事件
该事件数据结构描述如下(SDL_keyboard.h) :
typedef struct{
Uint8 type;//SDL_KEYUP or SDL_KEYDOWN
Uint8 state;//like above
SDL_keysym keysym;//描述按键的数据结构
} SDL_KeyboardEvent;

SDL_keysym定义了描述按键的数据结构(SDL_keysym.h):
typedef struct{
Uint8 scancode;//机器内部使用的按键值
SDLKey sym;//按键值的枚举类型
SDLMod mod;//组合键状态
Uint16 unicode;
} SDL_keysym;

事件轮询可采用SDL_PollEvent()函数,用于查询事件队列中的事件。
使用时一般先根据event.type判断事件类型,如为SDL_KEYDOWN/SDL_KEYUP类型等,然后可进一步获取键值event.key.keysym.sym,可用SDL_GetKeyName(event.key.keysym.sym)获取描述键值的字条串。
example:
int quit = 0;
SDL_Event event;

while(!quit)
{
   while (SDL_PollEvent(&event))//轮询事件
   {
    switch (event.type)//事件类型
    {
    case SDL_KEYDOWN:
     printf("press: %s\n",SDL_GetKeyName(event.key.keysym.sym));
     break;
    case SDL_KEYUP:
     printf("release: %s\n",SDL_GetKeyName(event.key.keysym.sym));
     break;
    case SDL_QUIT:
     quit = 1;
     break;
    case SDL_MOUSEBUTTONDOWN:
     printf("mouse down:(%d,%d)\n",
      event.button.x,event.button.y);
     break;
    case SDL_MOUSEMOTION:
     printf("mouse move:(%d,%d) to (%d,%d)\n",
      event.motion.xrel,event.motion.yrel,
      event.motion.x, event.motion.y);
     break;
    default:
     break;
    }
   }
}
    另外一个事件处理函数为SDL_WaitEvent,区别在于该函数在消息队列中没有消息的情况下会等待,直到有消息为止;而SDL_PollEvent是则不管有没有消息都马上返回。


© 著作权归作者所有

共有 人打赏支持
来来叔叔
粉丝 0
博文 100
码字总数 55732
作品 0
广州
高级程序员
SDL系列讲解(十一) SDL_QUIT流程

明天会将自己的很早的一部小说发出,一次发出写的所有的六章,如果时间,或者某天突然觉得可以续写了,那么就是它又一次起航了。 工作期间,码了一个记录工作的小说,有兴趣的可以阅读。当然...

代码GG陆晓明
2017/10/28
0
0
SDL系列讲解(十) 按键处理流程

SDL系列讲解(一) 简介 SDL系列讲解(二) 环境搭建 SDL系列讲解(三) 工具安装 SDL是什么,能干什么,为什么我们要学习它? SDL系列讲解(四) demo讲解 SDL系列讲解(五) 调试c代码 SD...

代码GG陆晓明
2017/10/28
0
0
SDL+Rose:让跨平台编程返璞归真

十多年前,只要学会C/C++,基本就能写所有平台程序。十多年后的今天,说要用C/C++写各平台程序,不少人会认为不可能,原因很多,像平台原生语言就不是C/C++,程序要求部署灵活。——但是,程...

rose-sdk
2015/07/06
799
1
6 个免费的 C++ 图形和游戏开发包

今天我们将分享一些 C++ 在图形和游戏开发方面的库,相信这些库可以帮到开发者节省开发的时间。 1) Antigrain AGG,全名:Anti-Grain Geometry,是一个开源的、高效的2D图形库。AGG的功能与G...

oschina
2012/06/13
6.8K
11
使用SDL动态显示鼠标的位置信息(四)

博主这两天看动漫看晕了,有点懈怠啊...嘿嘿,动漫的名字叫做《我的妹妹不可能那么可爱》,二季看完之后我突然觉得我有个妹妹该多好啊,嘿嘿... 不过更为恼火的是,博主搭建了SDL2.0的环境,...

夲仒無道
2013/10/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

阿里云API网关使用教程

API 网关(API Gateway)提供高性能、高可用的 API 托管服务,帮助用户对外开放其部署在 ECS、容器服务等阿里云产品上的应用,提供完整的 API 发布、管理、维护生命周期管理。用户只需进行简...

mcy0425
35分钟前
4
0
解决远程登陆误按ctrl+s锁屏假死恢复

使用putty时,偶尔发生屏幕假死,不能输入等情况。 后来发现,只要数据ctrl+s,就会假死;输入ctrl+q就可以恢复过来。 很多刚从windows转移到linux上来工作的朋友,在用vi/vim编辑文件时,常常...

HJCui
38分钟前
0
0
@Transactional

事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于...

asdf08442a
43分钟前
2
0
widows下强制解除8080端口占用问题

使用win+R打开命令窗口 输入以下命令查看哪个任务占用了8080端口 netstat -ano |findstr "8080" 然后通过任务id强制关闭占用该端口的进程 tskill 10044 // 自己的试情况而定,这个ID是LISTE...

_Artisan
52分钟前
2
0
productFlavors简单实用

最近项目中,不同环境需要配置的参数越来越多,为了减少修改代码次数。研究了一下productFlavors的使用方式,总结如下 1. as3.0以上版本使用productFlavors时需要指定一个flavorDimensions,...

火云
54分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部