SDL编程四(事件)

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是则不管有没有消息都马上返回。


转载于:https://my.oschina.net/tofro/blog/1503081

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值