我用SDL制作了一个程序,它有很多键盘和鼠标输入。目前,主要SDL环路几乎有400条线路长,这完全是因为开关功能中有大量单独的情况。
整个程序大约有1000行,我希望将其拆分为单独的文件/模块。我希望有一个单独的文件用于键盘输入,另一个用于鼠标输入,每个文件都包含一个将在主SDL循环中调用的函数。我确信我不久前看到过一个这样做的例子,但我找不到
目前我的代码看起来像这个
while( !quit && ( SDL_WaitEvent(&event) ) )
{
switch (event.type)
{
case SDL_MOUSEBUTTONDOWN:
{
switch(event.button.button)
{
case SDL_BUTTON_LEFT:
case SDL_BUTTON_MIDDLE:
case SDL_BUTTON_RIGHT:
}
}
case SDL_KEYDOWN:
switch (event.key.keysym.sym)
{
case SDLK_r:
case SDLK_i:
case SDLK_f:
case SDLK_g:
case SDLK_l:
我希望它是这样的。。。
while( !quit && ( SDL_WaitEvent(&event) ) )
{
switch (event.type)
{
HandleMouseInput();
HandleKeyboardInput();
我希望这是有道理的,也不是一个太傻的问题,但经过大量的谷歌搜索和思考,我似乎无法开始这个问题。我以前从未真正写过这么大的程序,也不习惯多个源文件。
处理此问题的一个简单方法是为您所拥有的事件类型创建一个枚举,类似于:
enum EEventCategory
{
EventCategory_Keyboard,
EventCategory_Mouse,
EventCategory_System
};
然后创建一个简单的方法来检查event.type
并返回类别:
EEventCategory GetEventCategory(Uint8 in_type)
{
switch(in_type)
{
case SDL_KEYDOWN:
case SDL_KEYUP:
return EventCategory_Keyboard;
case SDL_MOUSEMOTION:
case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
return EventCategory_Mouse;
// See SDL_events.h for more event categories...
default:
return EventCategory_System;
}
}
然后你可以改变你的循环,比如:
while( !quit && ( SDL_WaitEvent(&event) ) )
{
switch (GetEventCategory(event.type))
{
case EventCategory_Keyboard:
HandleKeyboardInput(event);
break;
case EventCategory_Mouse:
HandleMouseInput(event);
break;
case EventCategory_System:
HandleSystemEvent(event);
break;
default:
assert(false); // unhandled event
}
}