SDL事件
函数
SDL_WaitEvent(): 等待事件;
SDL_PushEvent; 发送一个事件(事件入队);
SDL_PumpEvents(): 将硬件设备产生的事件放入事件队列,用于读取事件,在调用该函数前,必须调用SDL_PumpEvents搜集键盘等事件;
SDL_PeepEvents(): 从事件队列提取一个事件
数据结构:
SDL_Event: 事件结构体;
示例demo:
#include <SDL.h>
#include <iostream>
#define SDL_USER_DEF_QUIT_EVENT (SDL_USEREVENT + 2) //用户自定义事件
int main(int argc, char* argv[])
{
SDL_Window* window = nullptr;
SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow(("Basic Window"),
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
640,
480,
SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE);
if (!window)
{
std::cout << "Can't Create window, err:" << SDL_GetError() << std::endl;
return 1;
}
//event
SDL_Event event;
int nExitCode = 0;
while (true)
{
SDL_WaitEvent(&event);
switch (event.type)
{
case SDL_KEYDOWN: //键盘事件
switch (event.key.keysym.sym)
{
case SDLK_a:
std::cout << "key down a" << std::endl;
break;
case SDLK_b:
std::cout << "key down b" << std::endl;
break;
case SDLK_c:
std::cout << "key down c" << std::endl;
break;
case SDLK_d:
std::cout << "key down d" << std::endl;
break;
case SDLK_q:
std::cout << "key down q, ready to exit" << std::endl;
SDL_Event eventQuit;
eventQuit.type = SDL_USER_DEF_QUIT_EVENT;
SDL_PushEvent(&eventQuit); //自定义消息入队
break;
default:
printf("key down 0x%x\n", event.key.keysym.sym);
break;
}
break;
case SDL_MOUSEBUTTONDOWN: //鼠标按下事件
if (event.button.button == SDL_BUTTON_LEFT)
{
printf("mouse button down left\n");
}
else if (event.button.button == SDL_BUTTON_RIGHT)
{
printf("mouse button down right\n");
}
break;
case SDL_USER_DEF_QUIT_EVENT:
std::cout << "quit event received" << std::endl;
nExitCode = 1;
break;
case SDL_MOUSEMOTION:
printf("mosue move (%d, %d)\n", event.button.x, event.button.y);
break;
default:
break;
}
if (nExitCode)
break;
}
SDL_Delay(5000);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}