Forum Solarus-Games francophone

Jeux amateurs => Programmation => Discussion démarrée par: Chao le 30 Novembre 2011 à 21:06

Titre: GML
Posté par: Chao le 30 Novembre 2011 à 21:06
Hellow,

J'aimerai me mettre un peu au GML (Game Maker Language) mais je ne trouve pas de documentation sur le langage.
Je me souviens d'un fichier word/pdf que j'avais trouvé il y a quelques années mais je ne le retrouve pas et chercher sur google m'amène partout sauf où je veux.

Si vous avez quelque choses merci de me donner le lien.

English is fine too.

Merci.

//EDIT//
Problème résolue, je poste le lien de ZR vers la documentation au premier poste pour éviter au futur personne de chercher plus loin qu'il le faut :).

ici (http://gamemaker.info/fr/manual)

Le topic peut rester ouvert puisqu'il est possible d'en faire un regroupement de question sur le langage.
Titre: Re : GML
Posté par: Morwenn le 30 Novembre 2011 à 22:50
En fait, il n'y a pas grand-chose à apprendre du langage en lui-même, il est très basique et est inspiré du C, sauf que tu ne déclares pas tes variables, tu ne les types pas explicitement et les seuls types présents sont les réels et les chaînes ne caractère.
Du reste, il y a énormément de fonctions standard, qui permettent en général de faire pas mal de trucs. D'une manière générale, la documentation peut te servir aux 3/4 à faire ce que tu veux. De ce qui est du reste, il y a des tutoriels et des gens prêts à aider sur le CBNA (http://cbna.forumactif.com/f1-le-cbna) et son forum. Les membres sont généralement de bon conseil :)
Titre: Re : GML
Posté par: Arca le 30 Novembre 2011 à 22:52
Si tu as essayé le D&D de GM, il me semble qu'il y a un logiciel gratuit sur le CBNA qui montre l'équivalent GML de chaque icône D&D.
Titre: Re : Re : GML
Posté par: Chao le 30 Novembre 2011 à 23:40
Citation de: Morwenn le 30 Novembre 2011 à 22:50
En fait, il n'y a pas grand-chose à apprendre du langage en lui-même, il est très basique et est inspiré du C, sauf que tu ne déclares pas tes variables, tu ne les types pas explicitement et les seuls types présents sont les réels et les chaînes ne caractère.
Du reste, il y a énormément de fonctions standard, qui permettent en général de faire pas mal de trucs. D'une manière générale, la documentation peut te servir aux 3/4 à faire ce que tu veux. De ce qui est du reste, il y a des tutoriels et des gens prêts à aider sur le CBNA (http://cbna.forumactif.com/f1-le-cbna) et son forum. Les membres sont généralement de bon conseil :)

Justement je ne connais pas les fonctions de bases du langage en plus de n'avoir jamais fait de C donc j'aurais besoin d'une documentation les regroupant  :mrgreen:.
Titre: Re : GML
Posté par: Arca le 01 Décembre 2011 à 00:47
La documentation du logiciel regroupe une très grande partie des fonctions. Elle est aussi disponible ici (http://gamemaker.info/fr/manual).
Titre: Re : Re : GML
Posté par: Chao le 01 Décembre 2011 à 00:54
Citation de: Zora rouge le 01 Décembre 2011 à 00:47
La documentation du logiciel regroupe une très grande partie des fonctions. Elle est aussi disponible ici (http://gamemaker.info/fr/manual).

D'ac, merci beaucoup, c'est assez proche de ce que je recherchais :).
Titre: Re : GML
Posté par: Wouf le 01 Décembre 2011 à 03:06
Ouaip, moi aussi j'ai appris avec la traduction de Philippe Ragni :)
En revanche, comme tu peux le voir, ça date un peu : GM 6.1.

Ca reste une bonne base et pour les nouvelles fonctionnalités, tu peux consulter la doc anglaise.
Toutes les docs approuvées sont listées sur cette page (http://sandbox.yoyogames.com/gamemaker/docs).

Bon apprentissage !

Han, j'ai toujours ma farde de GML :ninja:
Titre: Re : Re : GML
Posté par: Chao le 01 Décembre 2011 à 03:08
Citation de: Wouf le 01 Décembre 2011 à 03:06
Ouaip, moi aussi j'ai appris avec la traduction de Philippe Ragni :)
En revanche, comme tu peux le voir, ça date un peu : GM 6.1.

Ca reste une bonne base et pour les nouvelles fonctionnalités, tu peux consulter la doc anglaise.
Toutes les docs approuvées sont listées sur cette page (http://sandbox.yoyogames.com/gamemaker/docs).

Bon apprentissage !

Han, j'ai toujours ma farde de GML :ninja:


Merci ^^.
Titre: Re : GML
Posté par: Morwenn le 01 Décembre 2011 à 15:31
Oui, mais même si la documentation date, le logiciel en lui-même (éditeur de code, éditeur de sprites...) a beaucoup plus changé que le langage. Il y a eu quelques fonctions de rajoutées depuis, mais c'est tout, rien de bien important^^
Titre: Re : GML
Posté par: Chao le 08 Décembre 2011 à 01:06
Bon, avant tout sachez que je n'ai pas beaucoup d'expérience en programmation, le JavaScript étant le seul langage de programmation que j'utilise régulièrement.
J'ai un projet en tête et je pense régulièrement à comment je vais m'y prendre pour coder différentes parties mais il y a un truc qui me gène énormément.
Note que je n'ai pas encore bidouillé avec GM par manque de temps, j'y viendrais bientot car je suis en période d'examen.
Si j'ai bien compris les variables sont propre à un script, donc leur porté n'est valide que dans le même script où elles sont créées.

Par exemple j'ai un personnage héros qui possède plusieurs scripts visant l'interactivité du héros avec les autres objets. Lorsque la hitbox du héros entre en collision avec celle d'un rubis par exemple j'augmente la variable 'monnaie' en fonction de la valeur désirée, je détruis l'instance du rubis et je fais afficher la nouvelle valeur à l'écran.
Pas de problème jusqu'à maintenant.
Par la suite je veux programmer un marchant, une fois que l'utilisateur appuiera sur la touche action tout en étant dans une zone prédéfinie proche du marchant je veux que le script se lance. M'enfin arrêtons de tourner autour du pots, peut-importe comment je m'y prends, de cette façon je vais devoir aller chercher la valeur de l'argent posséder par le héros et la comparer avec le prix des objets en ventes pour que la vente soit fonctionnel. Or cette variable est propres au script qui gère l'interactivité entre le héros et l'argent et je ne pourrais donc pas alors aller la chercher.

Bien-sur je peux tout simplement tout coder l'interactivité du jeu au grand complet dans un seul script mais bonjours le lag de la mort qui tue.

Y a t-il une façon d'établir des variables globales à tout les scripts ou bien est-ce que ma façon de penser n'est tout simplement pas adapté à la création d'un jeu?
Titre: Re : GML
Posté par: Daru13 le 08 Décembre 2011 à 01:42
Je ne connais pas le GML, mais je viens de jeter un rapide coup d'oeil à la doc, et il est expliqué comment déclarer une variable globale dès le début de la partie sur le GML (pages 130-131 du PDF (http://sandbox.yoyogames.com/downloads/docs/gmaker80.pdf)) :P.
CitationTo create global variables, that are visible to all object instances, precede them with the word global and a dot.

D'autre part, une autre "solution" est proposée juste après (page 132), afin d'affecter une variable à un objet (le concept tant la syntaxe te seront d'ailleurs assez familiers vu que tu fais du Javascript ^^). C'est aussi une bonne solution du coup (meilleure et plus claire que la première à mon avis :p).
CitationThis can be achieved by preceding the variable name with the name of an object and a dot.

Du coup, dans ton exemple, un bon moyen de gérer ce genre de trucs type rubis ou encore vie du héros, serait d'attribuer rapidement quelques variables à ton héros par exemple (du type heros.argent = n;).

En esperant que ça puisse t'aider ^_^.
Titre: Re : GML
Posté par: Morwenn le 08 Décembre 2011 à 15:34
Ce qu'a dit Daru est correct, mais je vais étoffer tout ce qui concerne la portée des variables  :P

Variables globales

Les variables globales dans Game Maker s'écrivent de la manière suivante :

global.ma_variable = 2

Ici, tu pourras accéder à ta variable depuis n'importe où en réécrivant le nom complet, le préfixe global y compris. Il y aussi moyen de déclarer ainsi une variable globale :

globalvar ma_variable = 2

ou

globalvar ma_variable
ma_variable = 2


Ceci dit, avec cette seconde solution, ma_variable ne représentera que la variable globale, et tu ne pourras appeler nulle part des variables locales ma_variable, tandis que c'est possible si tu l'utilises juste avec global.ma_variable qui lui est de loin préférée.

Mais dans ton cas, on doit pouvoir faire sans variable globale.


Variable locale à un objet

Toute variable déclarée dans un objet est locale à cet objet. Tu peux les instancier de deux manières différentes dans le code de l'objet :

ma_variable = 2
ou
local.ma_variable = 2

Si tu veux accéder à la variable locale d'un objet depuis un autre objet, tu as plusieurs solutions. La première consiste à marquer le nom de l'objet suivi d'un point et du nom de la variable :

heros.ma_variable = 2

Ceci dit, si tu as plusieurs objets de type hero, ça va en prendre un de manière arbitraire sans que tu puisses choisir. Tu coup, tu peux aussi utiliser l'opérateur with qui permet de faire exécuter du code dans les objets voulus. Ça donnerait ça :

with (hero)
{
   ma_variable = 2
}


Cependant, cette méthode a elle aussi son défaut : si tu as plusieurs objets de type hero, alors ce morceau de code sera exécuté dans tous les objets de ce type.

Accès par l'id d'un objet

Dans Game Maker, chaque objet a un numéro d'id. Tu peux le récupérer avec la variable id de l'objet en question. Ou alors directement à la création, il est retourné par la fonction instance_create et quelques autres :


id_hero = instance_create(25, 25, hero)

id_hero.ma_variable = 2


Si on connaît l'id d'un objet en brut, ce qui est fort peu probable, on pourra écrire (100015).ma_variable = 2 en estimant que l'id de l'objet est 100015. Mais au pire, oublie ça, c'est dans tous les cas à éviter.

Variables dans les scripts

Pour les scripts extérieurs aux objets, c'est un peu plus subtil : lors d'un appel à un script, il est exécuté dans l'objet qui l'a appelé. Ainsi, toutes les variables locales déclarées sans spécification dans le script sont considérées comme appartenant à l'objet appelant. Ainsi,

a = 3

dans un script créera une variable a dans l'objet appelant et l'initialisera à 3. Ceci dit, si on veut éviter les conflits de noms, on peut faire en sorte que les variables soient locales au script en les précédant par le mot-clef var à l'initialisation :


// Création de variables locales au script
var i, j

i = 2
j = 5
// Les variables sont détruites à la fin du script


Notons que var utilisé dans une boucle quelconque permet une destruction de la variable créée à la fin de la boucle si je ne me trompe pas :)

Identificateurs spéciaux

Chaque objet possède des variables utiles dans certaines circonstances : self, other et all :
Titre: Re : GML
Posté par: Chao le 11 Décembre 2011 à 15:11
Merci beaucoup pour le pavé, c'est exactement ce que j'avais besoin :).
Titre: Re : GML
Posté par: Morwenn le 11 Décembre 2011 à 23:36
À ton service^^

Si tu as d'autres questions, je n'hésiterai pas à y répondre ;)
Titre: Re : GML
Posté par: tommylink le 14 Juillet 2013 à 15:50
Salut, moi j'aurais une petite question: comment faire disparaître une flêche ou un autre projectile après avoir heurter un mur(et donc arrêter son mouvement) mais pas instantanément? Je connais bien la fonction <<alarm>> mais puisqu'elle fonctionne avec le nombre de <<step>> et que mon objet et désormais immobile, il ne disparait d'aucune manière sauf, bien entendu, au contact direct du mur. J'ai essayer plusieurs choses sans succès, impossible de laisser un délais avant la destruction de l'objet.

J'utilise game maker 8.0 lite si ça peut aider. Merci  
Titre: Re : GML
Posté par: Arca le 15 Juillet 2013 à 18:25
Lorsque tu vérifies la collision avec le mur, il faut que tu mettes la vitesse de ton objet à 0, ensuite tu mets l'alarme x (x étant le chiffre que tu veux) à, par exemple, 30 (si ta room tourne à 30fps, alors ça fait une seconde d'attente). Après dans les évènements qui s'activent lors de l'alarme x, tu détruis l'instance avec instance_destroy().

Si tu n'y arrives pas, n'hésites pas à repasser par là. :)
Titre: Re : GML
Posté par: tommylink le 19 Juillet 2013 à 18:13
C'est justement ce que je fais depuis le début mais, comme je l'ai déjà mentionner, je connais bien la fonction <<step>>, mais elle ne fonctionne pas lorsque l'objet est préalablement arrêter. L'essayer serait peut-être le meilleur moyen pour vous de comprendre ce que je dis sans me forcer à répéter ce que j'ai déjà mentionner.  Merci quand même Zora rouge-iArcadia  mais je crois que tu n'as pas compris la problèmatique.
Titre: Re : GML
Posté par: Morwenn le 19 Juillet 2013 à 19:03
J'ai lu son commentaire et approuvé. S'il n'a pas compris la problématique, alors moi non plus et il va falloir trouver un moyen plus clair de l'expliquer (poster le code problématique par exemple). Quitte à répéter ce qu'il a dit, le seul truc à faire, c'est mettre dans l'évènement de collision le code suivant :

alarm[0] = 30 // ou alarm0 = 30


Puis ajouter la ligne suivante dans l'évènement alarm0 :

instance_destroy()


De ce que tu sembles dire, on dirait que tu exécutes instance_destroy() au contact avec le mur. Aussi, de ce que je comprends, tu sembles affirmer que <<step>> ne marche pas si l'objet ne bouge pas, ce qui en soi n'est vrai : <<step>> s'exécute une fois par frame tant que l'objet n'est pas détruit. Vraiment, si cette explication ne te convient, il faudra clarifier la question, sinon je doute que beaucoup comprennent^^"
Titre: Re : GML
Posté par: tommylink le 21 Juillet 2013 à 16:04
Tu as confirmer mon problème en fait. Pour être plus clair, je veux que ma flèche s'arrête au contact du mur et qu'elle disparaisse 1.5 seconde plus tard (45 step). Le problème c'est qu'il est impossible de le faire si l'objet est immobile. J'espère avoir été plus clair.
Titre: Re : GML
Posté par: Morwenn le 21 Juillet 2013 à 18:02
Il n'y a aucune raison pour que ça ne marche pas si l'objet est immobile. Si c'est la cas, c'est que tu as écrit quelque où il ne le fallait pas :P
Titre: Re : GML
Posté par: tommylink le 23 Juillet 2013 à 02:43
C'est impossible puisque j'utilise les actions prédéfinis. Pour la flèche, ça donne:


Collision Event with object Mur_volcan:
set Alarm 11 to 30
start moving in directions 000010000 with speed set to 0


Alarm Event for alarm 11:
destroy the instance

C'est simple mais non fonctionnel, peu importe l'ordre...
Titre: Re : GML
Posté par: vlag67 le 23 Juillet 2013 à 03:16
Je ne sais pas du tout comment fonctionne GM, mais à vue de nez je dirais que ta flèche reste en collision avec le mur, et que donc l'alarme est remise à l'étape 30 toutes les frames.
Titre: Re : GML
Posté par: tommylink le 23 Juillet 2013 à 16:02
Ce n'est pas fou, je vais essayer d'intégrer une variable anti boucle à mon objet.
Titre: Re : GML
Posté par: vlag67 le 23 Juillet 2013 à 16:15
Tu peux te servir de la variable speed ou direction pour faire ça, puisque de toute façon tu les assignes.
Protège juste le contenu de la fonction de collision par une condition type

if speed != 0
(sais pas comment ça se code en GML ;) )
Titre: Re : GML
Posté par: Morwenn le 24 Juillet 2013 à 16:00
Vraiment pas con Vlag, tu as sûrement raison quant au problème. Et puis ça se code à peu près exactement comme tu l'as écrit x)
Titre: Re : GML
Posté par: Arca le 25 Juillet 2013 à 15:46
Ah oui en effet j'avais omis le fait que l'alarme revenait à 30 frames d'attente à cause de la collision en continue. Mais j'aurai sûrement compris si j'avais testé directement sur GM. :ninja:
Titre: Re : GML
Posté par: tommylink le 01 Août 2013 à 16:46
Ça fonctionne, j'ai fais ce code:

Alarm Event for alarm 11:
destroy the instance

Collision Event with object Mur_volcan:
if testfleche is equal to 0
     set variable testfleche to 1
     set Alarm 11 to 15
     start moving in directions 000010000 with speed set to 0

Je ne sais pas trop comment coder la méthode que tu m'as montrée car je veut qu'il se produise la même chose peu importe la direction justement (c'est à dire s'arrêter)... . Merci pour votre aide tout le monde.
Titre: Re : GML
Posté par: Arca le 01 Août 2013 à 17:13
A quoi correspond la variable testfleche ?
Sinon d'après ce que tu nous donnes, tu fais ton jeu en drag'n'drop ? (glisser/déposer)
Titre: Re : GML
Posté par: tommylink le 03 Août 2013 à 05:55
Elle ne correspond à rien, elle est déclarer à 0 lors de sa création et ne fait qu'empêcher l'alarm de s'enclencher en boucle infini.
Mais sinon, je n'ai aucune idée de ce que tu veux dire par drag'n'drop en rapport avec mon code.
Titre: Re : GML
Posté par: Arca le 03 Août 2013 à 08:33
Citation de: tommylink le 03 Août 2013 à 05:55
Mais sinon, je n'ai aucune idée de ce que tu veux dire par drag'n'drop en rapport avec mon code.
Tu utilises les boutons des fonctions prédéfinis dans Game Maker ? (ou icônes)

Sinon quel est le problème ? C'est censé fonctionner peu importe la direction que ta flèche possédait ...
Titre: Re : GML
Posté par: vlag67 le 03 Août 2013 à 14:29
Je crois qu'il veut savoir comment protéger la fonction de collision avec les variables du jeu (en l'occurence speed ici).

Relis mon dernier message, et si j'en crois Morwenn ça doit marcher out of the box ...  ^_^