0

我使用 SDL 制作了一个程序,它有很多键盘和鼠标输入。目前,主要的 SDL 循环几乎有 400 行长,这完全是因为 switch 函数中有大量单独的案例。

整个程序大约有 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();

我希望这是有道理的,并且不是一个太愚蠢的问题,但是经过大量的谷歌搜索和思考后,我似乎无法开始这样做。我以前从来没有真正写过这么大的程序,而且我不习惯多个源文件。

4

1 回答 1

1

处理此问题的一种简单方法是为您拥有的事件类型创建一个枚举,例如:

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
    }
}
于 2013-08-18T05:20:35.210 回答