Les variables avec des valeurs de type int ou “integer” contiennent des nombres entiers : 0,1,2,3,4,5…999999 donc des valeurs numériques sans décimales
Ces variables peuvent être combinées entre elle avec les opérateurs mathématiques que l’on connait
opération
symbole dans le code
addition
+
soustraction
–
multiplication
*
division
/
modulo (reste de la division)
%
constA = 4constB = 2varresult = A + BMessageBox.information(result)// affiche 6varresult = A - BMessageBox.information(result)// affiche 2varresult = A * BMessageBox.information(result)// affiche 8varresult = A / BMessageBox.information(result)// affiche 2varresult = A % BMessageBox.information(result)// affiche 0// comme en math on peut également utiliser des parenthèses :varresult = ( A + B ) * BMessageBox.information(result)// affiche 12
💲FLOAT
Les variables avec des valeurs de type float contiennent des nombres décimaux :
1.5 30.459 0.9999 ( on n’utilise pas le symbole “,” mais “.” comme les anglais)
Ces variables peuvent être combinées entre elle avec les mêmes opérateurs mathématiques que les valeurs de type int.
Les Classes sont aux fonctions ce que les objets sont aux variables simples : une classe est un groupement de fonctions appelées “méthodes” et de variables appelées “propriétés”. C’est un mélange entre une fonction ( avec des arguments ) et un objet (fonctionnement en clef valeur accessible par des . )
Lorsque que vous utilisez l’api Harmony vous ne faites qu’utiliser des classes.
Déclarer une classe
Hors des script harmony nous avons droit d’utiliser le mots clef class
classmy_class(){}
mais dans harmony le mots clef class est interdit et nous sommes contraints d’utiliser le mots clef function à la base. Le resultat est le même mais cela peut vraiment prêter à confusion au début.
Avec l’exemple suivant , pouvez vous comprendre à quoi sert une classe ?
functionAnimal(_type,_sound ){this._type= _typethis._sound = _soundthis.make_sound= function(){MessageBox.information(this._sound ) }this.talk= function(){MessageBox.information("Hello ! i'm a "+this._type) }}varmedor = newAnimal("dog","ouaf")medor.talk()// affiche hello ! i'm a dog medor.make_sound()// affiche ouafvarmimi = newAnimal("chat","miaou")mimi .talk()// affiche hello ! i'm a catmimi .make_sound()// affiche miaou
On voit deux nouveaux mots clefs “this” à l’intérieur de la déclaration et “new”
new permet d’instancier une classe. Instancier une classe revient à créer une copie de la classe en suivant son plan et à reset tout ses propriétés.
Une instance est comme objet sauf qu’elle est unique, elle va pouvoir avoir ses propres valeurs de propriétés et évoluer le long du code. C’est typiquement comme cela que l’on code le comportement d’un enemie dans un jeux.
Le concept de fonction viens de la notation mathématique “f(x)” : pour représenter le resultat d’une modification d’une valeur abstraite “x” par une sérié d’opération (mutiliplication , addition ect … ) . Mais on peut aussi penser aux fonctions comme à des “verbes” dans un language. Certain verbes n’ont pas d’objets comme “dormir” et certain supposent un objet comme “manger qq”.
On peut aussi voir les fonction comme des “tuyaux” dans lesquelles passent les valeurs du programme afin d’être transformées. Elles ont comme input les “arguments” et comme output une valeur de retour “return”.
L’utilisation des fonctions n’est pas obligatoires pour qu’un programme fonctionne mais elles améliorent grandement son organisation et sa lisibilité.
Déclaration
La définition d’un verbe dans un dictionnaire est très proche d’un code de déclaration de fonction.
Déclarer une fonction signifie décrire son comportement. C’est son “plan d’action” sous forme de code . Le code contenu entre les balises {} sera exécuté au moment de son “appel”.
functionsayhello() {MessageLog.trace("hello")}
Appel
Pour appeller une fonction et executer son code il suffit d’écrire son nom suivi de parenthèses ()
Les fonctions avec argument ont pour but de “faire quelque chose” avec une variable. Au moment de la déclaration on ne connais pas la valeur de la variable qui va être transmise alors on utilise une abstraction. Quelque chose qui peut varier mais dont le contenu est globalement prévisible comme “aliment” ou “fruit” si on veut parler d’une fonction “manger” par exemple.
Comme dans une définition de dictionnaire où l’on précise qu’un verbe attends une certains catégorie de mots après lui : parler_à(quelqu’un)
Plus simplement : lorsque l’on défini un argument on défini les “input” de la fonction un peu comme les inports d’un groupe dans la nodeview
functionsay(_word) {MessageLog.trace(_word)}say("bonjour")// affiche : // bonjourfunctionmanger(_aliment) {MessageLog.trace(" je mange "+_aliment)}manger("une pomme")// affiche : // je mange une pomme functionstand_up_introduction(_word,_city) {MessageLog.trace("HEY ")MessageLog.trace(_word)MessageLog.trace(_city)MessageLog.trace("!")}stand_up_introduction("bonjour","toulouse")// affiche :// HEY // bonjour// toulouse// !
Fonctions avec valeur de retour
Les fonctions avec valeur de retour vont pouvoir donner une valeur lorsqu’elle sont appelées : Dans cet example la fonction se comporte comme une valeur qu’on transmet à la variable “test”
dans la déclaration on décide de la valeur que transmettra la fonction avec le mots clef “return” . C’est l’output de la fonction. Comme dans un groupe dans la nodeview c’est son port out, à la différence qu’une fonction ne peut avoir qu’un seul output.
On peut biensur “retourner” une variable déclarée dans la fonction
on peut également déclarer et appeler une fonction dans une fonction. Lorsque l’on veut décomposer le code d’une fonction complexe par exemple.
On peut écrire le code ci dessus comme ce ci :
// fonction principalefunctiondire_un_bonjour_en_feu_a(_prenom){// sous fonctionfunctionajouter_flammes(_mots){return"🔥"+_mots+"🔥" }varphrase = " bonjour "+_prenom+" ! "phrase = ajouter_flammes(_phrase)returnphrase}vartest= dire_un_bonjour_en_feu_a("le chat")MessageLog.trace(resultat)// affiche 🔥 bonjour le chat ! 🔥
Le resultat est le meme. En revanche les autres fonctions n’auront plus acccès à “ajouter flammes” car elle est déclaré à l’interieur de “dir_un_bonjour_en_feu_a”
Ce code ne fonctionnera pas :
// fonction principalefunctiondire_un_bonjour_en_feu_a(_prenom){// sous fonctionfunctionajouter_flammes(_mots){return"🔥"+_mots+"🔥" }varphrase = " bonjour "+_prenom+" ! "phrase = ajouter_flammes(_phrase)returnphrase}// fonction principalefunctiondire_un_aurevoir_en_feu_a(_prenom){varphrase = " aurevoir"+_prenom+" ! "// CETTE FONCTION N'EST PAS VISIBLE D'ICI ! phrase = ajouter_flammes(_phrase)returnphrase}vartest= dire_un_aurevoir_en_feu_a("le chat")MessageLog.trace(resultat)// affiche une erreur
Pour que “aurevoir” et “bonjour” fonctionnent il faudra replacer “ajouter_flammes” à l’exterieur
Git est un système de versioning de fichiers crée par Linus Thorvald . C’est un outil indispensable lorsque l’on veut faire du code en production. Il permet de garder une trace de chaque modification du code (commit , ou point de sauvegarde ) ainsi que de pouvoir gérer la collaboration entre plusieurs dev par un système de branches.
Github est un site qui utilise le protocole git et permet de stocker du code dans le cloud.
GithubDesktop est une interface git simplifiée qui permet de synchroniser des fichiers locaux avec le cloud de github.
Un dossier versionné en cloud ( si on utilise github )
Le repos ‘origin’ est le dossier dans le cloud
Créer un repository sur github
Créer un clone du repository en local
Qu’est ce qu’un Commit ?
Une modification reversible + un commentaire
Modifier un fichier du repos local et faire un premier commit
Push : on envoie le commit de notre repos local au repos origin
Pull : télécharger une mise à jour (commit) présente dans l’orgin vers notre répos local
Qu’est ce qu’une Branche ?
Une branche est une version paralelle du repository
Le systeme de branche permet à plusieur dev de travailler en parallel sur le meme repository sans rentrer en conflit. Chacun créer sa branche , produit son code, puis l’envoie à la branche principale (‘master‘) via un “Pull request“
Pratique :
Formateur : Ajouter chaque élève en tant que collaborateur du repos “FormationScripting”
Simplement dit : Une variable est un bout d’espace mémoire dans la RAM avec une adresse.
👉 Si la RAM était un terrain constructible dont la surface correspond à sa mémoire disponible, les variables seraient comme les maisons que l’on construit sur ce terrain. Lorsque l’on déclare une variable on “réserve” une adresse dans la mémoire avec un nom. Ensuite dans le code ce nom fera référence au contenu de la variable : sa valeur. C’est un peu comme si , vous habitiez au “153 rue de paris” et que l’on faisait référence à vous comme “la personne qui au habite au 153 rue de paris“.
Déclarer une variable : pour déclarer une variable en javascript on utilise le mots clé var suivi du nom de la variable, ici my_variable
// on déclare l'adresse my_variable varmy_variable
Pour assigner une valeur à une variable on utilise l’opérateur =
varmy_variable = 10// la valeur de my_variable est égale à 10
Appeler une variable : une foi que la variable est déclarée et qu’une valeur lui a été assignée, il devient possible de l’appeler. Appeler une variable veut dire lire sa valeur. Pour appeler une variable il suffit d’écrire son nom. Par exemple en utilisant la fonction d’affichage d’Harmony on peut afficher le contenu de my_variable qui est égal à 10 plutot que d’afficher directement la valeur 10 :
varmy_variable = 10MessageBox.information(10)MessageBox.information(my_variable )// affiche 10 puis 10
Changer la valeur d’une variable : pour cela il suffit de lui réassigner une nouvelle valeur avec le signe égal
varA = 10A = 15MessageBox.information(A)// affiche 15
On peut egalement à l’aide du signe égal transférer une valeur d’une variable à une autre :
varA = 10varB = AMessageBox.information(A)MessageBox.information(B)// affiche 10 puis 10
Attention à bien respecter l’ordre d’execution !
varA = 10MessageBox.information(B)varB = 20// ce code renvoi une erreur car B est appelé AVANT d'être déclaré !
Les Constantes :
Il existe une deuxième type de variable qu’on nomme constante, qui, comme son nom l’indique ne peut pas changer. Si vous êtes sur qu’une variable va être seulement lue et jamais écrite au cour du code, il est intéressant de la déclarer en type constante car celui ci est plus légers à traiter pour le processeur (la maison prend moins de place..)
Déclarer une constante :
pour déclarer une constante on utilise le mots clé “const”
constvitesse_de_la_lumiere = 299792458// mettres par secondes// si on essaye de changer une constantevitesse_de_la_lumiere = 10// cela renvoie normalement une erreur ...
Les types de Valeurs :
Il existe plusieurs type de valeurs : int , float , string , array , object
Le type va déterminer comment les valeurs interagissent entre elles quand on les manipule avec des opérateurs ( + , – , * , / , % )
L’opérateur + par exemple ne va pas du tout produire la même chose si on l’applique à des int ou à des string (chaînes de charactère)
L’API Harmony est un ensemble de classes mise à disposition par Toonboom pour permettre aux programmeurs d’interagir avec le logiciel. Ces classes sont comme déclarées avant l’exécution de notre scripte et nous pouvons les appeler dans notre code afin d’exécuter leur différentes méthodes.
Chaque classe de l’api est décrite dans la documentation de scripting d’Harmony. On trouve également dans cette documentation quelque examples de code qu’on peut adapter à nos besoins.
à gauche la liste des classes accessibles
à droite la liste des propriétés et méthodes de la classe
Pour appeler une méthode d’une classe écriver le nom de la classe suivi d’un “.” puis du nom de la méthode.
Faites attentions à bien passer en argument à la méthode le type de variable décris dans la documentation : ici “String &node”
varname = node.getName("Top/mynode")
Pour chaque méthode est également renseigné le type retourné (1)
à ne pas confondre avec le type de l’argument (2)
Le code suivant ne fonctionnera pas :
varname = node.getName(["Top/mynode"])
car dans ce cas je passe à la méthode une array et non une string !
VSCode est un logiciel de programmation gratuit et open source relativement accessible pour les débutants. C’est une sorte de navigateur web mais pour les fichiers locaux.
Créer un workspace
Le système de Workspace se comporte comme des onglets prédéfinis dans un navigateur web. On ouvre les dossiers et fichiers qui nous interessent puis on sauvegarde simplement le workspace actuel pour ne pas avoir à tout réouvrir la prochaine foi.
Ajouter un “folder”
Sauvegarder le “Workspace” :
Installation des Raccourcis :
Je préconise d’utiliser les raccourcis Nodepad++
Crt+Shift+X pour ouvrir le gestionnaire d’extensions VSCode
Cherchez “Notepadd++”
Choisissez “Notepad++ keymap” et cliquez sur “installer”
Pour comprendre comment est structurée une scène Harmony il n’y pas de meilleur endroit que le fichier xstage.
Si vous ouvrez un xstage dans un éditeur comme nodepad++ vous verrez qu’il s’agit enfait d’un énorme bloc de texte.
Ce bloc de texte est structuré en balises </> selon un language qu’on appel XML pour eXtensible Markup Language (langage de balisage extensible). Tout ce qui fait la particularité d’une scene, à l’exeption des fichiers vectoriels de dessin, est décrit dans ce xml.
Ce que vous avez sous les yeux est l’arborescence d’un immense objet xml. Le language xml, comme le json, est un language conçu uniquement pour organiser des données.
L’arborescence d’un objet xml est un peu plus complexe que celle d’un objet json car elle est spécialement pensée pour décrire des ensembles et sous ensembles.
Le contenu d’un element xml se situe entre :
ses balises d’ouverture <element>
et de fermeture </element>
<elementA>
<elementB>
</elementB>
</elementA>
Dans cet example on dit que l’elementA est le “parent” de l’elementB. L’élementB est un sous ensemble d’élémentA.
Il exsite des balises qui n’englobent rien comme ici les statistiques <endurance />
Chaque balise possède aussi des “propriétés” (name=”guntar”) qui sont une façon de renseigner des valeurs indépendament de la hiérarchie.
Dans le xml d’un xstage les nodes sont décrit par des balises <module> </module>
en propriété du module nous avons son type,nom et position dans la nodeview :
si vous modifiez ces valeurs et sauvegarder le xml. Votre scène sera modifiée !
En sous élement du module se trouve l’élément <attrs> </attrs>
C’est là que se déroule toute la liste des attributs du node. Ce sont ces données là qui sont affichée lorsque l’on ouvre la fenêtre “node properties” dans Harmony.
C’est aussi ces objets que nous allons modifier lorsque nous utilisons les methodes de la classe node : node.getTextAttr et node.setTextAttr