Atelier GML 2
Conditions, opérateurs booléens et scripts Bonjour. Après l'atelier 1 qui était plutôt simple, voici un atelier qui vous feras un peu plus plonger dans la programmation.
Cette fois si nous allons voir une notion assez fondamentale, la condition (et ce qui va avec, les opérateurs booléens).
Grâce aux conditions nous allons avoir énormément de possibilités, alors attendez vous a une tonne d'exos en fin de page :p
Pour approfondir, vous pouvez lire ou relire les
deux premiers tutoriels sur le GMLLes conditionsUn peu de théorieLes conditions permettent, d’exécuter ou non un code en fonction d'une valeur, le plus souvent variable.
Cette valeur doit être de nature booléenne, c-a-d qu'elle ne prend que true (vrai) ou false (faux), équivalents a 1 ou 0.
Une condition s'écrit de cette manière :
- Code:
-
if(condition)
{
//Bout de code
}
La condition peut être constante (ceci est complètement inutile) ou variable.
"Bout de code" ne seras exécuté que si la condition est vrai, et donc que sa valeur est a 1 (plus exactement GM identifie vrai pour toutes les valeurs >=1, et false les valeurs négatives ou nulles)
Le mot clé else (sinon) permet d’exécuter un code si, la condition n'a pas été vérifié.
Syntaxe :
- Code:
-
if(condition)
{
//Bout de code
}
else
{
//Autre bout de code
}
Si on devais résumer ce code en une phrase, ce serais :
Si la condition est vrai, alors exécuter "Bout de code", sinon exécuter "Autre bout de code".
En pratiqueLes conditions vous serons très utiles, notamment pour vérifier les appuis de touches.
Voici un exemple simple et concret, a mettre dans le draw event d'un object :
- Code:
-
if(keyboard_check(vk_space))
draw_text(16, 16, "Vous appuyez sur espace")
else
draw_text(16, 16, "Appuyez donc sur la touche espace")
Ce mot clé seras très utilisé aussi pour la détection des collision, des demande des conditions.
Les opérateurs booléens, et les opérateurs de comparaisonUn peu de théorieLes opérateur booléens sont des opérateurs qui vous permettront de vous simplifier la vie lorsque vous utilisez des conditions.
Je vais présenter ici
and et
or (et, et ou).
Le and vous permettra de vérifier plusieurs conditions, sans avoir a en imbriquer plusieurs. Il fonctionne comme n'importe quel opérateur booléen, et s'utilise entre deux expressions booléennes (une expression booléennes est une opération dont le résultat est true ou false)
Syntaxe :
- Code:
-
if(condition1 and condition2)
{
//Mon code
}
"Mon code" ne seras alors exécuté qui si les conditions sont vrai.
Le or quand a lui vérifie qu'au moins une des deux conditions est vrai, et s'utilise de la même manière que le and.
Le and s'écrit aussi &&, et le or quand a lui ||. Ne soyez donc pas étonnés si vous tombez sur ce genre de syntaxe :p
J'ai parlé d'expressions booléennes plus haut, et une question devrais vous venir a l'esprit. De quoi est constitué une expression booléenne ?
Et bien c'est très simple. Comme d'habitude on a deux paquets (qui peuvent être des opérations, ou des variables, mais dont la valeur ou le résultat doit toujours être un nombre), et un opérateur au milieu. Ici un opérateur de comparaison.
GM admet les opérateurs de comparaison suivants : <, <=, >, >=, ==, !=.
Soit plus petit, plus petit ou égal, plus grand, plus grand ou égal, égal, non égal.
Ainsi utiliser un opérateur de comparaison ne permettra d'obtenir que deux résultats, true ou false.
Exemples :
5 < 8 : true
42 == 42 : true
5 != 5 : false
6 >= 5 : false
En pratiqueIl y a tellement de moments ou vous devrez utiliser ces opérateur qu'il me serais impossible de vous faire une liste complète. Voici tous de même quelques exemples variés :
Vérifier la valeur de plusieurs variables :
- Code:
-
if(score >= 100 && health >= 50 && lives>=5)
{
show_message("You are PGM !!!")
game_end()
}
Une de ces touches est elle pressée ?
- Code:
-
if(keyboard_check(vk_left) || keyboard_check(vk_right) || keyboard_check(vk_up) || keyboard_check(vk_down))
draw_text(16, 16, "Vous appuyez sur une fleche")
Déplacer un objet vers la gauche et verifier les collisions
- Code:
-
if(keyboard_check(vk_left) && place_free(x-1, y))
x -= 1
Créez vos scripts GMLUn peu de théorieUn script est en fait une fonction, écrite par le codeur. Ils sont donc 100% customisables et très pratiques.
N'aillez pas peur de les utiliser donc.
Un script s'appelle comme un fonction. Vous écrivez son nom, puis ses paramètres séparés par des virgules le tout entre parenthèses.
Vous pouvez choisir de faire une fonction qui va faire une action sans renvoyer de valeur, ou de faire une fonction qui va renvoyer une valeur en fonction de sers paramètres.
Dans un script vous pouvez renvoyer une valeur avec le mot clé return.
Syntaxe :
- Code:
-
return expression
(Et l'expression n'est pas obligatoirement booléenne)
Pour récupérer un paramètre, c'est a une variable locale au script nommé argument qu'il faut faire appel.
argument0 vous donne la valeur du premier paramètre, argument1 le deuxième, et ainsi de suite.
En pratiqueSi vous avez du mal avec les scripts, je vous conseille vivement de vous entrainer et de persévérer.
Ils vous feront gagner un temps non négligeable et sont au moins aussi importants que les fonctions (vu que c'en est).
Voici quelques exemples de fonctions plutot simples :
addition(x, y)
- Code:
-
return argument0 + argument1
sign(x)
- Code:
-
if(x>0) return 1
if(x<0) return -1
return 0
sort_de_la_room(x, y)
- Code:
-
if(x<0 || y<0 || x>=room_width || y>= room_height)
return true
return false
Exercices Merci de poster vos réponses aux exercices en spoiler Réalisation d'un platformer 2dA partir de l'exercice 2, je vous conseille d'utiliser le mot clé repeat(n), qui permet de répéter le code qui suit n fois.
Bien sur vous n'êtes pas obligé, mais ça simplifie énormément les choses
1 - Mr SquareFaites un carré qui peut ce déplacer en fonction des touches flechées, mais qui ne peut pas traverser l'objet solid Wall
2 - 2d WorldUtilisez une variable que vous nommerez verticalGravity pour simuler la gravité.
Positionnez Mr Square en hauteur, et laissez le tomber sur de durs objets Wall.
Limitez aussi sa vitesse de chute.
3 - Mr Square is alive !Cette fois, permettez a Mr Square de ce déplacer sur les cotés, et de sauter quand on presse la touche espace.
4 - Un monde bien rangéRendez le code plus propre en utilisant des fonctions.
Créez une objet tremplin qui permettra a Mr SQuare de sauter plus haut qu'avec le saut normal.
5 - Square of PersiaImplémentez les sauts muraux pour Mr Square.
6 - NoooooPermettez a Mr Square de s'agripper aux rebords d'une falaise :p
Indices et solutionsVoici des indices pour les mauvais
Et les solutions pour ceux qui sont encore plus mauvais x)
1.
- Spoiler:
Il y a un exemple de collision plus haut.
2.
- Spoiler:
Chaque step, verticalGravity s'incrémente d'une valeur constante qui définiras la gravité.
Et Mr Square tombe chaque step de la valeur de verticalGravity
Solution3.
- Spoiler:
Pour faire sauter Mr Square, il vous suffit de mettre une valeur négative suffisamment 'grande' a verticalGravity
Solution4.
- Spoiler:
Impossible de faire plus simple la
Solution5.
- Spoiler:
Créez une variable horizontalSpeed et utilisez la a peu près comme pour verticalGravity et la gravité,
sauf qui faut la décrémenter chaque step (friction).
Solution6.
- Spoiler:
Solution