SDL_Event event;
bool done = false;
//TASping的主循环,全部核心都在此处处理,包括渲染,键盘,游戏逻辑,鼠标等
while (!done) {
ENTER_UNSYNCED;
while (SDL_PollEvent(&event)) {
switch (event.type) {
// 窗口大小变化
case SDL_VIDEORESIZE: {
screenWidth = event.resize.w;
screenHeight = event.resize.h;
#ifndef WIN32
// HACK We don’t want to break resizing on windows (again?),
// so someone should test this very well before enabling it.
SetSDLVideoMode();
#endif
InitOpenGL();
activeController->ResizeEvent();
break;
}
// 没弄清楚
case SDL_VIDEOEXPOSE: {
// re-initialize the stencil
glClearStencil(0);
glClear(GL_STENCIL_BUFFER_BIT); SDL_GL_SwapBuffers();
glClear(GL_STENCIL_BUFFER_BIT); SDL_GL_SwapBuffers();
SetupViewportGeometry();
break;
}
// 退出
case SDL_QUIT: {
done = true;
break;
}
// 活动事件
case SDL_ACTIVEEVENT: {
if (event.active.state & SDL_APPACTIVE) {
gu->active = !!event.active.gain;
}
break;
}
// 鼠标移动,鼠标按下,鼠标抬起事件,还有系统事件
case SDL_MOUSEMOTION:
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
case SDL_SYSWMEVENT: {
mouseInput->HandleSDLMouseEvent (event);
break;
}
// 键盘按下事件
case SDL_KEYDOWN: {
int i = event.key.keysym.sym;
const bool isRepeat = !!keys[i];
UpdateSDLKeys ();
if (activeController) {
if (i <= SDLK_DELETE) {
i = tolower(i);
}
else if (i == SDLK_RSHIFT) { i = SDLK_LSHIFT; }
else if (i == SDLK_RCTRL) { i = SDLK_LCTRL; }
else if (i == SDLK_RMETA) { i = SDLK_LMETA; }
else if (i == SDLK_RALT) { i = SDLK_LALT; }
if (keyBindings) {
const int fakeMetaKey = keyBindings->GetFakeMetaKey();
if (fakeMetaKey >= 0) {
keys[SDLK_LMETA] |= keys[fakeMetaKey];
}
}
activeController->KeyPressed(i,isRepeat);
#ifndef NEW_GUI
if (activeController->userWriting){
// use unicode for printed characters
i = event.key.keysym.unicode;
if ((i >= SDLK_SPACE) && (i <= SDLK_DELETE))
if (activeController->ignoreNextChar ||
activeController->ignoreChar == char(i)) {
activeController->ignoreNextChar = false;
} else {
activeController->userInput += char(i);
}
}
#endif
}
break;
}
//键盘抬起事件
case SDL_KEYUP: {
int i = event.key.keysym.sym;
UpdateSDLKeys();
if (activeController) {
if (i <= SDLK_DELETE) {
i = tolower(i);
}
else if (i == SDLK_RSHIFT) { i = SDLK_LSHIFT; }
else if (i == SDLK_RCTRL) { i = SDLK_LCTRL; }
else if (i == SDLK_RMETA) { i = SDLK_LMETA; }
else if (i == SDLK_RALT) { i = SDLK_LALT; }
if (keyBindings) {
const int fakeMetaKey = keyBindings->GetFakeMetaKey();
if (fakeMetaKey >= 0) {
keys[SDLK_LMETA] |= keys[fakeMetaKey];
}
}
activeController->KeyReleased(i);
}
break;
}
}
}
if (globalQuit)
break;
if (!Update())
break;
}