2017-03-01 1 views
0

Je lis un code de livre d'introduction sur SDL et il y a des exemples de code comme ceci:Que fait SDL_PollEvent?

void Game::handleEvents() 
{ 
    SDL_Event event; 
    if (SDL_PollEvent(&event)) 
    { 
     switch (event.type) 
     { 
     case SDL_QUIT: 
      m_bRunning = false; 
      break; 
     default: 
      break; 
     } 
    } 
} 

Je comprends que cela se penchera dans la file d'attente d'événements et s'il y a quelque chose, récupérer et la course à la changement d'instruction. Avant d'ajouter ce code, la fenêtre était affichée mais vous ne pouviez ni glisser ni déposer, fermer ou redimensionner la fenêtre. Maintenant que j'ai ajouté ce code, je peux fermer la fenêtre qui était ce que j'attendais. Ce à quoi je ne m'attendais pas, c'est que je suis capable de faire glisser la fenêtre.

Je pensais que ce serait un événement distinct que je devrais inclure dans l'instruction switch dans le futur. Pourquoi le drag and drop a-t-il aussi fonctionné? C'est le SDL_PollEvent (parce que j'ai commenté l'instruction switch mais j'ai laissé le 'if', j'étais encore capable de faire glisser) mais pourquoi? Aussi, pourquoi seulement glisser-déposer était automatiquement fonctionnel? Pourquoi ne pas redimensionner?

+0

Il devrait être 'while', pas' if'. Mais oui, dans presque tous les cas, vous devez répondre à des messages spécifiques à la plateforme (ce que SDL fait en interne lorsqu'il génère une file d'attente) ou le système de fenêtre ne le mettra pas à jour. – keltar

Répondre

3

Nous n'avons pas besoin de gérer tous les événements, certains SDL s'occuperont de nous. Les événements liés aux propriétés de la fenêtre seront pris en charge automatiquement. Pour redimensionner une fenêtre, vous devrez ajouter l'indicateur SDL_WINDOW_RESIZABLE lors de la création de la fenêtre. Bien que SDL prenne en charge le redimensionnement de la fenêtre, il faudra peut-être prendre en compte la gestion des événements car la surface aura une taille différente à laquelle peindre, elle ne redimensionnera pas automatiquement les images que nous essayons de dessiner.

Bien que je n'ai pas trouvé de réponse dans la documentation à pourquoi SDL_PollEvent se comporte comme décrit ci-dessus, ou si cela est prévu, il fonctionne légèrement différemment sur différents systèmes. À osx, il est possible de déplacer la fenêtre sans la fonction ci-dessus, mais le X pour la fermeture ne sera pas affiché. En rajoutant la fonction, la fenêtre peut être déplacée, réduite et fermée correctement. SDL_PollEvent est destiné à faire ce que vous décrivez, regardez s'il y a des événements et récupérez-les.

2

Les événements ne se produisent pas en ce moment, ils ont déjà eu lieu dans le passé, vous recevez des notifications qu'ils se produisent dans l'ordre où ils se sont produits.

La fenêtre gelée est un effet secondaire d'un détail de mise en œuvre, définir des indicateurs appropriés pour activer/désactiver les propriétés des fenêtres et des fonctionnalités telles que le redimensionnement, plein écran, etc.

SDL_PollEvent appels SDL_PumpEvents, supprime le premier événement dans la pile et le copie dans le pointeur donné.

SDL_PumpEvents appelle l'API de traitement des événements du système d'exploitation et transforme les événements de plate-forme en SDL_Events, en les poussant sur la pile d'événements SDL. Maintenant, la raison pour laquelle les fenêtres sont gelées sur certaines plates-formes est que cette boucle d'événement de plate-forme fonctionne, à moins de "pomper" sa boucle d'événement, elle sera considérée comme une fenêtre sans réponse et le gestionnaire de fenêtre voudra la tuer. son processus.