Voici un exemple de fonction :
on multiplie(a,b) return a*b end multiplie
Les fonctions commencent en effet toutes par on [nom de fonction][(arguments)] et se terminent par end [nom de fonction]. Lingo est un langage très laxiste, on est par exemple autorisé à ne pas mettre les parenthèses après le nom de la fonction (on multiplie a, b).
À noter, les variables sont typées dynamiquement et il n'existe pas de différenciation entre le "=" d'affectation et le "=" de comparaison.
if a=1 then b=2 else if a="une chaîne" then b=3 end if end if
Après des années d'évolution syntaxique, Lingo est devenu un langage "pointé" assez classique, et donc très lisible.
Director est un logiciel dédié à l'interactivité. Par conséquent, Lingo permet l'interception facile d'un grand nombre d'évènements tels que : preparemovie (avant l'affichage), startmovie (au moment de l'affichage), mousedown (clic enfoncé), mouseup (clic relâché), etc. Certains scripts intercepteurs évènements concernent l'ensemble du programme, d'autres peuvent ne s'appliquer qu'à des objets précis, comme les sprites (occurrence d'un objet - par exemple graphique - sur la scène).
on mouseup -- lorsque l'on clique sur l'objet auquel s'applique ce script'' if the mouseh<320 then -- si la position horizontale de la souris est inférieure à 320 puppetsound(1, "bing") -- on déclenche le son nommé "bing" sur la piste 1. end if end
Classes de base
Lingo possède une liste de classe correspondant aux structures de données classiques, avec d'importantes automatisations.
| classe lingo | données correspondantes |
| list | tableau linéaire |
| propList | tableau associatif / struct |
| matrix | tableau à 2 dimensions |
| point | vecteur 2d |
| rect | rectangle 2d |
| vector | vecteur 3d |
| transform | matrice 3d |
Classes de gestion des tableaux
Classe List
La classe list contient un tableau à mémoire dynamique. Ces tableaux sont "one-based", le premier index est égal à 1. Cela permet d'utiliser le zéro comme identifiant nul lorsque l'on référence les indexes.
Y écrire ou y lire le contenu d'une cellule est une opération aussi lourde que la syntaxe pointée (plus lente sur des grosses listes que des petites). Pour optimiser les opérations sur les tableaux il faut utiliser le plus possible l'algèbre des tableaux, qui évite de nombreuses lectures de cellule.
Les listes se créent ainsi :
monTableau = [] ou monTableau = [1,2,"a",0,"b"]
Les tableaux peuvent contenir n'importe quel types de données:
monTableau = [[1,vector(1,2,3)],[model1,image12]]
Quelques méthodes
- list.sort() permet un tri croissant automatique.
- list.add() permet d'insérer des données dans une liste sortie en conservant l'ordre de tri.
- list.append() ajoute un élément à la fin du tableau, casse l'ordre de tri
- list.getOne( valeur ) fait une recherche automatique dans le tableau pour trouver l'index de la valeur
- list.deleteOne( valeur ) rechercher l'index de la valeur puis efface la cellule
- list.deleteAt( index ) efface une valeur à un index précis
- list.addAt( index , value ) insère une valeur à l'index voulu
Algèbre des tableaux
Les tableaux peuvent utiliser tous les types d'opérateurs compatibles avec le contenu des cellules. Cela permet une considérable accélération des boucles de calcul puisque celles-ci sont alors gérées en natif.
Exemples avec les entier et les décimaux:
[1,2,3]+[4,5,6] renvoie [5,7,9]
[1,2,3]-[1,1,1] renvoie [0,1,2]
[1,2,3]*[1,2,3] renvoie [1,4,9]
[1,1] / [2,2.0] renvoie [0,0.5]
[1,1] mod [2,2.0] renvoie [1,1]
[1,2] > [2,1] renvoie false (0)
Pour les exemples avec des tableaux de vecteurs et matrices, voir les classes vector et transform.
Classe propList
Contient un tableau associatif. Les identifiants peuvent être soit:
- des symboles: monTableau = [#age:24, #sexe:"masculin", #taille: 1.80]
- des chaines de caractère (attention, la lecture est très lente): monTableau = ["age":10,"sex":"m"]
L'algèbre est identique à celui des listes linéaires.
Classe matrix
Encode un tableau à deux dimensions. Ajouté à la v11 pour les terrains du moteur physx.
Classes de géométrie 2d
Classe point
Encode un vecteur 2d. Ses coordonnées se nomment "locH" et "locV". Elles peuvent être entières ou décimales.
p = point( a , b )
Les données se lisent par les propriétés locV / locH ou comme un tableau:
p.locH ou p[1] renvoie a
p.locV ou p[2] renvoie b
L'algèbre des vecteurs 2d se comporte exactement comme l'algèbre des tableaux et peut se combiner avec:
point(1,1)+point(2,2) renvoie point(3,3)
[p1,p2]+[p3,p4] renvoie [p1+p3,p3+p4]
Classe rect
Encode un rectangle. Les valeurs peuvent être entières ou décimales.
:r = rect(left, top, right, bottom) :r.left, r.top, r.right, r.bottom ou r[1], r[2], r3], r[4] renvoient ses coordonnées :r.width et r.height renvoient sa largeur et sa hauteur
Quelques méthodes:
r1.intersects(r2) renvoie le rectangle d'intersection entre deux rectangles
point.inside(r1) renvoie true si le point est à l'intérieur du rectangle
map(targetRect, sourceRect, destinationRect) effectue une homotétie du point
map(targetPoint, sourceRect, destinationRect) effectue une homotétie du rectangle
rect1.union(rect2) renvoie le rectangle englobant deux autres rectangles
L'algèbre des rectangles est identique à celui des points 2d.
Classe quad
Encode un quadrilatère. Utile surtout pour les manipulations d'images.
Classes de géométrie 3d
Classe vector
Encode un vecteur 3d. Nombres décimaux uniquement.
v=vector(10,20,30)
Ses coordonnées sont accessibles de deux manières: soit avec les propriétés x, y, z, soit avec l'index de dimension:
v.x ou v[1] renvoie 10
Quelques méthodes:
vector.magnitude renvoie la longueur
vector.normalize() lui attribue une longueur égale à 1 sans changer sa direction
vector1.cross(vector2) renvoie le produit de deux vecteurs
L'algèbre des vecteurs 3d diffère de celle des listes et des vecteurs 2d:
- la division et le modulo ne sont pas permis
- la multiplication renvoie le produit scalaire
vector(1,0,0)*vector(0,1,0) renvoie 0.0
L'algèbre des vecteurs peut se combiner avec celui des tableaux.
[vector(1,0,0),vector(0,1,0)] + [vector(0,1,0),vector(1,0,0)] renvoie [vector(1,1,0),vector(1,1,0)]
[vector(1,0,0),vector(0,1,0)] * [vector(0,1,0),vector(1,0,0)] renvoie [0,0]
Classe transform
Encode une matrice de transformation 3d composée de 16 décimales.
matrice = transform()
Les 3 premiers groupes de 4 nombres encodent les 3 vecteurs du repère. Le dernier groupe encode l'origine. (le 4ème nombre de ces groupes sert aux calculs internes).
Exemple: choisir le vecteur (0,0,1) pour l'axe X:
matrice[1]=1
matrice[2]=0
matrice[3]=0
Quelques méthodes:
matrice.invert() inverse la matrice
matrice.inverse() renvoie l'inverse de la matrice
matrice.rotate() matrice.translate() effectue une transformation absolue
matrice.preRotate() matrice.preTranslate() effectue une transformation relative
matrice1.multiply(matrice2) renvoie la matrice 2 transformée par la matrice 2
matrice1.preMultiply(matrice2) renvoie la matrice 2 transformée par la matrice 1 en relatif
matrice1.interpolate(matrice2,pourcentage) renvoie l'interpolation entre deux transformations
Algèbre des matrices:
matrice1 * matrice2 équivaut à multiply
matrice * vecteur renvoie le vecteur transformé par la matrice
L'algèbre des matrices se combine également avec les tableaux:
[matrice1,matrice2] * [vecteur1,vecteur2] renvoie le tableau des vecteurs transformés
[matrice1,matrice2] * [matrice3,matrice4] renvoie le tableau des matrices transformés