2014-04-17 2 views
0

Quelle est la meilleure façon de gérer les événements SDL? Vous avez généralement le:SDL_event liste devient longue et salissante?

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

Le problème est, quand vous y aller avec un jeu, il y a habituellement un gâchis d'une liste de contrôles que vous pouvez faire, comme de haut en bas Detetion pour de nombreuses touches différentes. Et je me demande si la méthode que j'utilise est efficace et propre. Ou si je devrais l'approcher différemment ...

J'ai un pointeur de fonction dans le mainLoop, qui peut être assigné pour changer rapidement comment les événements seront manipulés. (Dites que je permute à une autre fonction, et il utilisera ces événements) Cependant, je pense que la liste des événements est désordonnée de toute façon, alors j'ai essayé d'ajouter des régions pour la décomposer. est-ce une bonne idée? Et oui, je veux juste une entrée si je suis sur le bon chemin vers un code lisible.

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

Essayez codereview stackexchange. Personnellement, je ne bouclerais les événements qu'une seule fois par image, puis j'utiliserais les données recueillies à chaque fois. – this

Répondre

1

Deux suggestions:

Retirez les accolades ({ et }) autour des case étiquettes. Vous n'en avez pas besoin à moins d'avoir besoin d'une nouvelle pile.


Ma deuxième suggestion est de diviser les choses en fonction. Même si elle ne sera appelée qu'à partir de switch. Mettre les choses dans plusieurs fonctions aide à rendre le code plus facile à lire et à comprendre.

Ainsi, par exemple:

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; 
     } 
    } 
} 

Et généralement (selon un peu d'avis); Si vous avez besoin d'utiliser #pragma once pour rendre le code lisible, il peut (et devrait) être divisé en plus de fonction

Questions connexes