Lingo to język skryptowy, który towarzyszy oprogramowaniu Macromedia Director .
Autorem Lingo jest deweloper John Henry Thompson. Żargon został wzbogacony przez wiele firm, które opracowały xtras , w tym intel , ageia, havok ...
Słowo Lingo oznacza w slangu angielskim , w znaczeniu rodzimym , specjalistyczny język należący do określonej grupy (np. Slang typografów).
W przeciwieństwie do najbardziej rozpowszechnionych języków poziomu 4 (podstawowy, javascript ...), skrypt lingo nie odtwarza identycznie koncepcji programowania, ale reorganizuje je na swój własny sposób, aby zapewnić wydajną i prostą aplikację. Aby zaznaczyć to rozróżnienie, używa on innych terminów, na przykład nazwa „tablicy” zmienia się na „listę”, a klasa nazywa się „skryptem nadrzędnym” ...
Lingo używa obecnie składni BASIC .
Lingo pierwotnie miał pełną składnię wywodzącą się z języka HyperTalk używanego w oprogramowaniu autorskim HyperCard rozprowadzanym na MacIntoshes od 1986 roku. Pierwotnie miał być jak najbardziej czytelny dla anglojęzycznych użytkowników.
Oto przykład funkcji:
on multiplie(a, b) return a*b end multiplieWszystkie funkcje zaczynają się od on [nazwa funkcji] [(argumenty)] i kończą końcem [nazwa funkcji] . Lingo to bardzo luźny język, na przykład mamy prawo nie umieszczać nawiasów po nazwie funkcji (mnożymy a, b).
Zwróć uwagę, że zmienne są wpisywane dynamicznie i nie ma rozróżnienia między przypisaniem „=” a porównaniem „=”.
if a=1 then b=2 else if a="une chaîne" then b=3 end if end ifPo latach ewolucji składniowej, Lingo stał się dość klasycznym językiem typu „point-in”, a zatem bardzo czytelnym.
Director to oprogramowanie przeznaczone do interaktywności. Dlatego Lingo umożliwia łatwe przechwytywanie dużej liczby zdarzeń, takich jak: preparemovie (przed wyświetleniem), startmovie (w czasie wyświetlania), mousedown (kliknięcie w dół), mouseup (kliknięcie zwolnione) itp. Niektóre skrypty przechwytujące zdarzenia dotyczą całego programu, inne mogą dotyczyć tylko określonych obiektów, np. Duszków (wystąpienie obiektu - na przykład grafiki - na scenie ).
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 endZmienne liczbowe w żargonie są uproszczone. Zmienne globalne lub obiektowe są deklarowane tylko poza funkcjami. Zmienne lokalne są deklarowane niejawnie.
Typowanie jest niejawne, więc:
Nie ma zmiennych logicznych, lingo używa liczb całkowitych 0 i 1, które jednak ze względu na czytelność mogą być zapisane jako prawda i fałsz.
Łańcuchy można odczytywać jako tablice przy użyciu zmiennej globalnej „the itemDelimiter” i priorytetu ciągów .item lub właściwości .line i .word łańcuchów.
nazwy zmiennych mogą zawierać litery, cyfry lub znak podkreślenia. Nie mogą zaczynać się od liczby.
Możesz tworzyć symbole za pomocą krzyżyka ( # ). Symbol nie jest zmienną, ale nazwą zmiennej lub funkcji.
Na przykład, w myColor = #red , słowo #red nic nie znaczy dla Lingo; z drugiej strony myColor = colors [#rouge] pozwala znaleźć właściwość red obiektu colors, funkcja call (#rouge, obj, arguments…) pozwala na wywołanie metody red obiektu obj.
Lingo ma listę klas odpowiadającą klasycznym strukturom danych, z ważnymi automatyzacjami.
klasa żargonu | odpowiednie dane |
lista | tablica liniowa |
propList | asocjacyjna tablica / struktura |
matryca | 2-wymiarowa tablica |
punkt | 2d wektor |
prost | prostokąt 2d |
wektor | Wektor 3D |
przekształcać | Macierz 3D |
Klasa list zawiera dynamiczną tablicę pamięci. Te tablice są oparte na jedynkach, pierwszy indeks jest równy 1. Dzięki temu zero może być używane jako identyfikator zerowy podczas odwoływania się do indeksów.
Podczas pisania lub czytania zawartości komórki następuje operacja tak ciężka, jak składnia z kropkami (wolniejsza na dużych listach niż na małych). Aby zoptymalizować operacje tablicowe, używaj algebry tablicowej tak często, jak to możliwe, co pozwala uniknąć wielu odczytów komórek.
Listy są tworzone w następujący sposób:
myArray = [] lub myArray = [1,2, "a", 0, "b"]Tablice mogą zawierać dane dowolnego typu:
myArray = [[1, vector (1,2,3)], [model1, image12]] Niektóre metodyTabele mogą używać wszystkich typów operatorów zgodnych z zawartością komórki. Pozwala to na znaczne przyspieszenie pętli obliczeniowych, ponieważ są one następnie zarządzane natywnie.
Przykłady liczb całkowitych i dziesiętnych:
[1,2,3] + [4,5,6] zwraca [5,7,9] [1,2,3] - [1,1,1] zwraca [0,1,2] [1,2,3] * [1,2,3] zwraca [1,4,9] [1,1] / [2,2,0] zwraca [0,0,5] [1,1] mod [2,2.0] zwraca [1,1] [1,2] > [2,1] zwraca fałsz (0)Aby zapoznać się z przykładami tablic wektorów i macierzy, zobacz klasy vector i transform.
PropList, klasaZawiera tablicę asocjacyjną. Identyfikatorami mogą być:
Algebra jest identyczna jak w przypadku list liniowych.
Klasa macierzyKoduje dwuwymiarową tablicę. Dodano do wersji 11 dla silników PhysX.
2d klasy geometrii Klasa punktówZakoduj wektor 2D. Jego współrzędne nazywane są „locH” i „locV”. Mogą być pełne lub dziesiętne.
p = punkt (a, b)Dane są odczytywane przez właściwości locV / locH lub jako tablica:
p.locH lub p [1] zwraca a p.locV lub p [2] zwraca bAlgebra wektorów 2d zachowuje się dokładnie tak, jak algebra tablicowa i można ją łączyć z:
point (1,1) + point (2,2) zwraca point (3,3) [p1, p2] + [p3, p4] zwraca [p1 + p3, p2 + p4] Klasa rektZakoduj prostokąt. Wartości mogą być pełne lub dziesiętne.
: r = rect (left, top, right, bottom): r. lewy, r. górny, r. prawy, r. dolny lub r [1], r [2], r [3], r [4] powrót jego współrzędne : r. szerokość i r. wysokość zwracają szerokość i wysokość
Niektóre metody:
r1.intersects (r2) zwraca prostokąt przecięcia między dwoma prostokątami point.inside (r1) zwraca prawdę, jeśli punkt znajduje się wewnątrz prostokąta map (targetRect, sourceRect, destinationRect) wykonuje punkt homothety map (targetPoint, sourceRect, destinationRect) wykonuje homothety prostokąta rect1.union (rect2) zwraca prostokąt obejmujący dwa inne prostokątyAlgebra prostokątów jest identyczna z algebrą punktów 2d.
Klasa QuadZakoduj czworokąt. Przydatne zwłaszcza do manipulacji obrazami.
Zajęcia z geometrii 3D Klasa wektorowaZakoduj wektor 3d. Tylko liczby dziesiętne.
v = wektor (10,20,30)Dostęp do jego współrzędnych można uzyskać na dwa sposoby: za pomocą właściwości x, y, z lub za pomocą indeksu wymiaru:
vx lub v [1] zwraca 10Niektóre metody:
vector.magnitude zwraca długość vector.normalize () nadaje mu długość równą 1 bez zmiany kierunku vector1.cross (vector2) zwraca iloczyn dwóch wektorówAlgebra wektorów 3D różni się od algebry list i wektorów 2D:
Algebrę wektorów można łączyć z algebrą tablic.
[wektor (1,0,0), wektor (0,1,0)] + [wektor (0,1,0), wektor (1,0,0)] zwraca [wektor (1,1,0), wektor (1,1,0)] [vector (1,0,0), vector (0,1,0)] * [vector (0,1,0), vector (1,0,0)] zwraca [0,0] Przekształć klasęKoduje macierz transformacji 3D składającą się z 16 miejsc po przecinku.
macierz = transformacja ()Pierwsze 3 grupy po 4 liczby kodują 3 wektory układu współrzędnych. Ostatnia grupa koduje pochodzenie. (The 4 p liczbę tych grup jest wykorzystywana do obliczenia wewnętrznych).
Przykład: wybierz wektor (0,0,1) dla osi X:
macierz [1] = 1 macierz [2] = 0 macierz [3] = 0Niektóre metody:
matrix.invert () odwraca macierz matrix.inverse () zwraca odwrotność macierzy matrix.rotate () matrix.translate () wykonuje transformację absolutną matrix.preRotate () matrix.preTranslate () wykonuje względną transformację matrix1.multiply (matrix2) zwraca macierz 2 przekształconą przez macierz 2 matrix1.preMultiply (matrix2) zwraca macierz 2 przekształconą przez macierz 1 na wartość względną matrix1.interpolate (matrix2, percent) zwraca interpolację między dwoma przekształceniamiAlgebra macierzy:
macierz1 * macierz2 jest równoważne mnożeniu wektor macierz * zwraca wektor przekształcony przez macierzAlgebrę macierzy można również łączyć z tablicami:
[macierz1, macierz2] * [wektor1, wektor2] zwraca tablicę transformowanych wektorów [matrix1, matrix2] * [matrix3, matrix4] zwraca tablicę transformowanych macierzyPodklasa „member”, która wyświetla się jako sprite i umożliwia renderowanie sceny 3D za pomocą directx lub opengl
Następuje wzorzec typu „fabrycznego”: wszystkie elementy sceny 3d są tworzone i niszczone przy użyciu metod klasy sceny. Tu jest kilka:
ModelresourceDomyślnie przechowuje bufory wierzchołków („siatki”) i odwołuje się do modułów cieniujących.
Uwaga: jego metody konstrukcji nie są zgodne ze strukturą bufora wierzchołków, każdy trójkąt jest wprowadzany niezależnie. Po wywołaniu metody build () wektory są sortowane według grup przy użyciu tego samego modułu cieniującego, a wynikowe VertexBuffers są dostępne za pośrednictwem modyfikatora #meshDeform modeli korzystających z zasobu.
Klasa modeluOdwołuje się do macierzy, listy modułów cieniujących i zasobu modelu. Automatycznie generuje boundingSphere. Klasa modelu służy do wyświetlania modelu modelResource. Jego modyfikator #meshDeform zapewnia dostęp do VertexBuffer modeluResource.
Klasa PhysxUmożliwia sterowanie sceną 3D za pomocą silnika nvidia physx. Podklasa dodatkowego członka, kontrolowana jak klasyczny skrypt xtra.
Następuje wzór fabryczny, który pozwala na tworzenie różnych obiektów fizycznych: wypukłych, wklęsłych, tkaninowych, postaci itp. Wymaga modyfikatora #meshDeform do odczytywania struktur wielokątnych.
W Lingo istnieją 4 typy skryptów, dwa typu proceduralnego i dwa typu obiektowego:
Używaj tylko zmiennych i funkcji globalnych. Ich użycie musi pozostać ograniczone, ponieważ zmienne globalne zużywają procesor i pamięć RAM: są powielane w interpretatorze javascript.
Skrypty obiektowe są używane tak często, jak to możliwe, skrypty proceduralne tylko wtedy, gdy jest to konieczne.
To są skrypty używane w kodzie proceduralnym.
Te skrypty otrzymują pewne predefiniowane zdarzenia funkcyjne, które odpowiadają otwarciu aplikacji, jej zamknięciu, odświeżeniu obrazu.
Wydarzenia otwarcia i zamknięcia:
Zdarzenia odświeżania obrazu:
Niezależne wydarzenie:
Wydarzenia związane z myszami:
Są to skrypty, które znajdują się bezpośrednio wewnątrz aktora. Ich typ nie jest określony, ale działają jak „scenariusze filmowe”.
Otrzymują mysz i odświeżają zdarzenia, gdy instancja aktora jest widoczna.
Zezwalaj na symulację klas obiektów. Składnia metod pozostaje proceduralna: jako pierwszy argument należy przekazać odwołanie do obiektu „ja”.
klasa natychmiastowa przykład utworzonego skryptu nadrzędnego: -- propriétés property pNombre -- méthodes constructeur et destructeur on new me, n , obj pObject = obj pNombre = n return me end on delete me pObject = void end -- méthodes utilisateur on incremente me pNombre = pNombre +1 endJeśli ten skrypt nazywa się „liczba”, tworzymy go na przykład w ten sposób:
monNouveauNombre = new(script "nombre", 10, obj)i wywołamy jego funkcję „inkrementacji” w ten sposób:
monNouveauNombre.incremente() klasa statycznaSkrypt nadrzędny może służyć jako klasa statyczna.
Dostęp do jego odniesienia uzyskujemy w następujący sposób:
myStaticClass = Script("script_name") dziedzictwoDziedziczenie Lingo nie działa tak jak w klasycznych językach obiektowych, jest oparte na właściwości „przodka” skryptów nadrzędnych, która odpowiada instancji klasy nadrzędnej. Dlatego nie jest to kwestia dziedziczenia, ale przeciążenia.
Director automatycznie wraca do właściwości obiektu przodka z referencji podrzędnej, co umożliwia znalezienie efektu odziedziczonej klasy. Dlatego zwróć uwagę na wartość argumentu „ja”: musi on zawsze odpowiadać instancji ostatniej generacji.
Nie działa to dla wszystkich właściwości i metod rodzimych klas dyrektora (w takim przypadku musisz wskazać przodka).
Przykład symulacji podklasy Listproperty ancestor on new ( me ) -- sous classe de l'objet list ancestor = [1,10,20,30] return me -- attention: on ne renvoie pas "ancestor" mais "me" end obj=new Script( "testClass" ) put obj[ 1 ] -- on retrouve les propriétés de l'ancestorSą to złożone obiekty, których skrypt nie jest bezpośrednio dostępny. Zawierają wiele zdarzeń pozwalających na interakcję z duszkami, myszą, klawiaturą, np. Tworzenie przycisków czy edytorów tekstu.
Skrypty zachowań są często opracowywane do ponownego wykorzystania przez grafików lub integratorów. Po prostu przeciągając i upuszczając te skrypty są dołączane do obiektów w scenie: obraz, sprite, aktor, ramka ... Te skrypty mają predefiniowane funkcje, które pozwalają na ręczne konfigurowanie instancji, a także składników flash .
Lingo jest językiem zastrzeżonym, więc jest tylko jedna implementacja.
Od wersji MX2004 oprogramowanie Director akceptuje użycie dwóch różnych języków: Lingo oraz implementację JavaScript / ECMAScript, który wykonuje dużą część operacji lingo.