| █▄▀ Système d'affichage des vies |
| Nous allons créer un système d'affichage des vies. Les vies sont représentées par des cœurs. Selon le nombre courant de vie, il y a aura des cœurs qui seront plein, d'autres vides, ou à moitié plein. D'habitude les cœurs plein sont à gauche puis à un moment si le joueur a perdu de la santé il y a des coeurs vides. |
| o draw_sprite(n,img,x,y) : Dessine la sous image img (-1 = en cours) du sprite d'index n dontl'origine est à la position x,y. |
| Le script est à mettre dans un event draw car il s'agit d'un script qui affiche seulement des informations. |
| Alors, il nous faut 3 sprites : - un cœur plein : heart - un cœur à moitié plein : heart_half - un cœur vide : heart_empty |
![]() |
| On définit la position du premier cœur (celui qui sera en haut à gauche) |
| x0 = view_left + 15; y0 = view_top + 20; |
| Les variables view sont les coordonnées du " cadre qui suit le personnage " Parce qu'il ne faut pas les coordonnées dans la pièce mais des coordonnées qui dépend l'endroit dans la pièce qui est affiché. (Si vous comprenez pas ça fait rien, mais rappelez-vous de ces variables elles sont très utiles) |
Quelle fonction allons-nous utiliser pour résoudre ce problème ? |
| Ce qui semble le plus simple est d'utiliser des if. Oui, mais ça fait beaucoup de if, imaginez
qu'il y ait 20 vies donc avec les moitiés de cœurs ça fait beaucoup trop.
La boucle for est idéale pour ce genre de travail. Voici le modèle de la boucle for : for (inialisation,condition,in/décrémenation) |
| Exemple : for (i=0; i<3; i+=1) { instruction; } Au début on donne la valeur 0 à la variable i. Tant que i est strictement inférieur à 3 la boucle est répétée. A chaque répétition i est incrémenter de 1. |
Remarque : Vous pouvez aussi utiliser l'instruction repeat comme dans le tutorial sur les menus. Nous utilisons la boucle for dans ce tutorial pour apprendre à l'utiliser car c'est une fonction qu'on trouve dans de nombreux languages alors que la fonction repeat est plus spécifique au gml. |
| ▫ Variables de vies |
| Le nombre de vie courant est égal à la variable global.hearth_current et le nombre maximum de vie est égal à la variable global.hearth_max. Ces variables doivent avoir une valeur avant la première exécution du script d'affichage. Donc il faut les déclarer dans un script d'inialisation qu'on met dans l'event game_start. |
| global.hearth_current = valeur; // valeur --> mettez le nombre de coeur plein du perso global.hearth_max = valeur; // valeur --> mettez le nombre max de coeurs |
| Soit vous utilisez directement ces variables dans vos scripts ou le perso perd de la vie, remplises coeurs. Soit vous changez ces variables dans les scripts de cette page. |
| Vos variables de vies ne sont pas globales ? Si vous utilisez les variables de vies par défaut, donc elles sont locales. Vu que vous pouvez utiliser l'event draw dans l'objet "perso" lui-même (sinon les sprites ne s'affiche pas) il vous faut créer un objet qui servira à afficher les vies avec son event draw. Comment faire pour accéder aux variables locales d'un objet à partir d'un autre objet ? POur cela il faut récupérer l'id lors de la création de l'objet. Lorsque que vous créez une nouvelle instance avec la fonction instance_create(), vous pouvez récupérer l'id de l'instance crée en mettant une variable qui récupére la valeur retournée par la focntion. exemple: variable=instance_create(x,y,objet) Essayez de créer un système pour transvaser les id d'un objet vers un autre objet afin de récupérer n'importe quelles (en clair utiliser votre cerveau et réfléchissez) variables. Bon un petit exemple quand même (sinon vous allez couler): J'ai une instance de l'objet link_obj et je vais crée une instance de l'objet affichage_vies_obj. |
| affich_vies_id = instance_create(x, y, affichage_vies_obj); // Je transvase l'id de l'instance link_obj dans la nouvelle instance crée affich_vies_id.perso = id; // Ainsi pour accéder aux variables de l'instance link_obj dans l'instance affichage_vies_obj perso.current_health = self.current_health; perso.max_health = self.max_health; |
| ▫ On y arrive... |
| On doit décrémenter la variable global.health_current or on ne veut pas la changer donc on va la transvaser dans une variable qu'on appelle life. |
| life=global.health_current |
| Puis on applique la boucle for à notre système. |
| /* Inialisation j=0 tant que j est inférieurs à la variable globale de vie maximale, à chaque répétition de la boucle on incrémente j de 1. Donc la boucle sera exécuter n (nombre de) cœurs fois. */ for (j=0; j<global.health_max; j+=1) { // s'il y encore des réserves dans life on affiche un coeur entier if (life > 1) draw_sprite(heart,0,x0,y0); // s'il reste moitié de réserves dans life // on affiche une moitié de coeur if (life = 0.5) draw_sprite(heart_half,0,x0,y0); // si ya plus rien dans life on affiche un coeur vide if (life <= 0) draw_sprite(heart_empty,0,x0,y0); // on décrémente life life -= 1; // on incrémente la composante x des coordonnées du cœur // courant: le prochain cœur se trouvera à 21 pixels plus à droite x0 += 21; // si la rangée (de cœurs) est pleine, on va à la ligne // et on réinitialise la composante x if (x0 > view_left+150) { y0+=21; x0=view_left+15; } } |
![]() |
| Le résultat |
| ▫ Exemple |
| Pour ceux qui n'ont pas saisi la subtilité du système voici un exemple "imagé". Imaginons que le joueur ait 4 points de vie sur les 6 au total. Donc on définit: |
| life = global.health_current; |
| La variable life est représenté par ces 4 carrés. |
![]()
![]() ![]() |
| for (j=0; j<global.health_max; j+=1) |
| Le nombre total de vies est égal à 6, la variable j est définie à zéro. Tant que j est inférieur au nombre total de vies la boucle sera répétée et j incrémenté. Donc il faudra 6 répétions avant l'arrêt de la boucle. |
1er passage dans la boucle ![]()
![]() ![]() Comme life est supérieur à 1, on affiche un coeur : ![]() Puis on décrémente life : ![]()
![]() |
2ème passage dans la boucle ![]()
![]() Comme life est supérieur à 1, on ajoute un coeur : ![]() ![]() Puis on décrémente life : ![]() ![]() |
3ème passage dans la boucle
![]() Comme life est supérieur à 1, on ajoute un coeur : ![]() ![]() ![]() Puis on décrémente life : ![]() |
4ème passage dans la boucle
Comme life est supérieur à 1, on ajoute un coeur : ![]() ![]()
![]() Puis on décrémente life : Y'a plus rien ! life = 0 |
5ème passage dans la boucle Comme life est égale ou inférieur à 0, on ajoute un coeur vide: ![]() ![]()
![]() ![]() Puis on décrémente life : life = -1 |
6ème passage dans la boucle Comme life est égale ou inférieur à 0, on ajoute un autre coeur vide: ![]() ![]()
![]() ![]() ![]() Puis on décrémente life : life = -2 |
| Et voilà, on peut voir qu'il y a bien 4/6 coeurs. |
| En ce qui concerne : |
| x0 = view_left+15; x0 += 21; |
| ... si on faisait la liste des fonctions appelé durant la boucle dans cet exemple
ça serait : |
| 1- draw_sprite(heart,0,view_left+15+21,y0) 2- draw_sprite(heart,0,view_left+15+21+21,y0) 3- draw_sprite(heart,0,view_left+15+21+21+21,y0) 4- draw_sprite(heart,0,view_left+15+21+21+21+21,y0) 5- draw_sprite(heart_empty,0,view_left+15+21+21+21+21+21,y0) 6- draw_sprite(heart_empty,0,view_left+15+21+21+21+21+21+21,y0) |
|
(j'ai mit les valeurs de x à moitié-calculé) |
| Voilà vous avez toutes les clef en main pour faire un bon menu. |
| ▫ Listing |
| Afin de comprendre mieux vous avez un fichier d'exemple ici. |




