Du traducteur:
Il s'agit d'une continuation d'une série de traductions de didacticiels Twinklebear, initialement disponibles ici . La traduction est partiellement gratuite et peut contenir des modifications ou des ajouts mineurs du traducteur. La traduction des deux premières leçons est rédigée par InvalidPointer . Les images de l'article original sont localisées avec la préservation maximale du style de l'auteur.Liste des cours:Gestion des événements
Dans cette leçon, nous apprendrons les rudiments de la saisie par l'utilisateur et, pour simplifier, nous percevrons toute action de l'utilisateur comme une tentative d'
évasion pour terminer le programme. SDL utilise la structure SDL_Event et les fonctions d'extraction d'événements de la file d'attente d'événements, telles que SDL_PollEvent, pour récupérer des informations sur les événements. Le code écrit dans le cadre de cette leçon est basé sur les résultats de la
leçon précédente .
Mais d'abord, modifions l'image au centre de l'écran pour que l'utilisateur qui voit en premier votre programme comprenne ce qu'il fait et ce qui est requis de lui.
Auteur Man sauvéLa boucle principale la plus simple
Nous ajouterons la
boucle principale au programme, ce qui fera fonctionner le programme jusqu'à ce que l'utilisateur veuille quitter (et en informer le programme sous une forme accessible, bien sûr), au lieu d'un délai fixe, comme c'était le cas dans les leçons précédentes. Voici une structure approximative d'un tel cycle:
while (!quit)
File d'attente d'événements SDL
Pour utiliser correctement le système d'événements SDL, nous avons besoin au moins d'une compréhension minimale de son fonctionnement. Lorsque le SDL reçoit un événement du système d'exploitation, il le place à la fin de la file d'attente, après tous les autres événements qui ont été reçus précédemment, mais qui n'ont pas encore été extraits du programme. Si, après avoir démarré le programme, nous redimensionnions alternativement la fenêtre, cliquez dessus et cliquez sur une clé, la file d'attente des événements ressemblerait à ceci:

Lorsque nous appelons SDL_PollEvent, nous obtenons un événement depuis le début de la file d'attente, le plus ancien des autres. La réception d'événements de la file d'attente à l'aide de SDL_PollEvent les en supprime. Pour éviter cela, vous pouvez «espionner» l'événement à l'aide de la fonction SDL_PeepEvents avec le jeu d'indicateurs SDL_PEEKEVENT. Vous pouvez en savoir plus sur cette fonction dans la documentation, elle ne sera pas requise dans le cadre de cet article (et vous le ferez probablement aussi) et ne sera donc pas prise en compte.
Gestion des événements
Dans la boucle principale, nous voulons recevoir tous les événements disponibles survenus après la trame précédente et les traiter. Pour ce faire, il suffit de mettre SDL_PollEvent dans l'état de la boucle while, car il retourne 1 s'il a reçu l'événement et 0 s'il n'y a rien à recevoir. Comme tout ce que le programme fait est de terminer son travail sur certains événements, il suffira d'utiliser une variable booléenne (bool quit), indiquant si nous voulons terminer le programme ou non et définir sa valeur sur true lorsque ces événements sont reçus.
Cette boucle doit être placée à l'intérieur de la boucle principale de l'application.
Un événement de type SDL_QUIT se produit lorsque l'utilisateur ferme la fenêtre, SDL_KEYDOWN lorsque la touche est enfoncée sur le clavier (et revient plusieurs fois pendant qu'elle est maintenue, semblable à la façon dont les lettres sont répétées tout en maintenant la touche enfoncée pendant l'impression de texte), et un événement de type SDL_MOUSEBUTTONDOWN se produit lorsque clic de souris. Ce ne sont que quelques-uns des événements que votre application peut recevoir - et au total, le SDL peut recevoir plus de 20 types d'événements, que cet article ne peut pas couvrir, bien sûr, par conséquent, vous devriez en lire plus dans la documentation de
SDL_EventAchèvement du cycle principal
Nous avons terminé le traitement de l'événement, mais dans la boucle principale, il manque une autre partie: l'affichage de la scène. Nous avons déjà abordé ce sujet dans les leçons précédentes, il ne reste plus qu'à appliquer ces connaissances, et le cycle principal prendra la forme suivante:
Ce programme fonctionnera pour toujours. Eh bien, ou du moins jusqu'à ce que l'utilisateur lui demande
poliment d'arrêter. Après avoir démarré le programme, appuyer sur le bouton avec une croix, appuyer sur n'importe quelle touche du clavier ou cliquer avec la souris à l'intérieur de la fenêtre devrait conduire à la fin de son travail. Et jusqu'à ce moment, elle redessine constamment le contenu de la fenêtre.
Ajout du traducteur: le programme sous la forme dans laquelle il est, très probablement, consommera toutes les ressources de processeur disponibles, en chargeant complètement un cœur. Il sera rationnel d'ajouter un petit retard (1-5 ms) à la fin du cycle principal en utilisant SDL_Delay, de sorte qu'en l'absence d'événements, le programme libère le processeur pour d'autres programmes. Cela ne s'applique pas aux jeux lourds, qui nécessitent déjà toutes les ressources disponibles, alors qu'à 100 images par seconde, passer 100 ms par seconde en attente est un luxe inadmissible.La fin de la quatrième leçon
La prochaine leçon a donc pris fin. Rendez-vous tous dans la leçon 5: échantillonnage à partir d'un atlas de texture
Devoirs: essayez d'ajouter un mouvement d'image, par exemple en utilisant les flèches.