2014-04-17 34 views
0

执行SDL事件处理的好方法是什么? 你通常有:SDL_event列表变得漫长而混乱?

while (SDL_PollEvent(&event)) { 
    //Handles all the events when in the menu screen... 
    eventsMenu(event); 
} 

问题是,当你得到一个游戏罢了,通常会有的,你可以做,像上下detetion许多不同的按键控制列表的一个烂摊子。我想知道我们使用的方法是否高效和干净。或者,如果我应该不同地接近它...

我有一个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; 
     } 
    } 
} 
+0

尝试codereview stackexchange。就我个人而言,我会每帧只循环一次事件,然后使用收集到的数据,每当插入。 – this

回答

1

两个建议:

围绕case标签取下牙套({})。除非你需要一个新的堆栈,否则你不需要它们。


我的第二个建议是将事情分解为函数。即使它只会在switch之内被调用。将东西放入几个函数有助于使代码更易于阅读和理解。

因此,例如:

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 once来使代码可读,它可以(也应该)分成更多功能