Limbajul Game Maker | |
---|---|
Clasa de limba | orientat pe obiecte , orientat pe evenimente , scriptat |
Aparut in | 1999 |
Autor | Marcus Overmars |
Dezvoltator | Overmars, Markus Hendrik |
Extensie de fișier | .gml , .gmk , .gm6 , .gmd , .gm8 , .gm81 |
A fost influențat | C++ |
Site-ul web | yoyogames.com |
OS | Microsoft Windows |
Game Maker Language (GML) este un limbaj de programare interpretat conceput pentru a fi utilizat împreună cu un program de dezvoltare a jocurilor pe calculator numit Game Maker . Suportul de limbă a fost introdus inițial în Game Maker de Mark Overmars pentru a completa sistemul de evenimente cu butoane, totuși mai târziu toate evenimentele butoane au fost incluse în GML, permițând programatorului să evite utilizarea funcțiilor butoanelor. GML este foarte strâns legat de mediul Game Maker. Game Maker este conceput pentru a elimina nevoia de programare manuală a lucrurilor precum managementul evenimentelor, proiectarea nivelurilor și configurarea obiectelor. Există o concepție greșită că GML acceptă inserarea fragmentelor de cod în alte limbi, cum ar fi Pascal , Assembler sau C++ . Concepția greșită a apărut din cauza similitudinii parțiale a sintaxei GML cu Pascal și C++. (De exemplu, operatorul „&&” poate fi înlocuit cu „și”).
În Game Maker, o colecție de evenimente butoane formează o bibliotecă. În interfața programului, bibliotecile sunt afișate ca marcaje care conțin diferite pictograme de evenimente. Fiecare astfel de eveniment este un script GML sau o funcție pe care utilizatorul o poate folosi în joc. Game Maker vine cu mai multe biblioteci standard care conțin principalele evenimente utilizate în majoritatea jocurilor. De asemenea, este posibil să vă creați propriile biblioteci utilizând Library Maker . GMS2 are un mecanism încorporat pentru conversia acțiunilor butoanelor în cod GML și viceversa, care permite începătorilor să treacă rapid la GML și îmbunătățește înțelegerea modului în care funcționează acțiunile standard.
GML este structural similar cu un limbaj, cu blocuri de cod, apeluri de funcții, atribuiri de variabile, sintaxa operatorului și așa mai departe. GML face distincție între declarații și expresii. De exemplu,
g < 1;nu este o declarație validă și va provoca o eroare. De asemenea, atribuirea variabilelor este întotdeauna un operator și, prin urmare, nu poate fi folosită în expresii. De exemplu, următoarea linie va genera întotdeauna o eroare, deoarece ar evalua expresia imbricată la adevărat sau fals și apoi ar compara rezultatul boolean cu șirul „Da” (comparație incorectă):
if ((răspuns = get_string("Da sau Nu?", "")) == "Da")Merită să ne amintim că semnul egal „=" este un operator de atribuire și un operator de comparare boolean în expresii, în timp ce în C++, un semn dublu „==" este scris în expresii. Cu toate acestea, semnul dublu egal „==" va fi interpretat corect atunci când este utilizat în expresii. Utilizarea unui astfel de caracter ca operator de atribuire va cauza o eroare de rulare. GML acceptă, de asemenea, operatori de increment :
g++; // sunt acceptate atât notația postfix, cât și prefixși
g += 1;la fel ca
g = g + 1;Există și operatori: -=, *=, /=, |=, &= și ^=. Începând cu GMS2, a fost introdus suportul pentru operatorul ternar ?: . Operatorii din GML pot fi separați prin punct și virgulă, dar acest lucru nu este necesar (deși poate duce la o eroare în unele cazuri specifice).
Game Maker conține o bibliotecă extinsă de funcții încorporate pentru a oferi funcționalități de bază. Programatorul își poate crea propriile scripturi care sunt apelate exact în același mod ca și funcțiile. Funcțiile de desen din Game Maker folosesc API -ul Direct3D . Dacă este necesar, Game Maker vă permite și să apelați codul nativ al platformei prin extensii (DLL pe Windows, Java pe Android, JS pe HTML5 etc.).
De obicei, GML nu trebuie să predeclare o variabilă, așa cum fac unele alte limbi. O variabilă este creată automat, imediat după atribuirea unei valori:
foo="bar";Game Maker are multe variabile și constante încorporate . Fiecare instanță de obiect conține multe variabile locale, cum ar fi „x” și „y”. Există, de asemenea, câteva variabile globale încorporate, cum ar fi „scor”. Aceste variabile există independent de instanțele obiectului. Aceste variabile nu conțin prefixul „ global .”, spre deosebire de variabilele globale specificate de programator. Sunt acceptate și matricele unidimensionale și bidimensionale .
GML are funcții pentru crearea și editarea a șase tipuri de structuri de date : stivă , coadă , listă , hartă (matrice asociativă), coadă de prioritate și grilă. Grila, lista și harta pot fi accesate și prin accesorii care oferă o sintaxă asemănătoare matricei:
var valoare = listă[| 0]; // în loc de ds_list_find_value(listă, 0) Hartă[? "name"] = "Nume de utilizator"; // în loc de ds_map_add(hartă, „nume”, „Nume utilizator”) var valoare = hartă[? "Nume"]; // în loc de ds_map_find_value(hartă, „nume”);GML acceptă următoarele tipuri de date:
În timp ce GML poate fi gândit ca un limbaj orientat pe obiecte , natura obiectelor și a instanțelor obiectelor din Game Maker creează unele diferențe importante în modul în care sunt delimitate variabilele. Există două tipuri de localitate: localitatea într-un obiect și localitatea într-un script (sau altă bucată de cod conținută într-un container separat). Faptul că o variabilă este locală unei instanțe a unui obiect înseamnă că variabila este legată de o anumită instanță a obiectului și poate fi utilizată numai din afara acelei instanțe cu prefixul care definește acea instanță; faptul că o variabilă este locală unui script înseamnă că variabila poate fi folosită numai în acel script (și este distrusă când scriptul se termină). De acum înainte, termenul „local” va însemna localitate într-un obiect. În mod implicit, o variabilă este locală pentru obiect, dar nu locală pentru scriptul în care este utilizată. Pentru a face o variabilă disponibilă pentru toate instanțele de obiect, aceasta poate fi definită prin spațiul de nume global :
global .foo = „bar”;De asemenea, este posibil să declarați variabile globale folosind cuvântul cheie globalvar :
globalvar foo, bar;Dar această metodă ar trebui evitată, deoarece poate duce cu ușurință la erori greu de detectat din cauza intersecției domeniilor variabile (același lucru este recomandat de dezvoltatorii GMS înșiși; în plus, este posibil ca în viitor acest cuvânt cheie să fie eliminat complet din limbă - în momentul de față este lăsat numai din motive de compatibilitate inversă). Pentru a face o variabilă locală unui script, aceasta trebuie definită astfel:
var foo, bar;Sfera de aplicare a unei variabile locale este scriptul în care este declarată. Acest lucru implică faptul că va fi în continuare disponibil pe o comutare de context (folosind cu ). De exemplu:
var foo = „bar”; cu altii { arata_mesajul(foo); // variabila foo este disponibilă }Variabilele locale ale unui obiect pot fi accesate utilizând identificatorul de instanță al obiectului ca prefix
instanță.varnamecu toate acestea, nu este posibil să obțineți variabilele locale ale unui script de la altul în acest fel decât dacă sunt transmise ca parametri de funcție. Spațiul de nume curent al unui obiect poate fi schimbat cu construcția „ cu „. De exemplu, următorul script, dacă este plasat într- un eveniment de coliziune , va distruge cealaltă instanță a obiectului implicat în acel eveniment (rețineți că în evenimentul de coliziune, Game Maker setează automat variabila other la a doua instanță a obiectului care a fost s-a ciocnit):
cu altii { instance_destroy(); }GML alocă automat memorie pentru variabile din mers și folosește tipuri dinamice , astfel încât este posibilă și atribuirea de valori de diferite tipuri variabilelor. De exemplu, puteți crea mai întâi o variabilă întreagă și apoi o puteți schimba într-un șir:
intNumber = 1; intNumber = "Această variabilă conține acum un șir";Nu există o funcționalitate specială în GML care să vă permită să eliberați memoria ocupată de o variabilă, totuși, dacă este necesar, puteți aloca o nouă valoare mai mică variabilei. De exemplu, dacă aveți o variabilă care stochează text mare, setarea variabilei la un șir gol poate elibera memorie. Același lucru este valabil și pentru matrice:
date = [1, 2, 3, 4, 5]; // a creat o matrice (această sintaxă pentru crearea matricelor este disponibilă începând cu GMS2) date = 0; // am distrus matricea (acum este doar o variabilă)Când un obiect este distrus, toate variabilele locale ale acestuia sunt, de asemenea, distruse și orice variabilă globală există independent de ele. Prin urmare, ar trebui să se acorde preferință variabilelor locale, iar variabilele globale ar trebui folosite numai dacă este cu adevărat necesar. Pentru a stoca cantități mari de informații mai eficient, Game Maker acceptă mai multe structuri de date, cum ar fi stiva, coadă, listă, hartă, coadă de prioritate și grilă. Aceste structuri sunt create, modificate și distruse prin funcții încorporate. Există, de asemenea, funcții în aproape toate structurile pentru sortarea datelor din ele. În unele cazuri, va fi mai convenabil și mai eficient să folosiți buffer-uri care vă permit să stocați date arbitrare și sunt, de fapt, doar bucăți de memorie alocate.
Obiecte și resurseLucrarea Game Maker cu resurse se bazează pe identificatori unici care sunt utilizați pentru a identifica o anumită resursă sau o instanță de obiect. Acești identificatori pot fi utilizați de scripturi sau funcții pentru a indica resursa necesară. Deoarece crearea resurselor direct în Game Maker necesită un nume, acest nume servește ca o constantă care conține identificatorul resursei. ID-ul unei anumite instanțe este stocat în variabila locală „ id ”. Când se creează resurse în mod dinamic, se returnează întotdeauna identificatorul resursei create, care poate fi folosit ulterior.
Iată un exemplu de script simplu care imprimă legendarul „ Bună ziua, lume!” »:
show_message("Bună lume!");Un alt exemplu care afișează același text, dar în fereastra programului. Rețineți că, în mod implicit, Game Maker redesenează continuu fereastra, așa că, în cazul normal, acest cod ar trebui să fie plasat în evenimentul de extragere.
draw_text(10, 10, „Bună, lume!”);Iată un fragment de cod din jocul GML:
// acesta este un comentariu /* Așa sunt scrise comentariile în C++. */ /* definirea variabilelor temporare. Aceste variabile vor fi șterse după sfârșitul scriptului. Rețineți că variabilele nu necesită nicio definiție de tip! */ var xx , yy , nn ; // Condiție. Poate fi scurtat la „dacă (can_shoot)”. if ( can_shoot = true ) // "=" și "==" pot fi utilizate { // Începutul blocului de cod. De asemenea, puteți scrie „începe” ca în Pascal. /* Setați variabila la false. Același lucru poate fi scris astfel: "can_shoot = 0;" Deoarece Game Maker nu face distincție între valorile booleene și întregi. */ can_shoot = fals ; /* Aici setăm un cronometru zero pentru cinci pași. Variabila temporizatorului va coborî la 0, iar când va ajunge la ea, va fi apelat evenimentul Zero Counter. */ alarma [ 0 ] = 5 ; /* Aici variabila locală xx este definită ca un număr întreg, ȘI funcția lengthdir_x este folosită. */ xx = x + lengthdir_x ( 14 , directie ); yy = y + lengthdir_y ( 14 , directie ); //Această funcție creează o instanță a lui obj_bullet și returnează ID-ul noului obiect. nn = instance_create ( xx , yy , obj_bullet ); /* Instrucțiunea with vă permite să accesați direct variabilele obiect */ cu ( nn ) { viteza = obj_tank . viteza + 3 ; direction = obj_tank . direcție ; } }Stilurile de cod pot fi amestecate. De exemplu, exemplul anterior ar putea fi scris astfel:
var xx , yy , nn ; dacă can_shoot = true , atunci începe can_shoot := alarmă falsă [ 0 ] := 5 xx := x + lengthdir_x ( 14 , direcție ) yy := y + lengthdir_y ( 14 , direcție ) nn := instance_create ( xx , yy , obj_bullet ) cu nn start speed := obj_tank . viteza + 3 directie := obj_tank . sfârșitul direcției _Iată un exemplu de control normal de la tastatură. Funcția motion_set are doi parametri: direcția (în grade) și viteza (pixeli pe pas). Apelarea acestei funcții va schimba viteza și direcția variabilelor locale încorporate pe care Game Maker le folosește pentru a muta obiecte (obiectele pot fi, de asemenea, mutate direct folosind variabilele locale x și y):
if ( keyboard_check ( vk_left )) motion_set ( 180 , 4 ); if ( keyboard_check ( vk_up )) motion_set ( 90 , 4 ); if ( keyboard_check ( vk_right )) motion_set ( 0 , 4 ); if ( keyboard_check ( vk_down )) motion_set ( 270 , 4 ); if ( keyboard_check ( vk_nokey )) motion_set ( 0 , 0 );Și iată un exemplu de script mai complex pentru un joc de platformă. Folosind-o, jucătorul poate merge pe o suprafață convexă:
daca ! loc_liber ( x -4 , y ) { dacă loc_liber ( x -4 , y -4 ) { x -= 4 y- = 4 } else if place_free ( x -3 , y -5 ) { x -= 3 y -= 5 } else if place_free ( x -2 , y -6 ) { x -= 2 y- = 6 } } altfel x -= 4