GML

Démarré par Chao, 30 Novembre 2011 à 21:06

0 Membres et 1 Invité sur ce sujet

GML
30 Novembre 2011 à 21:06 Dernière édition: 01 Décembre 2011 à 00:55 par Chao
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

Le topic peut rester ouvert puisqu'il est possible d'en faire un regroupement de question sur le langage.

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 et son forum. Les membres sont généralement de bon conseil :)

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.
Anciennement iArcadia / Zora Rouge

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

La documentation du logiciel regroupe une très grande partie des fonctions. Elle est aussi disponible ici.
Anciennement iArcadia / Zora Rouge

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.

D'ac, merci beaucoup, c'est assez proche de ce que je recherchais :).

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.

Bon apprentissage !

Han, j'ai toujours ma farde de GML :ninja:
Marre des pavés ? Marchez dans la boue!
ハハ、あなたは私の罠に落ちた!

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.

Bon apprentissage !

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


Merci ^^.

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^^

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?

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) :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 ^_^.

    







08 Décembre 2011 à 15:34 #11 Dernière édition: 08 Décembre 2011 à 15:42 par Morwenn
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 :

  • self permet à un objet de se désigner soi-même. self.ma_variable est équivalent à ma_variable.
  • other n'est utilisable que dans les évènements de collision de l'objet : il désigne l'objet avec lequel l'objet courant vient d'entrer en collision. Vraiment très pratique pour par exemple récupérer la valeur en argent stockée dans un rubis avec other.monnaie ;)
  • all désigne toutes les instances. D'une manière générale, il vaut mieux éviter de l'utiliser...


    Voilà, c'est à peu près tout ce qu'il y a à savoir sur les variables dans Game Maker et la façon dont elles sont appelées. Tu devrais y trouver ton compte.

Merci beaucoup pour le pavé, c'est exactement ce que j'avais besoin :).

À ton service^^

Si tu as d'autres questions, je n'hésiterai pas à y répondre ;)

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  
moi et zelda, on ne forme qu'un.

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à. :)
Anciennement iArcadia / Zora Rouge

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.
moi et zelda, on ne forme qu'un.

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^^"

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.
moi et zelda, on ne forme qu'un.

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

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...
moi et zelda, on ne forme qu'un.

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.

Ce n'est pas fou, je vais essayer d'intégrer une variable anti boucle à mon objet.
moi et zelda, on ne forme qu'un.

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 ;) )

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)

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:
Anciennement iArcadia / Zora Rouge

01 Août 2013 à 16:46 #26 Dernière édition: 01 Août 2013 à 16:49 par tommylink
Ç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.
moi et zelda, on ne forme qu'un.

01 Août 2013 à 17:13 #27 Dernière édition: 03 Août 2013 à 08:29 par Zora rouge-iArcadia
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)
Anciennement iArcadia / Zora Rouge

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.
moi et zelda, on ne forme qu'un.

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 ...
Anciennement iArcadia / Zora Rouge

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 ...  ^_^