C++ SDL_事件列表变得又长又乱?

C++ SDL_事件列表变得又长又乱?,c++,events,sdl,C++,Events,Sdl,什么是处理SDL事件的好方法? 您通常有: while (SDL_PollEvent(&event)) { //Handles all the events when in the menu screen... eventsMenu(event); } 问题是,当你开始玩游戏时,通常会有一大堆你可以做的控件,比如很多不同键的上下绕行。我想知道我使用的方法是否高效、干净。或者如果我用不同的方式来处理它 我在mainLoop中有一个函数指针,可以指定它来快速更改事件的处理方

什么是处理SDL事件的好方法? 您通常有:

while (SDL_PollEvent(&event)) {
    //Handles all the events when in the menu screen...
    eventsMenu(event);
}
问题是,当你开始玩游戏时,通常会有一大堆你可以做的控件,比如很多不同键的上下绕行。我想知道我使用的方法是否高效、干净。或者如果我用不同的方式来处理它

我在mainLoop中有一个函数指针,可以指定它来快速更改事件的处理方式。(假设我切换到另一个函数,它将使用这些事件) 然而,我认为事件列表无论如何都会变得杂乱无章,所以我尝试添加区域来分解它。这是个好主意吗?是的,如果我在一个可读代码的正确路径上,我只需要一些输入

void Window::eventsMenu(SDL_Event event) {
    switch (event.type) {
        #pragma region "Button Down"
        case SDL_MOUSEBUTTONDOWN: {
            //printf("Mouse button down!\n");
            glClearColor(0.1, 0.1, 0.1, 1);
            if (event.button.button == SDL_BUTTON_LEFT) {
                mouseButtonLeft = true;
            }
            break;
        }
        #pragma endregion;
        #pragma region "Button Up"
        case SDL_MOUSEBUTTONUP: {
            //printf("Mouse button up!\n");
            glClearColor(0, 0, 0, 1);
            if (event.button.button == SDL_BUTTON_LEFT) {
                mouseButtonLeft = false;
            }
            break;
        }
        #pragma endregion;
        #pragma region "Mouse Motion"
        case SDL_MOUSEMOTION: {
            //printf("Mouse moved!\n");
            if (mouseButtonLeft) {
                rotX += event.motion.xrel;
                rotY += event.motion.yrel;
            }
            break;
        }
        #pragma endregion;
        #pragma region "Mouse Wheel"
        case SDL_MOUSEWHEEL: {
            if (event.wheel.y != 0) {
                musicVolume += ((event.wheel.y > 0) ? 1 : -1);
                if (musicVolume > 100) {
                    musicVolume = 100;
                }
                else if (musicVolume < 0) {
                    musicVolume = 0;
                }
                Mix_VolumeMusic(musicVolume);
                printf("Volume: %i%c\n", musicVolume, '%');
            }

            if (event.wheel.y > 0) {
                //printf("Scroll forward!\n");
            }
            else {
                //printf("Scroll backward!\n");
            }
            break;
        }
        #pragma endregion;
        #pragma region "Key Down"
        case SDL_KEYDOWN: {
            printf("Button [%s] pressed\n", SDL_GetKeyName(event.key.keysym.sym));
            switch (event.key.keysym.sym) {
                case SDLK_1: {
                    Mix_PlayChannel(-1, sound1, 0);
                    break;
                }
                case SDLK_2: {
                    Mix_PlayChannel(-1, sound2, 0);
                    break;
                }
            }
            break;
        }
        #pragma endregion;
        case SDL_QUIT: {
            running = false;
        }
    }
}
void窗口::事件菜单(SDL\U事件){
开关(事件类型){
#pragma区域“按下按钮”
外壳SDL_鼠标按钮向下:{
//printf(“鼠标按钮按下!\n”);
glClearColor(0.1,0.1,0.1,1);
if(event.button.button==SDL_按钮左){
mouseButtonLeft=true;
}
打破
}
#布拉格端区;
#布拉格区域“按钮打开”
外壳SDL_鼠标按钮打开:{
//printf(“鼠标按钮向上!\n”);
glClearColor(0,0,0,1);
if(event.button.button==SDL_按钮左){
mouseButtonLeft=false;
}
打破
}
#布拉格端区;
#pragma区域“鼠标运动”
案例SDL_:{
//printf(“鼠标移动!\n”);
如果(鼠标按钮左){
rotX+=event.motion.xrel;
rotY+=event.motion.yrel;
}
打破
}
#布拉格端区;
#pragma区域“鼠标滚轮”
外壳SDL_鼠标滚轮:{
if(event.wheel.y!=0){
musicVolume+=((event.wheel.y>0)?1:-1);
如果(音乐音量>100){
音乐音量=100;
}
else if(音乐音量<0){
音乐音量=0;
}
混合音量(音乐音量);
printf(“卷:%i%c\n”,音乐卷,%”);
}
如果(事件轮y>0){
//printf(“向前滚动!\n”);
}
否则{
//printf(“向后滚动!\n”);
}
打破
}
#布拉格端区;
#布拉格区域“按键向下”
案例SDL_按键关闭:{
printf(“按钮[%s]按下\n”,SDL_GetKeyName(event.key.keysym.sym));
开关(event.key.keysym.sym){
案例SDLK_1:{
混音播放频道(-1,声音1,0);
打破
}
案例SDLK_2:{
混音播放频道(-1,声音2,0);
打破
}
}
打破
}
#布拉格端区;
案例SDL_退出:{
运行=错误;
}
}
}
两条建议:

移除
大小写
标签周围的大括号(
{
}
)。除非需要新的堆栈,否则不需要它们


我的第二个建议是将事物分解为功能。即使只从
开关中调用它
。将内容放入多个函数有助于使代码更易于阅读和理解

例如:

case SDL_MOUSEBUTTONDOWN:
case SDL_MOUSEBUTTONUP:
    HandeMouseButton( event );
    break;

void HandeMouseButton( const SDL_Event &event )
{
    if ( event.type ==  MOUSEBUTTONDOWN )
    {
        glClearColor(0.1, 0.1, 0.1, 1);
        if (event.button.button == SDL_BUTTON_LEFT) {
            mouseButtonLeft = true;
    }
    else if ( event.type ==  MOUSEBUTTONUP )
         glClearColor(0, 0, 0, 1);
         if (event.button.button == SDL_BUTTON_LEFT) {
             mouseButtonLeft = false;
         }
    }
}


一般而言(略基于观点);如果需要一次性使用
#pragma
使代码可读,可以(而且应该)将其拆分为更多功能

尝试codereview stackexchange。就我个人而言,我每帧只循环事件一次,然后在需要时使用收集的数据。