█▄▀ Les Events
Avant de commencer ce tutorial, je vous propose de lire ce cours qui vous présente le déroulement classique de tout moteur de jeu.

Comme vous le venez de voir, le jeu est une sorte de boucle infini qui répète un certain nombres de tâches à chaque cycle. Parmi les principales tâches sont :
- détection des touches appuyés
- calcul de l'intéraction entre personnages et environnment
- détection des collisions
- affichage
- autres : sons

Dans Game Maker, il y a plusieurs type d'events. Tout d'abord les events qui sont exécuté à chaque script durant le déroulement "général" : l'event "step" ("cycle" en français), "alarm", "keyboard", "collision", "mouse", "draw", "keypress", "keyrelease". Puis il y a les events spéciaux tel que "create", "destroy", "game_start", etc. qui eux ne sont éxécuter qu'à la demande ou à des moments précis.

Dans cette liste d'event nous allons nous intéresser à l'event "step", "collision", "draw" et "alarm". Les events "keyboard", "keypress", "keyrelease" ne présentent que peu d'intérêt puisqu'il est impossible de détecter les combinaisons de touches et qu'on peut le faire avec l'event "step".

Les events "step", "collision", "draw" et "alarm" sont dits cyclique c'est-à-dire que ces events font parties de la boucle principal, il sont infiniment répétés.
 
▫ L'event collision
L'event collision comme son nom l'indique permet de détecter une collision avec un objet que l'on a choisit.
L'event collision est accessible en cliquant sur "Add event" dans la fenêtre de l'objet.

Puis une liste déroulante vous invite à choisir l'objet dont on détectera la collision. Et il ne vous reste plus qu'à remplir la colonne de droite où vous pourrez mettre les actions à exécuter.
Si l'objet entre en collision avec "bush_obj", les scripts à droite seront exécutés.

L'id de l'objet choisi s'il y a collision est accessible par la variable "other". Il est possible alors d'accéder a ses variables en précédant le nom de la variable de "other."
Exemple :

other.health -= 1 //hop ! l'ennemi perd un point !
 
▫ L'event alarm
L'event alarm est simple à utiliser. POur définir un event alarm, on choisit dans la liste prévus à cet effet (voir image ci-dessus) Lorsque le compteur a atteint le nombre de cycle qui a été choisi, les actions de l'event sont exécutés.
Pour régler le compteur, on utilise la fonction :
alarm[numéro] = nombre_de_cycle;
 
▫ L'event step
L'event step est un event qui est exécuté sans conditions à chaque cycle. C'est l'emplacement parfait pour mettre le script principal du jeu.

J'ai dit précedemment qu'il était possible de détecter les touches. Comment détecter les touches ? Avec la fonction keyboard_check(key), celle-ci détecte les touches appuyées et on utiliser un variable il est possible de simuler un "keypress" et un "keyrelease".

En fait il est théoriquement possible de tout faire rien qu'avec le "step event". On peut détecter les collisions avec place_meeting(x,y,obj), cette fonction retourne l'id de l'objet avec lequel il y a collision s'il y a collision. Les alarm avec des décrémentation et incrémentation de variables il est possible de les simuler. Dans certains il serait plus commode d'utiliser ces "deux méthodes" mais la plupart du temps il est plus facile d'utiliser directement les events "step" et "alarm".

Avec step, il est pratiquement impossible de simuler "draw", en effet draw est un event d'affichage donc il peut y avoir un décalage si l'on utilise "step". Les events ne sont pas exécuté en même temps, ils sont exécuté l'un après l'autre suivant cet ordre :

1-alarm
(2- keyboard)
(3- mouse)
4- step
5- collision
6- draw
 
▫ Résumé
 - Mettez tous vos scripts de contrôles (commandes clavier), de calculs dans le step "event".

 - Si vous voulez détecter une collision avec un objet, mettez les actions à exécuter dans l'event "collision".

 - Si vous avez un trucs à afficher et seulement à afficher (sans collisions), mettez vos scripts d'affichage dans l'event "draw".

 - Si vous avez une action précise à exécuter et que le faire dans l'event "step" est trop compliqué, mettez le script à exécuter dans l'event "alarm".