Stăpânirea sistemului GameMaker Studio Particle System

În acest articol, vom începe cu elementele de bază ale sistemului de particule GameMaker Studio și se vor termina cu tehnici avansate și implementări. Gândiți-vă la acest lucru ca la un curs de accident pentru a vă familiariza și confortabil cu una dintre cele mai puternice caracteristici ale GameMaker Studio încorporate. Fișierul de proiect demo și descărcabil vă va permite să urmați împreună cu articolul pentru a vedea exact ce este sistemul de particule.

Prezentare generală a sistemului de particule

Sistemul de particule GameMaker Studio este o modalitate ieftină și ușoară de a crea efecte strălucitoare pentru proiectul dvs. de joc. Printr-o combinație de particule și emițători, puteți crea rapid explozii impresionante, fum, sânge, șrapnel și nenumărate alte efecte. Efecte similare pot fi obținute prin utilizarea obiectelor individuale, însă costul de calcul al sistemului efectelor de particule încorporate este mult mai ieftin.

Pentru a utiliza sistemul de particule în proiectul dvs., va trebui să înțelegeți GML (GameMaker Language), dar odată ce vă familiarizați cu sistemul de particule, este pur și simplu o chestiune de umplere a probelor și experimentare.

Consultați demo-ul de mai jos pentru a vedea ce putem realiza:

Sistemul de bază pentru particule

Sistemele de particule din GameMaker Studio constau din trei părți: sistemul în sine, particula și emițătorul. Puteți crea mai multe sisteme și fiecare sistem poate conține mai multe particule și emițători. Gândiți-vă la sistem ca la un container, cu particulele și emițătoarele definite în interiorul acestuia.

Implementarea unui efect de particule în GameMaker Studio este un proces în patru etape. 

  1. În primul rând, trebuie să definiți sistemul de particule în sine. 
  2. Apoi, definiți particulele reale care vor fi utilizate în acest sistem. 
  3. Apoi, trebuie să definiți emițătorul care va crea particulele dvs. definite. 
  4. În cele din urmă, trebuie să determinați când și unde va apărea emitentul de particule în joc.

Pentru a vă învăța elementele de bază ale sistemului de particule GameMaker Studio, vom începe prin crearea acestui efect simplu de particule verzi.

Crearea sistemului de particule

Crearea sistemului de particule este la fel de simplă ca și definirea unei variabile. Creăm un obiect numit obj_first_particle și plasați următorul cod în evenimentul Creare obiect:

FirstParticleSystem = part_system_create ();

Sistemul de particule va adopta valoarea de adâncime a obiectului în care este definit sistemul, dar puteți seta adâncimea separat cu GML:

part_system_depth (FirstParticleSystem, 0);

Amintiți-vă că obiectele și sistemele de particule cu o valoare de profunzime mare sunt atrase mai întâi pe ecran. Cu o adâncime de 0, sistemul nostru de particule verzi va apărea deasupra obiectelor cu o adâncime mai mare decât 0, și va apărea sub obiecte cu o adâncime mai mică decât 0.

Sistemele de particule sunt desenate pe ecran cu o poziție de bază față de (0,0). Dacă dintr-un motiv oarecare doriți să creați o compensare pentru toate pozițiile viitoare ale acestui sistem de particule, puteți utiliza următorul cod pentru a crea o nouă poziție de bază (unde ind este sistemul de particule):

componentă_sisteme_partidă (ind, x, y);

Cu o nouă poziție de bază setată la (10,10), o particula creata la (25,25) în schimb, va fi atras (35,35). Schimbarea poziției de bază a unui sistem de particule este rareori necesară, dar poate fi utilă în proiectul dvs. specific.

Crearea tipului de particule

Acum că sistemul a fost configurat, este timpul să se definească particula reală pe care emițătorul o va crea. Particulele pot conține un număr mare de parametri care dictează modul în care particula va arăta și se va comporta. Primul pas este să creezi o variabilă pentru particulă și facem asta în Crea eveniment al obj_first_particle obiect:

first_particle = part_type_create ();

Apoi, începem să definim parametrii individuali ai particulei. Deoarece nu planificăm să modificăm această particulă în timpul execuției, putem plasa toate din acest cod în Crea eveniment al obj_first_particle obiect.

part_type_shape determină forma de bază a particulei. Există 14 forme de particule implicite disponibile în GameMaker Studio, și vă puteți defini și propriile forme. Vom acoperi acest lucru în secțiunea avansată de mai jos, dar pentru moment să începem doar cu un pătrat de bază.

part_type_shape (first_particle, pt_shape_square);

Pentru o listă completă a formelor implicite disponibile, verificați documentația oficială a GameMaker.

Cu part_type_scale, putem seta valorile scalei X și Y ale formei particulelor. Deoarece dorim o formă pătrată perfectă, vom folosi următorul cod:

part_type_scale (first_particle, 1,1);

part_type_size ne permite să modificăm dimensiunea particulei la creație și la fel ca în timp. Formatul pentru acest cod este part_type_size (ind, size_min, size_max, size_incr, size_wiggle)

  • ind este variabila de particule. 
  • size_min și size_max determină intervalul dimensiunii particulelor atunci când este creat pentru prima dată. Dacă doriți o dimensiune uniformă, introduceți pur și simplu aceeași valoare pentru min și max. 
  • size_incr este o valoare care permite particulei să crească sau să se micșoreze în timp. Această valoare determină viteza de creștere, deci dacă nu doriți ca sprite dvs. să schimbe dimensiunea, puteți utiliza o valoare de 0
  • size_wiggle este ceva mai complicat, așa că vom acoperi acest lucru în secțiunea de tehnici avansate de mai jos.

Iată codul de dimensiune a particulelor utilizat în efectul nostru de particule verzi:

part_type_size (first_particle, 0.10,0.15, - 001,0.);

Particula va fi creată cu o mărime undeva între 0.10 și 0,15 pentru a crea varietate, și sprite se va micșora încet la o viteză de -0,001. Această valoare a vitezei depinde foarte mult de viteza camerei dvs., astfel încât probabil va trebui să experimentați valori pentru a obține rezultatele dorite. Nu vom folosi vrăjitoare de dimensiuni, așa că setăm valoarea la 0.

Particulele din GameMaker Studio pot schimba culorile de-a lungul timpului. Acest lucru este realizat cu part_type_color2 și part_type_color3. Dacă nu doriți ca sprite dvs. să schimbe culorile, atunci puteți folosi doar part_type_color1. Pentru efectul nostru de particule verzi, dorim ca acesta să pornească cu o culoare galben / verde stralucitor și apoi să se transforme într-o culoare verde solidă, așa că folosim part_type_color2:

part_type_color2 (first_particle, 8454143,65280);

Cele două culori pe care le-am selectat sunt valori numerice specifice pe care le folosesc în mod regulat, dar dacă doriți să utilizați valori hexagonale mai tradiționale, puteți utiliza formatul $ RRGGBB.

Particulele pot deveni, de asemenea, mai mult sau mai puțin transparente în timp cu part_type_alpha2 și part_type_alpha3. Dacă doriți o valoare alfa consistentă, utilizați part_type_alpha1. Pentru efectul nostru de particule verzi, dorim ca particula să pornească complet opacă și să se estompeze cu 25% pe măsură ce rămâne pe ecran, deci avem nevoie de două valori alfa:

part_type_alpha2 (first_particle, 1,0.75);

În GameMaker, alfa este o valoare de la 0 la 1. Un obiect complet invizibil va avea o valoare alfa de 0, în timp ce un obiect complet opac va avea o valoare alfa de 1.

Viteza particulelor este determinată la fel ca dimensiunea particulelor. Particulele sunt create într-un interval de valori de viteză și această valoare poate crește sau scădea. Formatul pentru acest cod este part_type_speed (ind, speed_min, speed_max, speed_incr, speed_wiggle), Unde ind este variabila de particule, speed_min și speed_max este intervalul de viteză, speed_incr este viteza la care se modifică viteza particulelor și speed_wiggle este un parametru pe care îl vom acoperi mai târziu. 

Codul de viteză pentru particulele noastre verzi este:

part_type_speed (first_particle, 0.1,0.5,0,0);

Particulele noastre vor începe să se deplaseze cu o valoare de viteză undeva între 0.1 și 0.5. Această viteză va rămâne constantă, deci vom folosi o valoare de 0, și din nou nu vom implementa viteza de zgomot, deci folosim o valoare de 0.

În timp ce parametrul de viteză al particulelor determină cât de repede se mișcă, parametrul de direcție determină unde se mișcă. Codul de direcție este în formatul următor: part_type_direction (ind, dir_min, dir_max, dir_incr, dir_wiggle) și din nou setăm variabila, intervalul de pornire, o valoare incrementală și o valoare de frecare. Pentru efectul de particule verzi, vrem ca particulele noastre să pornească în orice direcție și dorim ca direcția să rămână constantă:

part_type_direction (first_particle, 0,359,0,0);

Intervalul de la 0 la 359 asigură că particula are șansa de a se deplasa în orice direcție (un unghi între 0 și 359 de grade). Dacă vroiai o particulă să se deplaseze în sus și numai up, atunci ați folosi un interval de 90 până la 90).

Gravitatea efectului nostru de particule este ceea ce îl face cel mai interesant. În timp ce parametrii de viteză și direcție sunt setați pentru a crea o particulă care pornește de la o mișcare într-o direcție la o viteză constantă, parametrul de gravitate introduce și modifică particulele în timp. Cu un format de part_type_gravity (ind, grav_amount, grav_direction), parametrul de gravitate este foarte simplu:

part_type_gravity (first_particle, 0.02,90);

Aplicând o ușoară tragere gravitațională de 0,02 într-o direcție ascendentă (90 de grade), putem crea o particulă care pare să plutească. Combinată cu dimensiunea și parametrii alfa, particula se micșorează și devine mai transparentă în timp, însoțită de ascensorul gravitațional.

Orientarea formei particulelor este, de asemenea, importantă pentru apariția efectului, așa că folosim part_type_orientation (ind, ang_min, ang_max, ang_incr, ang_wiggle, ang_relative) pentru a roti pătratul în timp. 

  • ind este variabila de particule. 
  • ang_min și ang_max determină valoarea de pornire a valorii de rotație a formei.
  • ang_incr este folosit pentru a crește sau descrește orientarea formei în timp.
  • ang_relative este o valoare booleană pentru a determina dacă orientarea trebuie stabilită în raport cu mișcarea particulei (adevărată) sau nu (false). 

Vrem ca particulele noastre verzi să se rotească ușor spre stânga, așa că folosim următorul cod:

part_type_orientation (first_particle, 0,359,10,0, true);

Unul dintre cei mai importanți parametri ai unei particule este durata de viata valoare. Această valoare determină timpul minim și maxim pe care o particulă va fi desenată pe ecran. Cu două valori minime și maxime identice, toate particulele de acest tip vor exista pentru aceeași perioadă de timp. Vrem ca particulele noastre verzi să aibă varietate, deci vom folosi un interval de 100 până la 150 pentru valoarea de viață:

part_type_life (first_particle, 100150);

Parametrul final pentru particule este un boolean simplu pentru a determina dacă particulele ar trebui să se amestece împreună cu un efect de amestec aditiv:

part_type_blend (first_particle, true);

Crearea emițătorului de particule

Primul pas în definirea unui emițător este crearea unei variabile. Definim acest emițător în evenimentul Creați din obj_first_particle obiect.

first_emitter = part_emitter_create (FirstParticleSystem);

Apoi, definim regiunea emițătorului cu part_emitter_region (ps, ind, xmin, xmax, ymin, ymax, forma, distribuție).

  • ps este sistemul de particule de care aparține emițătorul și ind este variabila emițătorului.
  • Valorile x și y min și max determină dimensiunea regiunii emițătorului. 
  • formă determină forma regiunii emițătorului (ps_shape_rectangle, ps_shape_ellipse, ps_shape_diamond, ps_shap_line). 
  • distribuire este o curbă de distribuție (ps_dist_linear, ps_distr_gaussian, ps_distr_invgaussian).

Vom acoperi parametrii de formă și distribuție în detaliu în secțiunea tehnici avansate. Pentru moment, vom folosi forma elipsei implicite și valorile de distribuție Gaussian:

part_emitter_region (FirstParticleSystem, first_emitter, x-20, x + 20, y-20, y 20, ps_shape_ellipse, ps_distr_gaussian);

Acest cod creează o regiune a emițătorului eliptic care are o înălțime de 40 de pixeli și o lățime de 40 de pixeli și se centrează pe valorile x și y ale obj_first_particle obiect. Particulele create de emițător vor apărea în această regiune definită.

Activarea emițătorului de particule

Următorul pas este să determinați unul dintre cele două tipuri de emițători: Burst sau Stream. Un emițător de erupție creează o cantitate specificată dintr-o anumită particulă ori de câte ori este declanșată. Un emițător de flux creează o cantitate specificată dintr-o anumită particulă o dată la fiecare pas. 

Vom arunca o privire asupra emițătoarelor cu mai multe versiuni Burst în secțiunea tehnicilor avansate, deci pentru moment să folosim doar emițătorul de flux:

part_emitter_stream (FirstParticleSystem, first_emitter, first_particle, 1);

Am plasat acest cod în Crea eveniment al obj_first_particle obiect, rezultând emitentul creând o particulă la fiecare pas imediat ce obiectul este creat. Cu o viteză a camerei de 30, emițătorul nostru va crea 30 de particule pe secundă; pentru a crea 60 particule pe secundă, ați folosi pur și simplu o valoare de 2 in loc de 1.

Și cu asta, efectul nostru simplu de particule verzi este complet! Utilitatea acestui efect este limitată, dar este important să începeți puțin înainte de scufundări în aspectele mai complicate ale sistemului de particule GameMaker Studio. Odată ce înțelegeți elementele de bază ale sistemului de particule, puteți începe să implementați sisteme de particule mai avansate.

Tehnici avansate ale sistemului de particule

Wiggle pentru particule

Wiggle este un parametru simplu, dar puternic, care poate schimba drastic aspectul particulelor. Parametrul wiggle determină oscilarea particulei între valorile min și max pentru durata de viață a particulei. Valoarea poate fi între 0 și 20 și determină viteza de mișcare. 

Exemplul "Fire Bubble" din demonstrația încorporată folosește o valoare de 0,40 în part_type_size parametru:

part_type_size (fire_bubble_part, 0.25,0.75, -0.01,0.40);

Emisoare de erupție și obiecte în mișcare

Una dintre cele mai comune implementări ale sistemelor de particule implică particule care emană din spatele unui obiect în mișcare, cum ar fi un traseu de fum pe o rachetă. Realizarea acestui efect în GameMaker Studio necesită plasarea unui emițător de erupție într-un obiect al unui obiect Etapa eveniment.

Exemplul inclus utilizează același sistem de particule verzi ca înainte, dar cu un emițător ușor modificat. În loc să declanșezi un emițător de flux în obiect Crea eveniment, un emițător de erupție este plasat în obiect Etapa eveniment. Poziția curentă a cursorului mouse-ului este verificată față de poziția anterioară a cursorului și dacă există o schimbare în poziția cursorului, emițătorul Burst este declanșat pentru a elibera cinci particule:

x = mouse_x; y = mouse_y; part_emitter_region (MouseParticle, green_mouse_emitter, x, x, y, y, 0,0); dacă x! = old_x || old_y! = y part_emitter_burst (MouseParticle, green_mouse_emitter, green_mouse_particle, 5);  old_x = x; old_y = y;

Formele regiunii emițătorului

Folosind diferitele forme de emițător și curbele de distribuție, puteți crea efecte extrem de diferite. Distribuția curbei liniare combinată cu un emițător de particule în formă de linie poate crea un efect de ploaie convingător.

part_emitter_region (RainParticle, rain_emitter, -100, lățimea camerei, y, y, ps_shape_line, ps_distr_linear);

Forma emițătorului este definită de o linie care începe cu 100 de pixeli la stânga originii camerei și este extinsă la lățimea camerei. O curbă de distribuție liniară este utilizată pentru a distribui particulele de ploaie uniform în regiunea emițătorului. De asemenea, este util să folosiți part_system_update pentru a avansa particula de ploaie mai multe etape în Crea eveniment. Acest cod dă impresia că ploaia a căzut înainte să încărcați camera, chiar dacă sistemul de particule nu exista încă în memorie.

repetați (room_speed * 3) part_system_update (RainParticle); 

Efectele pașilor și moarte ale sistemului de particule

Particulele individuale dintr-un sistem pot, de asemenea, să dezvolte și alte particule Etapa și Moarte evenimente. Exemplul arată o particulă de scânteie purpurie, care generează particule mai mici de praf în timp ce se deplasează spre dreapta și produce o particulă de fum la sfârșitul duratei sale de viață:

part_type_step (spark_particle, 1, dust_particle); part_type_death (spark_particle, 5, smoke_particle);

Particlele personalizate

Prin utilizarea part_type_sprite (ind, sprite, animat, intindere, aleatoare), puteți folosi sprite personalizate în locul tipurilor de particule ale GameMaker încorporate. 

  • ind este variabila de particule.
  • spiriduș este variabila sprite care trebuie utilizată.
  • anima este un boolean pentru a determina dacă sub-imaginile ar trebui animate.
  • întinde este un boolean care se potrivește lungimii de animație cu durata de viață a particulei. 
  • întâmplător este un boolean pentru a determina dacă sub-imaginea de pornire trebuie aleasă în mod aleatoriu.
part_type_sprite (heart_particle, spr_heart, false, false, false);

Gestionarea memoriei

Cel mai important lucru pe care trebuie să-l amintiți despre sistemul de particule GameMaker Studio este că trebuie să eliminați manual articolele din memorie atunci când nu le folosiți. Spre deosebire de obiectele de joc standard, sistemele de particule vor rămâne în memorie chiar dacă schimbați camerele. Cea mai ușoară modalitate de a gestiona acest lucru este plasarea codului de gestionare a memoriei în evenimentele de schimbare a camerelor obiectelor dvs. de joc.

  • part_system_clear (ind): Șterge toți emițătorii și particulele care aparțin unui sistem specific de particule.
  • part_system_clear (ind): Șterge toate instanțele unui anumit tip de particule.
  • part_emitter_clear (ps, ind): Șterge toate particulele aparținând unui emițător specific.
  • part_emitter_destroy (ps, ind): Distruge un emițător specific într-un sistem specific de particule.
  • part_emitter_destroy_all (ps): Distruge toți emițătorii într-un sistem specific de particule.
  • part_type_destroy (ind): Distruge un tip specific de particule.
  • part_system_destroy (ind): Distruge un întreg sistem de particule, incluzând toate particulele și emițătorii din interiorul acestuia.

Concluzie

Chiar și cu un tutorial atât de lung, încă am zgâriat suprafața a ceea ce efecte poate avea sistemul de particule GameMaker Studio. Cheia pentru a stăpâni particulele este familiaritatea și experimentarea, prindeți-vă și începeți să vă creați propriile efecte utilizând cunoștințele pe care le-ați câștigat. Asigurați-vă că verificați documentația oficială a GameMaker pentru a vedea toate sistemele de particule GML disponibile!