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


1)Le gml(2)

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

2)Le gml(3)

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

3)L'IA(1)

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

4)Les jeux de plateforme

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

5)Les views

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

6)Les particules

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éé.

7)La plateforme(2)

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. super

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 clin

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 coeur

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 super

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! happy1

par nicoulas @ 30/04/2009 09:25 pm
Ah impec la nouvelle mise en forme ange

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. fier
'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! triste
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... gniah Je trouve aucune solution, mais peut-être que vous, si! super

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! triste
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... gniah Je trouve aucune solution, mais peut-être que vous, si! super

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".
gnii

par jux @ 15/09/2010 07:10 pm
comment creer un laser qui apparait a l'endroit de la fusee quand onappui sur espace ???? gniah question

par marioj @ 20/03/2011 03:09 pm
comment faire une barre de viejavascript:insertext('question','short')

par Rush @ 11/06/2011 02:07 am
merci, j'ai réussi a comprendre de nouveaux trucs avec ton tutoriel ange

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 triste

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
merciange, trés bon tuto. plutot complet

Nom:
Mail: (optionel)
Êtes vous Humain? (Entrez oui si c'est le cas)

smile's:

fleche_dfleche_gbehgniihappy1questionrirerire2rougesupertristeangeclincoeurcoleredodofierghagniahhaphehehhontenonnon3ouhouisnif

| M'oublier
[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