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;
}