Editorial
|
Bienvenue sur Le CBNA!
Nous accueillons avec plaisir vos yeux sur nos pages, sur
la section GameMaker du CBNA!
Si vous êtes ici, c'est en théorie car vous avez envie de
créer un jeu video, ou bien vous cherchez de l'aide, ou encore
vous désirez philosopher avec les membres dans la Section Spirituelle, ou
vous êtes un artiste et désirez partager vos oeuvres dans
la Section
CBN'Art.
Bon, il est tout aussi possible nous vous l'accordons que vous soyez
tombé ici par hasard, mais ce n'est pas grave nous vous accueillons!
Notre But aujourd'hui est de promouvoir la programmation
en France, avec GameMaker entre autre, ou plutôt de partager nos
connaissances en programmation, nos techniques, et aussi de nous
enrichir, de vous enrichir et d'enrichir le contenu du site avec vos
créations et vos conseils.
Nous proposons des Tutoriels, des gm6 et gmd (Codes sources), des
scripts, des DLL, des Librairies... Tous créés par des
utilisateurs de GameMaker prêts à vous aider.
Aussi ces utilisateurs publient leurs jeux sur le site pour se faire
connaître et pour faire avancer la communauté.
Vous êtes certainement comme eux, puisque "eux" c'est vous! Oui,
vous qui lisez ces mots, vous pouvez dès maintenant envoyer vos
jeux, vos Scripts, vos Tutoriels, vos gm6 et gmd, vos DLL, vos
Librairies ou même dans la Section Spirituelle ou dans la Section
CBN'Art nous faire part de vos textes, images, états
d'esprits, vos opinions sur les Evènements actuels...
Aussi Le CBNA ce n'est pas que du travail, c'est aussi un espace de
détente, de rire, de plaisir... nous vous invitons donc à
venir parler sur le forum, participer à sa vie, à ses
activités...
Merci à vous d'avoir
pris le temps de lire ces quelques lignes...
|
News
|
Tutorial Intégral Débutant, Intermédiaire et Confirmé: Partie II:Intermédiaire
|
Sommaire: Telecharger tous les exemples dans un pack: ici
1) Le gml(2) //Les boucles. 2) Le gml(3) //Les ids, l instruction with, les variables globales et locales 3) L'IA //Principe de l'ia, première IA vue de dessus 4) La plateforme //Les jeux de plateforme ... 5) Les views // Comment organiser les caméras 6) Les particules //Faire de jolis effets grâce aux particules 7) La plateforme 2 //Objets speciaux en platefome
Chapitre suivant
Le gml, vous connaissez déjà un peu. Vous devez savoir parfaitement manier les variables, puisque maintenant, nous allons nous lancer dans les boucles. Vous trouverez des boucles dans quasiment tout langage de programmation, alors ce chapitre n'est pas que utile pour game maker. Les boucles vous serviront par exemple à effectuer plusieurs fois de suite la même action jusqu' à ce qu une condition soit vraie. Ainsi vous pourrez aussi effectuer des actions un nombre de fois défini.C'est pour cela que nous allons tout d'abord commencer par présenter la boucle while:
a) La boucle while
Le while, traduit en francais, veut dire "tant que". La syntaxe du while est la suivante:
while(condition) { //action //action //action } Tout d'abord la condition sera testée. Vous pouvez bien entendu utiliser les && et les || : while(x==1||(x==2 && y==1) Si la condition est vraie la suite d' actions situées entre crochets est réalisée puis on reteste la condition du while, si elle est fausse, on saute toutes les actions et on recommence à lire après la fin des crochets ,si elle est vraie, on réeffectue ces actions jusquà ce que la condition soit fausse. Exemple de boucle while:
while(place_free(x,y) { x=random(room_width) y=random(room_height) } Cette boucle testera d'abord si l'objet ne subit pas de collision au point x,y. Si il en subit une, les actions sont éxécutées et ses positions sont changées aléatoirement. Ensuite on reteste la condition jusqu'à ce que l objet soit à une place ou il ne subira pas de collision. Il faudra donc faire attention à mettre une condition qui peut devenir vraie après l'éxécution des actions. Sinon on appelle cela une boucle infinie, la condition est toujours vérifiée et les actions sont éxécutées un nombre infini de fois. Exemple de boucle infinie (à ne pas tester)
a=1 b=1 while(a==1) { b+=1 } Cette boucle s'effectuera un nombre illimité de fois, et sera donc une boucle infinie. Vous ne pourrez plus quitter cette boucle et le jeu sera bloqué.
b) Le do until
Il s'agit ici simplement d'une variante du while. On effectue d'abord une fois toutes les actions présentes dans la boucle puis ensuite on teste si la condition est vraie, dans ce cas on réeffectue les actions jusquà ce que la condition ne soit plus vérifiée.La syntaxe se présent ainsi:
Do { //actions //actions //actions } until(condition)
c) La boucle for
La boucle for est une boucle while que l'on a simplifié, qui offre plus de simplicité mais moins de possibilités. Elle permet d'éxécuter les actions un nombre préprogrammé de fois.
for (action,test,incrementation) { //actions //actions //actions }
La boucle for éxécute tout d'abord une fois l'action. Si le test est faux, alors on passe toutes les actions et on continue à la fin de la boucles. Si le test est vérifié, on éxécute toutes les actions. Ensuite on éxécute l'incrémentation, puis on reteste l'expression test. Si elle est vraie on éxécute les actions situées entre les crochets puis on éxécute, sinon on saute la boucle.On répète l'opération jusqu'à ce que le test ne soit plus vérifié.
d) La boucle repeat
La boucle repeat est elle encore une boucle for particulière. En effet, celle ci répétera simplement un nombre de fois donné les actions situées dans la boucle. exemple:
repeat(10) { //actions //actions } Voici un exemple qui vous montre ce que l'on peut par exemple faire avec les boucles: Telecharger l'exemple
Chapitre précédent Chapitre suivant
Introduction: Nous allons dans ce chapitre apprendre à connaitre les fonctions gml les plus importantes. De plus à la fin du chapitre, vous saurez utiliser le with, vous saurez ce que sont les ids,les variables globales,et enfin vous pourrez créez vos propres scripts et fonctions.
a)Les ids et différents instances d’un objet
Vous devez savoir de quelle facon les variables sont stockées dans game maker.Chaque objet peut avoir plusieurs instances dans la room. Chacune de ces instances a des variables qui peuvent être différentes. Par exemple, chaque soldat peut avoir une variable de vie différente. Mais comment game maker sait il à quel instance de quel objet il faut attribuer quelle variable? Eh bien, c est très simple,à chaque instance dans la room, game maker attribue un id (identifiant) différent. Cette id est un nombre supérieur à 100000. Dans l’éditeur de rooms, vous pouvez connaitre l id de nimporte quel objet en posant le curseur sur celui ci. De plus la variable id , qui est une variable que chaque objet a, indique son identifiant. Vous pouvez changer la variable de n’importe quel objet en connaissant son identifiant comme ceci: 100001.x=50 Bien entendu, vous pouvez à la place de devoir écrire 100001 en chiffres utiliser une variable. On aura donc ce code ci dessous qui aura la meme fonction. que le premier a=100001 a.x=50 De plus la fonction instance_create(x,y,objet) qui crée un objet à la position x,y retourne l’id de l’objet crée. Ainsi, vous l’avez peut être compris, vous pourrez lui assigner quelque chose dès sa création. Exemple: balle_id=instance_create(x,y,balle) //Création de l’objet balle, son id est contenu dans balle_id balle_id.speed=5 //L’objet balle qui vient d’être créé voit sa vitesse à 5 balle_id.direction=direction //et sa direction à la direction du personnage Et voilà grâce à ceci, je vais vous montrer comment on peut créer des ennemis avec chacun leurs propres barres de vies sur la tête. Je comprends que ca vous paraisse compliqué, mais essayez de chercher, c’est vraiment simple si vous avez compris le fonctionnement des ids. Voici un petit schéma qui vous aide à savoir quoi programmer
Telecharger l'exemple Lors d’une collision, la variable other contiendra l’id de l’objet entrant en collision avec l’objet principal, vous pouvez alors écrire: other.x+=1
b)Les variables locales et globales
Toute variable normale est spécifique à chaque objet comme nous venons de le voir. Chaque objet a sa valeur x, sa valeur y,... Parfois, vous voulez créer une seule variable pour tout les objets. Pour cela il faudra utiliser les variables globales. Rien de plus simple, devant le nom de la variable, mettez global. Par exemple, je peux créer la variable global.time qui sera accessible par n’importe quel objet. Voici un exemple qui vous aidera à comprendre cette utilité. Comme vous pouvez le remarquer, la valeur de cette variable globale est la meme pour toutes les barres de vies. En plus d’être universelles, les variables globales restent durant tout le jeu, et ne sont pas automatiquement réinitialisées à chaque début de room.
c)L instruction with
Maintentant que vous connaissez les id et les variables locales et globales, vous n’aurez aucun problème à comprendre le with(). Il sert à ce que l’on puisse éxécuter des actions avec une autre instance que celle qu’on est en train d’utiliser.Vous pouvez entre les parenthèses,mettre un numéro d id ou une variable qui contient ce numéro
with(100325) { instance_destroy() } Mais vous pouvez aussi y mettre un nom d’objet. Dans ce cas là l’action sera effectuée pour tous les instances de l’objet, une par une, en commencant par celle qui a la plus petite id. Vous pouvez alors écrire:
with(obj_balle) { if x<50 || x>100||y<50||y>100 instance_destroy() } Ce script détruira toutes les instances balles qui sont situées dans un carré de 50*50. En plus de cette fonction, vous pourrez aussi utiliser le mot clé all qui désigne tout les objets
with(all) { instance_destroy() } détruira simplement tout les objets.
d)Les choses à connaitre par coeur:
Il existe plusieurs fonctions dont vous aurez besoin tout le temps, c’est pour cela que je donne ici une petite liste de fonctions expliquées que nul n’est censé ignorer: Les fonctions: instance_number(objet) //retourne le nombre d’instances d’un certain objet présents dans la room show_message(string) // affiche un message string get_int(string,def) //demande à l’utilisateur un nombre avec comme question string et comme valeur par défault def get_string(string,def) //meme chose mais pour un string instance_nearest(x,y,obj) //retourne l id de l’objet le plus proche Les variables locales Chaque objet a des variables locales qui sont préprogrammées, vous pouvez avoir la liste complète dans gamemaker en écrivant menu:scripts/show-built-in-variables.Apprendre la liste complète serait abusée, voila pourquoi je vous donne ici une autre liste à aussi connaitre par coeur: x // Si vous savez pas ca, retournez au chapitre 1 y // De meme hspeed //La vitesse horizontale, en pixels/step vspeed //La vitesse verticale, en pixels/step direction// La direction du mouvement du personnage en degrés, 0 étant vers la droite id // vous devez savoir ce que c est :fleche_droite sprite_index // le nom de la sprite en cour speed // La vitesse en pixels/steps visible // si l’objet est visible:1 ou non:0 solid // si l’objet est solide:1 ou non:0 image_anglé/La rotation de l image (seulement version enregistrée) image_alphà/La transparence (seulement version enregistrée) Voila ca devrait suffir pour le moment, je ne veux pas etre sadique
Chapitre précédent Chapitre suivant Nous allons dans ce chapitre juste présenter les fonctions d'IA en 2D vue de dessus et les exliquer.Je n'ai que choisi les fonctions les plus importantes, c'est à dire celles qui vous servirons le plus. La première fonction est: mp_potential_step(x,y,stepsize,checkall) Cette fonction fait suivre l'objet qui éxécute la fonction le point (x,y) à une vitesse de stepsize en évitant les objets solides si checkall=0 et tout les objets si checkall=1. La fonction mp_potential_step_object(x,y,stepsize,obj) est semblable à la fonction précédente sauf que celle ci ne fait que éviter les objets obj. Et enfin la fonction servant à paramétrer l' IA, peut être même la plus intéressante: mp_potential_settings(maxrot,rotstep,ahead,onspot) Cette fonction paramètre les fonctions concernant l'IA en 2D.Commencons par le paramètre ahead: Celui définit le nombre de steps que l'ordi calcule à l'avance pour savoir si un mur est situé sur la trajectoire. Plus ce nombre est grand, et plus l'objet changera vite de direction avant la rencontre contre un mur. Ensuite on a le paramètre rotstep, qui définit la vitesse de rotation maximale de l'objet par step. Si vous faites une intelligence pour jeux de voitures, je vous conseille de garder cette valeur basse pour garder un mouvement fluide est réaliste. On a l'argument maxrot qui définit la direction maximale que l'objet a le droit d'avoir par rapport à la direction de l'objet vers le point (x,y). Si onspot=1 , et que l'objet est bloqué car il ne peut plus avancer ni tourner, on tourne de la direction de
Chapitre précédent Chapitre suivant
Étant donné que les fonctions de collision pour les jeux de plateforme laissent à désirer, nous allons nous mêmes créer nos fonctions pour effectuer les mouvements des objets, notamment à l'aide de boucles.
a)La gravite
Tout d'abord commencons par définir ce qu'est la gravité: La gravité c'est une force qui nous tire constamment vers le bas,et qui influe donc sur notre vitesse si nous sommes au sol, la force de réaction de celui ci est égale à la force de gravité et de sens différent. Grâce à ces définitions nous allons pouvoir ajouter de la gravité. Il faudra donc créer une variable gravite (attention ne pas mettre d'accent) qui ajoutera constamment de la vitesse à la valeur de la vitesse verticale, sauf si l'objet est au sol. On appeller la vitesse verticale vitessev. Nous aurons donc pour l'instant un script qui pourrait ressembler à ca: Pour faire bouger l'objet en fonction des valeurs vit_y et vit_x, il faudra ajouter ces valeur aux valeurs actuelles de x. create:
gravite=0.5 step:
vitessev+=gravite x+=vitesseh y+=vitessev Mais bien sur, le sol existe et sa réaction est toujours assez forte pour pouvoir arrêter l'objet. on crée donc un objet sol et on change le script de la gravité qui devrait maintenant ressembler à ceci. Voici la fonction place_meeting(x,y,obj) qui teste si il y a une collision avec obj à la position x,y. Pour la suite du tutoriel nous aurons besoin de toutes ces variables, donc ajoutez dans [i]create [i]:
gravite=0.5 vitessev=0 vitesseh=0 bougeh=0 bougev=0 [i]end step:[i]
vitessev+=gravite bougev+=vitessev /* Cette boucle va tester pour chaque pixel, pixel apres pixel s'il y y a un objet bloc. Si il y en a pas alors il faudra bouger, sinon il faut s arreter */ while(bougev>1 || bougev<-1) { if bougev>0 //si tu dois aller en bas { if (!place_meeting(x,y+1,bloc)) //Si il y a pas d’objet en bas { y+=1 bougev-=1 //alors bouge } else { bougev=0 //sinon stop tout vitessev=0 grav=0 } } if bougev<0 // si tu dois aller en haut { if (!place_meeting(x,y-1,bloc))//si il y a pas d’objet en haut { y-=1 // va en haut bougev+=1 } else //sinon { bougev=0 //stoppe le tout vitessev=0 grav=0 } } }
b)Les mouvements horizontaux
Maintenant que nous avons programmés la gravité, il nous faut programmer les mouvement horizontaux, pour cela, créons une variable bougeh:
bougeh+=vitesseh /* Meme chose pour la vitesse horizontalè/ while(bougeh>1 || bougeh<-1) { if bougeh>0 // si tu dois aller à droite { if (!place_meeting(x+1,y,bloc)) //si il y a pas d objet a droite { x+=1 //bouge à droite bougeh-=1 } else //sinon { bougeh=0 //ne bouge plus vitesseh=0 } } if bougeh<0 // si tu dois aller à gauche { if (!place_meeting(x-1,y,bloc))// si il y a pas d’objet à gauche { x-=1 //bouge à gauche bougeh+=1 } else //sinon { bougeh=0 //stoppe vitesseh=0 } } }
Voici le moteur de mouvement au point, vous n’aurez pas de ces bugs de collision de game maker et votre personnage ne se coincera dans aucun cas. Maintenant il nous faut donc plus que règler la gravité donc aussi dans step, avant que le personnage éxécute le script de mouvement: vitesseh=0 // puisque l objet ne bouge pas horizontalement si on appuie sur aucune touche
if place_meeting(x,y+1,bloc) //si il y a un bloc en dessous gravite=0 //la gravité=0 puisque annulée else //sinon gravite=0.5 //la gravité=0.5 vitessev+=gravite /*En plus, la vitesse verticale augmente à chaque step de la force de la gravité (puisque celle ci n’est que verticale)*/ Il ne nous reste plus qu'à faire les mouvements des personnages quand le joueur appuie sur les touches (le plus important mais aussi le plus simple) dans keyboard_left vitesseh=-5 dans keyboard_right vitesseh=5 dans keyboard_up : if place_meeting(x,y+1,bloc) //si il y a un bloc en dessous vitessev=-12 //saute ce qui nous donne:
if keyboard_check(vk_left) vitesseh=-5 if keyboard_check(vk_right) vitesseh=5 if keyboard_check(vk_up) if place_meeting(x,y+1,bloc) //si il y a un bloc en dessous vitessev=-12 //saute Et voila, vous pouvez tester le tout ici, et changez les valeurs de la gravité, de la vitesse du personnage et de la vitesse du saut. Voici l'exemple que j'ai fait, si vous n'arrivez pas à le reproduire: Telecharger l'exemple Maintenant qu’on a programmé tout ce qui concerne les mouvements du personnage, on va continuer en ajoutant des ennemis. Vous aimeriez faire des ennemis qui vous tuent si vous venez par un des cotés, mais si vous leur sauter dessus, c’est eux qui meurent ? C’est très simple. Créez tout d’abord un objet ennemi.Maintenant faisons le bouger, Pour les mouvements vous pouvez reprendre le code du personnage controlable. Ensuite son intelligence. Sa seule intelligence sera d’aller à gauche quand il rencontrera un bloc à sa droite et vicêversa. Pour cela dans step
if place_meeting(x+1,y,bloc) //si il y a un bloc à sa droite vitesseh=-5 //Bouge vers la gauche if place_meeting(x-1,y,bloc) //Si il y a un bloc à sa droite vitesseh=5 //Bouge vers la droite Voila notre petit ennemi bouge, il ne suffit que de lui donner une vitesse horizontale initiale, donc, dans create: vitessseh=5
c)Ajouts d'ennemis
Lors d’un événement de collision, le mot other signifie l’autre objet qui entre en collision. Pour détruire l’autre objet de la collision, il faut donc écrire: with(other) instance_destroy() Maintenant je vais utiliser ca pour tuer l’ennemi, le code ressemblera à ceci:
if vitessev>5 //si ma vitesse verticale est supérieure à 5 (autrement dit si je tombe) with(other)instance_destroy() //détruit l'autre objet, c est à dire l'ennemi en question else //sinon (si je ne tombe pas) instance_destroy() //détruit l'objet joueur Et voilà nous avons créés notre premier jeu de plateforme, j’éspère que vous avez compris la logique de la gravité.Je sais bien que le code est bien plus dur que ce que l’on pourrait faire avec les fonctions de collisions basiques de game maker, mais je voulais vous donner un moteur de jeu de plateforme qui ne fasse jamais de bugs de collisions et j’éspère que vous en êtes satisfait. De toute facon, ce n’est pas grave si vous ne comprenez pas tout ce qui est codé dans le step. Si vous ne comprenez pas tout, relisez ce chapitre, ou revenez dessus plus tard, jusqu’à ce que vous comprenez. Voici sinon le jeu de plateforme avec les ennemis, en gm6: Telecharger
Chapitre précédent Chapitre suivant
Les views ? Vous devez vous demander ce que cela signifie. Souvent vous voulez créer un jeu avec des niveaux longs qui prennent plus de place que l’écran. Dans ce cas là, vous devrez créer une sorte de caméra qui suit l’objet principal pour que vous puissiez vous ballader partout en gardant toujours votre personnage sur la vue. Nous allons donc apprendre dans ce chapitre, à inclure des views. Créez tout d'abord un objet que l'on peut controler au clavier et changez le background du niveau en un background qui ne se répéte pas. Testez. On remarque que le personnage peut sortir de l'écran. Nous allons maintenant remédier à ce problème. pack disponible ici
a)Initialisation des views
Pour que les views puissent fonctionner, il va falloir ouvrir la room correspondant au niveau dans lequel vous voulez utiliser des views, et, dans l'onglet views,cocher enable the use of views, choisissez la view0 et cochez aussi visible when room starts. Ensuite choisissez comme objet pour object following l'objet que vous avez crée. Cela aura comme conséquence que la caméra suivra l'objet que vous choisissez. Pour que les views soient utiles, il vous faut une room qui est plus grande que la taille de la view. Pour cela, dans l'onglet settings, changez la width a 6400 et la height a 4800 par exemple. Vous pouvez maintenant tester ceci avec les views, vous pouvez voir que maintenant, quand le personnage sortira de l'écran, la caméra se chargera de le suivre automatiquement et vous verrez ce personnage même s'il sort de l'écran.
b)Paramêtres des views
Vous pouvez changer certains paramètres des views. Pour cela réouvrez la room dans laquelle vous voulez changer les paramètres. Vous avez trois grandes cases: view in room, port on screen et object following. Commencons tout d'abord par étudier la case view in room. C'est ce que la caméra va montrer au joueur dans la room. Vous pouvez changer la largeur et la hauteur, mais aussi à quelle position la view sera au début du niveau. Dans la case Port on Screen, vous pouvez régler ou la view sera visible sur l'écran. Vous pouvez aussi bien changer la hauteur, la largeur ou la position de la vue dans la room. La dernière case, object following, prend en compte plusieurs paramètres. D'abord vous pouvez changer l'objet que la caméra doit suivre. Ensuite vous pouvez changer hbor et vbor, qui désignent des bords verticaux et horizontaux, à partir desquels la caméra bouge quand l'objet à suivre est en dehors de la view. Par exemple si vous choisissez vbor=60 et hbor=60, quand l'objet se situera à 60 pixels d'un des bords, la caméra se replacera. Vous pouvez en plus changer la vitesse horizontale et verticale de la caméra quand l'objet dépasse les bords horizontaux ou verticaux. Une valeur de -1 pour les vitesses fera que la vitesse de la camera sera instantanée. Testez plusieurs possibilités pour comprendre mieux le fonctionnement de ces paramètres.
c)Paramêtrage en GML
Plusieurs fonctions pour changer les options des views existent en gml. view_xview[0..7] La position x de la caméra view_yview[0..7] La position y de la caméra view_wview[0..7] La largeur de la vue de la caméra view_hview[0..7] La hauteur de la vue de la caméra view_xport[0..7] La position x de la vue sur l'écran view_yport[0..7] La position y de la vue sur l'écran view_wport[0..7] La largeur de la vue sur l'écran view_hport[0..7] La hauteur de la vue sur l'écran view_hborder[0..7] Bord horizontal (en pixels). view_vborder[0..7] Bord vertical (en pixels). view_hspeed[0..7] Vitesse horizontale maximale. view_vspeed[0..7] Vitesse verticale maximale. view_object[0..7] nom de l'objet à suivre. Bien sur, remplacez ce qu'il y a dans les crochets par un des chiffres de 0 à 7 pour utiliser une des 8 views. Exercice Essayez de créer un autre objet que l'on controle avec les touches du clavier w,a,s,d. Et de faire que, quand le joueur appuye sur espace,la caméra suit l'autre objet. correction de l'exercice: exemple view3 du pack
d)Plusieurs views pour des jeux multijoueurs
Vous pouvez aussi créer des jeux multijoueurs sur un ordinateur avec plusieurs views qui suivent chacun un autre objet. exemple disponible dans le pack: multiview
Chapitre précédent Chapitre suivant
Attention: Vous devez avoir la version enregistrée de gamemaker pour pouvoir utiliser les particules. Si vous ne l'avez pas, passez au chapitre suivant. Vous voulez créer de jolis effets dans vos jeux ? Vous avez peut etre essayés de créer des effets en créant plusieurs objets d'un mème type. Mais vous avez surement remarqués que ces objets pompent énormément de ram sur votre ordi. Mark Overmarks, le créateur de gamemaker, a pensé à créer un type d'objet simplifié qui n'a qu'une fonction de décor dans le jeu et qui ne réagit à aucun événement. Ce type d'objet est largement simplifié, et ne contient donc pas les événements des objets normaux.
a)Initialisation du système de particules
Avant de commencer à utiliser les particules, vous devrez simplement créer un système de particules. Pour cela, utilisez la fonction part_system_create(). Elle retourne l'id du système ainsi crée. Gardez cet identifiant dans une variable, car il vous sera nécessaire pour toute fonction utilisant des particules. Après avoir utiliser le système de particules, vous pouvez le détruire avec la fonction part_system_destroy(ind) qui prend en valeur l' id du système a détruire.
b)Création de différents types de particules
Maintenant que nous avons crée un système de particule, nous pouvons créer différents types de particules. Chaque type de particule pourra avoir sa forme, couleur, taille, vitesse, gravité spécifique. Pour cela il existe une multitude de fonctions que nous allons étudier. part_type_create() Cette fonction crée un type de particules et retourne son index part_type_shape(ind,shape) Cette fonction change la forme de la particule par shape. Les formes de particules par défault sont lessuivantes:
pt_shape_pixel pt_shape_disk pt_shape_square pt_shape_line pt_shape_star pt_shape_circle pt_shape_ring pt_shape_sphere pt_shape_flare pt_shape_spark pt_shape_explosion pt_shape_cloud pt_shape_smoke pt_shape_snow Vous pouvez aussi mettre comme forme de la particule une image sous forme de sprite: part_type_sprite(ind,sprite,animat,stretch,random) ind: index du type de particule sprite: nom du sprite animat: si l image doit être animée ou non stretch: désigne si l'image est agrandie durant la vie de la particule random: si la première image de l'animation doit être aléatoire ou non part_type_size(ind,size_min,size_max,size_incr,size_wiggle) ind est l index du type, la taille de la particule sera comprise entre size_min et size_max aléatoirement pour chaque particule du type.size_incr désigne l augmentation de la taille de la particule entre chaque step.Et enfin size_wiggle désigne le clignotement de la particule. Par exemple, vous pouvez faire un effet d'étoile scintillante avec un size_wiggle. part_type_color3(ind,color1,color2,color3) designe trois couleurs color1,color2 et color3 que doit avoir la particule ind en fonction du temps part_type_alpha3(ind,alpha1,alpha2,alpha3) designe trois valeurs alphas que doit avoir la particule en fonction du temps part_type_life(ind,life_min,life_max) le temps de vie en steps de la particule est une valeur comprise entre life_min et life_max. Après ce temps, la particule est dètruite. Vous pouvez choisir de générer un certains nombres d'un certain type de particules à la mort de la particule. part_type_death(ind,death_number,death_type) ind désigne l index de la particule qui, quand elle meurt, créera un nombre death_number de particules de type death_type. Grace a cette fonction, vous pouvez créer par exemple un feu d'artifice. Enfin, on a aussi des options pour la vitesse, la direction et la gravité des particules. Ces trois fonctions sont: part_type_speed(ind,speed_min,speed_max,speed_incr,speed_wiggle) part_type_direction(ind,dir_min,dir_max,dir_incr,dir_wiggle) part_type_gravity(ind,grav_amount,grav_dir) Maintentant qu'on a créé un certain type de particule, on va voir comment créer un certain nombre d'un certain type de particules à une certaine position. part_particles_create(ind,x,y,parttype,number) ou index est l'index du système, x et y la position ou seront crées un nombre number de type de particules parttype.
c)Les emetteurs de particules
Pour cela, il faut commencer paar créer un émetteur. La fonction correspondante est: part_emitter_create(ps) la fonction retourne l index de l'emetteur, il est donc à stocker dans une variable. Il faut ensuite délimiter un endroit de création des particules crées par l'émetteur: part_emitter_region(ps,ind,xmin,xmax,ymin,ymax,shape,distribution) ou xmin,xmax,ymin,ymax sont le rectangle dans lequel la forme de l'émetteur est comprise, shape est une valeur de forme qui peut etre une des suivantes: ps_shape_rectangle ps_shape_ellipse ps_shape_diamond ps_shape_line et distribution est le type de distribution: ps_distr_linear qui créera aléatoirement partout des particules ps_distr_gaussian qui créera plus de particules au centre de la forme que aux bords de la forme part_emitter_region(ps,ind,xmin,xmax,ymin,ymax,shape,distribution) grace a cette fonction vous pouvez changer la position des émetteurs, et donc changer l'endroit ou les particules seront crées par l'émetteur. Et enfin, voici la fonction permettant de créer des particules, à partir d'un certain émetteur: part_emitter_burst(ps,ind,parttype,number) ind étant l'index de l'émetteur, vous pouvez ainsi créer un certain nombre de particules du type parttype, il faudra appeler cette fonction à chaque fois que vous voudrez créer des particules. part_emitter_stream(ps,ind,parttype,number) Cette fonction semble etre la même que la précédente. Or, au lieu de devoir l'appeler à chaque fois que vous voudriez créer des particules, il faudra appeler cette fonction une seule fois, ensuite, à chaque step, le nombre de particules sera créé.
Chapitre précédent
Introduction Nous avons vu dans un autre chapitre sur les jeux de plateforme comment mettre en place un système permettant au joueur de contro-ler les sauts, la gravité et la possibilité de tuer un ennemi en lui sautant dessus. Dans cette deuxième partie sur les jeux de plateforme,nous allons apprendre à créer du terrain dynamique, c'est à dire par exemple de la glace, sur laquelle le joueur glissera, de l'eau, dans laquelle le joueur pourra nager, et enfin, des plateformes qui cèdent quand on marche dessus et des plateformes qui bougent.
a)L'effet de glace
Cet effet est trè simple à réaliser: Réfléchissez! Si l'on reprend l'exemple que j'ai donné dans le premier chapitre sur les jeux de plateforme: ici On peut remarquer que dans step, nous avons mis au tout debut du code: vitesseh=0. Testons voir en enlevant cette ligne(je ne vous donne pas d'exemple pour l'instant, considérant que chacun peut effectuer ce changement élémentaire. En enlevant cette ligne, on observe que le bonhomme, une fois parti, ne s'arrête plus. Or nous voulons qu'il s'arrete, mais juste progressivement. Pour cela, nous allons tester si l'objet situé en dessous du bonhomme est un objet de type glace. Si oui, on arrètera le bonhomme petit à petit avec le script suivant:
if place_meeting(x,y+1,obj_glace)//si il y a de la glace en dessous de mes pieds { if vitesseh!=0 // si la vitesse horizontale est différente de 0 vitesseh*=0.95 //ralentit ,0.95 etant le pourcentage de vitesse qui reste aprè chaque step, soit 5% de perte. Vous pouvez bien entendu changer cette valeur if vitesseh<0.5 && vitesseh>-0.5 //si ma vitesse est faible vitesseh=0 //arréte toi complétement } else //si il n'y a pas de glace { vitesseh=0 //arrête toi complétement } et dans les options de l'objet glace, mettez lui comme parent l'objet bloc, pour que il soit aussi reconnu comme bloc solide. Vous pouvez maintenant tester à partir de votres modifications ou à partir de l'exemple disponible ici: telecharger
b)L'effet d'eau
Dans l'eau, grace à la poussée d'Archimède, tout corps est soumis à une force qui le pousse vers le haut, en fonction de son volume, et de sa surface de contact avec l'eau. En plus de la gravité,dans l'eau il faudra donc rajouter une vitesse verticale à chaque step. Au lieu de rajouter une vitesse verticale supplémentaire, on peut aussi changer la force de la gravité. C'est cette technique que nous allons utiliser. En plus de cela, l'eau étant plus dense que l'air, la vitesse diminue très vite dans l'eau. Il faudra donc que la vitesse diminue d'un certain pourcentage par step. Si le personnage est en contact avec de l'eau, la gravite vaut 0.2, sinon la gravité vaut 0.5. Essayez voir de coder cela.
if place_meeting(x,y,eau) { gravite=0.2 vitessev*=0.8 } else { gravite=0.5 } Eh edi9999, c'est bizarre j'ai un problème, je ne vois plus mon personnage quand il est dans l'eau, comment ca se fait et comment puis je le changer ? C'est normal, en fait game maker dessine les sprites en fonction de leur profondeur. Plus la profondeur est petite, et plus le sprite est dessiné en dernier. Pour que l'eau soit dessinée en première, il faut donc que la depth de l'eau soit plus petite que celle du joueur. Vous pouvez donc par exemple mettre la depth de l'eau a -1 dans les options de l'objet. Dans l'eau on peut bien sur nager, il faut donc, en plus de pouvoir sauter, pouvoir nager . Pour cela il va vous falloir ajouter dans les accolades de place_meeting(x,y,eau) une action qui augmente la vitesse verticale, si on appuye sur la flèche haut. Ajoutez donc ce code: if keyboard_check(vk_up) && vitessev>-2 vitessev-=3 ca donne, en tout: if place_meeting(x,y,eau) { gravite=0.2 vitessev*=0.85 if keyboard_check(vk_up) && vitessev>-2 vitessev-=3 } else { gravite=0.5 }
et voila le gm6 pour tester tout cela: ici
c)Et maintenant, les plateformes qui bougent.
1)Les plateformes instables Vous avez toujours révés d'inclure des plateformes qui tombent quand le personnage saute dessus ? c'est très simple à programmer,vous verrez. On va donc d'abord insérer ce code: Ajoutez ce code dans step:
if place_meeting(x,y+1,bloc_tombe) { bloc_tombe.gravity=0.4 } Vous devriez donc obtenir dans step:
vitesseh=0 if place_meeting(x,y+1,bloc) //si il y a un bloc en dessous { gravite=0 //la gravité=0 puisque annulée vitessev=0 } if place_meeting(x,y+1,bloc_tombe) { bloc_tombe.gravity=0.4 } else //sinon gravite=0.5 //la gravité=0.5 if keyboard_check(vk_left) vitesseh=-5 if keyboard_check(vk_right) vitesseh=5 if keyboard_check(vk_up) if place_meeting(x,y+1,bloc) //si il y a un bloc en dessous vitessev=-12 //saute vitessev+=gravite bouge_script() // reuploade la position en fonction de la vitesse horizontale et verticale essayez donc de créer un bloc_tombe dans la room. Vous verrez,ca marche plutot bien. Mais maintenant,essayez voir de créer plusieurs bloc_tombe. On est face à un probléme: tous les bloc_tombe tombent en meme temps. (c'est parce qu'il faudrait seulement que l'objet qui soit en dessous du personnage tombe) Il va donc falloir utiliser les id. Or, la fonction instance_place(x,y,obj) retourne l'id de l'objet qui est situé à la position (x;y) à la place de bloc_tombe.gravity=0.4, mettez
with (instance_place(x,y+1,bloc_tombe)) { gravity=0.4 } Vous allez maintenant surement me dire qu'il y a un autre problème. Effectivement, le personnage s'arrête après avoir touché un objet bloc_tombe. Or l'objet personnage doit avoir la même vitesse que l'objet sur lequel il tombe quand il rentre en contact avec celui ci. Dans le script bouge_script, dans le else correspondant à la condition if (!place_meeting,x,y+1), remplacez le vitessev=0 par vitessev=(instance_place(x,y+1,bloc)).vspeed. Aussi changez dans le step de l'objet personnage, dans la meme condition if place_meeting(x,y+1,bloc), remplacez le vitessev=0 par vitessev=(instance_place(x,y+1,bloc)).vspeed. Puis enfin, mettez dans end step l'éxécution du script bouge_script à la place de dans step. Ainsi, le gm6 pour faire des plateformes qui tombent pourrait ressembler à ceci: telecharger
2)les plateformes qui bougent. Ceci est une question qui revient très souvent, et qui est d'ailleurs, comme nous allons le voir plutot dure a résoudre. Créez premiérement un nouvel objet pour les plateformes qui bougent que vous pouvez programmer de la facon que vous voulez. Avec des alarms, par exemple. Mettez à cet objet le parent bloc, pour qu'il se comporte comme un bloc, et que les collisions avec celui ci soient gerees comme si c'etait un bloc. Dans l'evenement de creation de l'objet, nous allons mettre ceci, pour permettre les mouvements de l'objet facilement:
vitessev=0 vitesseh=0 Puis a l'evenement begin-step de l'objet, ajoutez, pour permettre le mouvement:
x+=vitesseh y+=vitessev Voila, nous avons déja une plateforme qui bouge, mais on ne peut pas encore monter dessus. Ca vient, ne pressez pas surtout. D'abord, dans l'objet principal, ajoutez dans l'évenement create: scotch=0 Cette variable contiendra en permanence l'id de la plateforme sur laquelle l'objet sera. Puis dans l'objet de la plateforme, on ajoute, à la toute fin du code de begin step,ceci:
with(joueur_obj) { if position_meeting(x,y+1,object2) { scotch=instance_nearest(x,y+1,object2) } else scotch=0 } if joueur_obj.scotch==id { joueur_obj.x+=vitesseh joueur_obj.y+=vitessev } La premiere partie va tester si il existe un objet2 juste en dessous de l'objet principal. Puis l'objet va tester si cet objet est l'objet qui execute le code. Dans ce cas, il va ajuster les positions de l'objet principal en fonction de la vitesse horizontale et verticale. Vous pouvez tester ce code. Ca ne marche pas encore super bien a la descente. Nous allons devoir effectuer des changements dans le bougescript. Ouvrez le script en doublêcliquant dessus. Quand un objet tombe, s'il rencontre un autre objet, normalement, il s'arrete. Mais si l'autre objet est lui meme en mouvement, l'objet qui tombe va devoir prendre la même vitesse que l'objet qui le retient. le (!place_meeting(x,y+1,bloc)) teste si il n'y a pas d'objet situé juste en dessous de l'objet principal. Nous nous intéressons donc au else correspondant. Il y a dedans ecrit:
bougev=0 //sinon stop tout vitessev=0 grav=0 c'est donc la ligne vitessev=0 qui nous arrange pas. si il y a un objet qui bouge en dessous, il ne faudra pas executer cette ligne. Ca donne donc:
bougev=0 //sinon stop tout if !place_meeting(x,y+1,object2) //si il n'y a pas d'objet qui bouge vitessev=0 //tu peux t'arreter /*implicitement sinon : ne change rien a la vitesse verticale.*/ grav=0 et voila, ca marche presque. Pourquoi presque? Essayez de sauter sur la plateforme, ca marche quand on monte, mais pas quand on descend. Pour remédier a ce problème, il va simplement falloir changer l'ordre d'éxécution. Il faut d'abord faire bouger l'objet, et ensuite voir si le joueur appuie sur la touche haut pour sauter. Donc, dans l'évenement step de l'objet principal. La fin du code de step doit donc ressembler à ca:
if keyboard_check(vk_up) if place_meeting(x,y+1,bloc) //si il y a un bloc en dessous vitessev=-12 //saute bon, si vous avez réussi a suivre, ca devrait marcher impeccablement, sinon voici un exemple qui marche: ici Et voila, nous avons finis la partie 2 de ce tutoriel. Je vous propose donc ici des jeux que vous pouvez maintenant créer sans problèmes: -Un petit jeu de plateforme -Un jeu de tirs vu de dessus ou en plateforme Je vous attends pour la troisième partie, qui sortira je l'éspère avant septembre 2009.
Par edi9999. |
12/04/2009 par edi9999 |
20 Commentaires
|
|
par nicoulas @ 13/04/2009 11:50 am |
J'ai pas tout lu, mais c'est bien expliqué et bien structuré, il manque juste une meilleure mise en forme au niveau des titres pour qu'ils resortent mieux. |
par daminetreg @ 14/04/2009 04:09 pm |
Merci Alpha d'avoir ajouté ce tuto. On a trop du mal à trouver les moyens en matière de temps actuellement pour faire avancer Le CBNA. On laisse pas tomber, ça va revenir, d'ici quelques temps, avec les résultats de la compétition, et on s'occupera de la mise en forme etc. Merci à toi et edi bien sûr pour son super tuto qui aurait dû être posté depuis bien longtemps. |
par Alpha @ 14/04/2009 08:32 pm |
De rien |
par Topaze22 @ 14/04/2009 11:06 pm |
Je tiens à signaler que je n'ai pas encore laisser de commentaire simplement parce que je n'ai pas encore finis de le lire |
par MrHappy @ 19/04/2009 01:23 pm |
Super tuto, juste un eptit effort à faire au niveau de la mise en forme comme le disait nicoulas |
par Red-Error @ 24/04/2009 08:08 pm |
'Ai jeté un coup d'oeil dessus, et ça a l'air très intéressant! Je le lirai plus tard, mais je sens que je vais affûter mon savoir! |
par nicoulas @ 30/04/2009 09:25 pm |
Ah impec la nouvelle mise en forme |
par Red-Error @ 19/05/2009 10:00 pm |
Petit soucil: "image_alphà/La transparence (seulement version enregistrée)" Version non-reg également (heureusement!, comme image_x/yscale, ...) Et les quelques coquilles je relève pas... Donc, la mise en page est nette, les explications pas trop difficiles à comprendre (sauf si on n'a pas de logique), tout est expliqué assez simplement je trouve. 'Cor bravo. |
par erreur de frappe @ 17/06/2009 09:56 pm |
J'ai un gros problème. Il a l'air simple, mais je trouve pas de solution! Imaginez que vous faites une croix qui tourne sur elle-même. Et à l'extremité d'une barre de la croix, vous ajoutez un objet qui tourne avec la croix. Je sais c'est dûr à comprendre... Je trouve aucune solution, mais peut-être que vous, si! |
par erreur de frappe @ 17/06/2009 09:58 pm |
J'ai un gros problème. Il a l'air simple, mais je trouve pas de solution! Imaginez que vous faites une croix qui tourne sur elle-même. Et à l'extremité d'une barre de la croix, vous ajoutez un objet qui tourne avec la croix. Je sais c'est dûr à comprendre... Je trouve aucune solution, mais peut-être que vous, si! |
par johny wessmuller @ 15/04/2010 08:17 pm |
Bon tuto moi aussi je t'attends pour la partie 3 |
par Bob @ 01/08/2010 02:58 am |
Bravo bon tuto! Mais j'ai un probleme au niveau des views. imaginons que je veux que mon personage se tranforme, a ce moment la la view ne le suit plus. du coup j'ai decidé de crrér un objet invisible qui aurait la meme valeur de de x que mon perso, et la camera le suivrait. Mais je n'arrive pas a faire en sort que l'objet le suive... Help me please! |
par Bob @ 01/08/2010 12:12 pm |
Bon ben désolé du double poste j'ai trouvé reponse a ma question en faisant des tests sur mes objets... Au début j'avais fait un event "create" puis ensuite les lignes de codes : "if instance_exists(perso) { x = perso.x y = 5 } if instance_exists(perso2) { x = perso2.x y = 5 }" comme ça ne fonctionnait pas j'ai décidé de mettre ces commandes pour les touches de control, et là ça fonctionne! Donc a la place de "create" j'ai créé 3 events : "left, right, up". |
par jux @ 15/09/2010 07:10 pm |
comment creer un laser qui apparait a l'endroit de la fusee quand onappui sur espace ???? |
par marioj @ 20/03/2011 03:09 pm |
comment faire une barre de viejavascript:insertext('','short') |
par Rush @ 11/06/2011 02:07 am |
merci, j'ai réussi a comprendre de nouveaux trucs avec ton tutoriel |
par floyoshi @ 28/07/2011 05:22 pm |
c'est quel game maker que tu utilise car les code de gml prend pas dans game maker 8.0 |
par Mr.GARRY @ 18/10/2011 08:49 pm |
Bonjour, J'aimerais avoir le liens vers la 3e parties, je vais impatiemment lire ce texte. J'espère que sa parle aussi de la version pro. J'espère aussi que sa marche avec le 8e version. Cordialement. Mr.GARRY |
par libero dark @ 01/11/2011 04:45 pm |
voila bonjours vous j'aimerai savoir comment peut ton configurer les deplacements d'un personnage (objet) pour qu'il puisse avancez que quand on lui demande avec la la touche preconfigurer |
par ratjeux @ 28/12/2011 12:31 am |
merci, trés bon tuto. plutot complet |
|
[Archives News 2005] [Archives News début 2006]
|
Base de données des Jeux:
Opérationnelle
Base de données
des logiciels: Opérationnelle
Base de données des GMD: Opérationnelle
Base de données des GM6: Opérationnelle
Base de données des Librairies: Opérationnelle
Base de données des DLL: Opérationnelle
Base de données
des Moteurs: Opérationnelle
Contenu Général du CBNA: Opérationnelle
Base de données Forum: Opérationnelle
|