Vous êtes sur la page 1sur 40

TERD

Travail encadré d'étude, de recherche et de développement


L3 Informatique

Rémy Garcia — remy.garcia@univ-cotedazur.fr


Programmation Évènementielle
Event-driven programming

• Programmation séquentielle
• Déroulement contrôlé par une séquence d’instructions écrites
• L’ordre ne change pas

• Instruction 1
• Instruction 2
• Instruction 3
• Instruction 4
Programmation Évènementielle
Event-driven programming

• Programmation séquentielle
• Déroulement contrôle par une séquence d’instructions écrites
• L’ordre ne change pas

• Instruction 1 print(“Saisir un nombre: “)


• Instruction 2 n = int(input())
• Instruction 3 r= n*2
• Instruction 4 print(r)
• …
Programmation Évènementielle
Event-driven programming

• Programmation évènementielle
• Boucle principale
• Attend un évènement
• Traite l’évènement
• Répète do {
e = getNextEvent();
process event e;
} while(e != quit);
Programmation Évènementielle
Event-driven programming
Programmation Évènementielle
Event-driven programming

• Le flux d’exécution du programme est dirigé par des évènements


• Le programme se lance et attend des évènements
• À chaque évènement, le programme exécute du code dédié
• Le code exécuté est déterminé par l’évènement
• Différent des programmes dirigé par application ou algorithme
• Les données d’entrée détermine le flux global d’exécution
Programmation Évènementielle
Usage

• Applications avec une interface graphique (Word, Excel, …)


• Découplage de l’application et de son interface
• Pas de blocage
• JavaScript Web application
• Répond aux entrées de l’utilisateur
• Pas de blocage —> communication par message, traitement différé
• Système d’exploitation
• Framework
Programmation Évènementielle
Comment faire ?

• Avant de commencer à faire la boucle principale


• Programmer une réponse pour chaque évènement possible !

function1() ; function2(); function3();

register(“event1”, function1); …

mainloop();
Programmation Évènementielle
Évènement

• Event : notification qu’une action a eu lieu (clic de souris, appui sur une
touche du clavier, rencontre d’un monstre, …)

• Event handler : morceau de code à exécuter en réponse à un event


Programmation Évènementielle
Source des Évènement

• Les entrées pour un programme évènementiel sont issues des sources


d’évènements autonomes
• Les évènements sont asynchrones

• Évènements générés par le système


• Évènements générés par l’utilisateur
Programmation Évènementielle
Source des Évènement

• Évènements générés par le système


• Le système déclenche un évènement hors du contrôle de l’utilisateur
• Hardware : timer du système
• Software : dans l’application —> notification de complétion d’une tâche
• Application répond aux évènements
Programmation Évènementielle
Source des Évènement

• Évènements générés par l’utilisateur


• Le système déclenche un évènement à partir d’une entrée de l’utilisateur
via le hardware
• Clavier, Souris, Joystick manette, …
• Le système enregistre les entrées utilisateur dans une Queue
• Librairie GUI gère la surveillance et le traitement des évènements
• À programmer : comportement à effectuer à partir des évènements
Programmation Évènementielle
Traitement des évènements

• Placer les évènements dans une FIFO


• Boucle de gestion des évènements prend dans FIFO et traite

• Comment surveiller un event


• Pattern Observer
• Objets s’abonnent à un sujet
• Surveille changement d’état
Programmation Évènementielle
Traitement des évènements

• Liste des observateurs = liste des dépendants


• Nombre et nature pas connus à la compilation
• Exemple : table et graphique dépendent des données
Programmation Évènementielle
Exemple

• Alarme
Programmation Évènementielle
Exemple

• Alarme
• Boucle explicite
• Wait
• Signals
• Process
• Wait…
• Appelle AnimateAlarm
Programmation Évènementielle
Exemple

• Alarme
• Interface pour définir actions
• Niveau d’abstraction supplémentaire
• Méthode de Buzzer jamais appelé explicitement
Programmation Évènementielle
Exemple
• Alarme
• Dispatcher pour réagir à un event
• Ici —> spécifique à l’event
• Dispatcher ne connait pas objet en général
• Dispatcher pas visible
• Mais l’idée est là ! Tout ce fait via
eventHandler —> Alarme inconnue
• Timeout et Rest assez général
• Applicable à d’autres objets
Programmation Évènementielle
Event Handler (Listener)

• Callback subroutine (fonction de rappel)


• Indépendant du reste du programme
• Traite les entrées reçu lors de son appel
• Event est associé à un Event Handler
• Event Handlers n’ont pas d’ordre d’appel à l’exécution du
programme
• Faire attention au traitement dans le handler
Programmation Évènementielle
Event Queue

• Découplage des producers et handlers


• Producer
• Indique seulement event
• Ne s’occupe pas de le traiter
• Handler
• Pas important d’où vient l’event
• S’active simplement à chaque event précis
Programmation Évènementielle
Event Queue

• Event Queue —> proposé par event-based system (Swing Java)


• En général pas besoin de tout créer de zéro
• Rôle
• Garde les events (ex: TODO liste)
• Objet produit un comportement —> event dans Queue
• Supprime event —> notifie handler
• Handler appelle la fonction action pour traiter l’event
• Pas de traitement directement dans Handler !!
Programmation Évènementielle
Event Queue

• Event Queue à son propre Thread en général


• Attention, handler s’exécute dans ce Thread
• Code handler court, termine vite
• Pas de boucle à l’infini…
• Si handler ne retourne pas —> bloque le système

• Opérations
• addQueue
• Dispatcher —> appelle méthode handler pour l’event
Programmation Évènementielle
Event Queue et Java GUI

• Java GUI propose une Event Queue pour gérer les events
écrans
• Clic de souris
• Bouton de l’interface
• Clavier
• …
• Event Queue pas visible dans le framework
Programmation Évènementielle
Exemple interface graphique

• Abstract Window Toolkit (AWT)


Programmation Évènementielle
Exemple interface graphique
Programmation Évènementielle
Exemple interface graphique
Programmation Évènementielle
Exemple interface graphique

• Chaque composant AWT est la source d’events


• add***Listener()

• Objet event envoyé comme paramètre au fonctions pour être


traité peut contenir des informations
• getX() et getY() pour un MouseEvent —> coordonnées souris
Programmation Évènementielle
Exemple interface graphique
Programmation Évènementielle
Exemple interface graphique
Programmation Évènementielle
Exemple interface graphique
Programmation Évènementielle
Exemple interface graphique
Programmation Évènementielle
Exemple interface graphique
Programmation Évènementielle
Exemple interface graphique
Programmation Évènementielle
Pour résumer

• Boucle centrale cachée —> event handler visible


• Séparation entre event et traitement de l’event
• Objet est libre d’implémenter un même event handler
différemment
• Très utilisé pour les interfaces graphiques
• Caché dans la librairie
• Possible de l’utiliser dans le projet (pas obligatoire)
Programmation Évènementielle
Pour le projet

• Gestion des évènements plus “simples”


• Pas forcément d’Event Queue
• Pas forcément de graphique
• Mais forcément des events
• Déplacement joueur
• Rencontre Monstre
• Combat
• Repos
• …
Programmation Évènementielle
Pour le projet

• Implémentation
• Pattern Observer
• “Surveiller” les objets entité du jeu
• Appeler des méthodes pour traiter les conséquences d’un
event
• À spécialiser à l’intérieur des classes concrètes des
éléments du jeu
• Attention à votre niveau d’abstraction ! (Classes en +,
communication entre objet, architecture, …)
Programmation Évènementielle
Pour le projet
• Commencer par une implémentation simple (séquentielle)
• Boucle principale
• Attend event
• Traite event rapidement
• Attend event
• Traite event rapidement
• …
• Pourquoi pas découpler arrivé de l’event de son traitement ?
• Plus complexe —> Thread à part pour gérer ça
• Ne pas bloquer l’application
• Peut être que pour les entrées utilisateur ?
• (Surtout intéressant si vous ne faite pas du tour par tour…)
Programmation Évènementielle
Pour le projet
• Pourquoi pas découpler arrivé de l’event de son traitement ?
• Plus complexe —> Thread à part pour gérer ça
• Ne pas bloquer l’application
• Peut être que pour les entrées utilisateur ?
• (Surtout intéressant si vous ne faite pas du tour par tour…)
• Attention
• Plusieurs Threads dangereux —> Event Queue partagée
• Ne pas bloquer —> handler doit être simple
• Appeler une fois que toutes les données sont prêtes (ex: Dessiner Carte)
Projet
Idées de fonctionnalités

• Étages : salle avec un escalier —> transporte sur une nouvelle


carte
• Point d’expérience : joueur à niveau, XP pour tuer monstre,
explorer, …, (changer d’étage?)
• Inventaire limité : nb element à stocker limité —> choisir lequel
jeter si max atteint
• Déplacement intelligent des monstres —> va vers le joueur (on
verra ça aussi en cours)

Projet
Idées de fonctionnalités

• Jet : joueur peut lancer un équipement dans une direction


(gestion limite salle/couloir), effet de l’équipement
• Repos : zone de repos (récupération ++)
• Magie : point de magie, sort à lancer (téléportation, soin,
invisibilité, …) (boule de feu ? Avec Jet)
• Pièges : zone de piège dans les salles
• Monstres : poison, rapide (+ d’actions par tour), archer, invisible,

Vous aimerez peut-être aussi