Mastering av GameMaker Studio Particle System

I denne artikkelen vil vi begynne med grunnleggende om GameMaker Studio-partikkelsystemet og avslutte med avanserte teknikker og implementeringer. Tenk på dette som et kurskurs for å få deg kjent og komfortabel med en av GameMaker Studios mest kraftige innebygde funksjoner. Demo og nedlastbare prosjektfil vil tillate deg å følge med artikkelen for å se nøyaktig hva partikkelsystemet handler om.

Partikkelsystemoversikt

GameMaker Studio-partikkelsystemet er en billig og enkel måte å skape prangende effekter på for ditt spillprosjekt. Gjennom en kombinasjon av partikler og emittere kan du raskt lage imponerende eksplosjoner, røyk, blod, shrapnel og utallige andre effekter. Lignende effekter kan oppnås ved å bruke enkelte objekter, men beregningskostnaden til det innebygde partikkelsystemet er langt billigere.

For å bruke partikkelsystemet i prosjektet ditt, må du forstå GML (GameMaker Language), men når du blir kjent med partikkelsystemet, er det bare et spørsmål om å fylle ut emner og eksperimenter.

Ta en titt på demoen nedenfor for å se hva vi kan oppnå:

Grunnleggende partikkelsystem

Partikkelsystemer i GameMaker Studio består av tre deler: selve systemet, partikkelen og emitteren. Du kan opprette flere systemer, og hvert system kan inneholde flere partikler og emittere. Tenk på systemet som en beholder, med partikler og emittere som er definert i.

Implementere en partikkel-effekt i GameMaker Studio er en fire trinns prosess. 

  1. Først må du definere partikkelsystemet selv. 
  2. Deretter definerer du de faktiske partiklene som skal brukes i dette systemet. 
  3. Deretter må du definere emitteren som vil skape dine definerte partikler. 
  4. Til slutt må du avgjøre når og hvor partikkelemitteren vil vises i spillet ditt.

For å lære deg grunnleggende om GameMaker Studio-partikkelsystemet, starter vi ved å skape denne svært enkle grønne partikkel-effekten.

Opprette partikkelsystemet

Å lage partikkelsystemet er like enkelt som å definere en variabel. Vi lager et objekt som heter obj_first_particle og plasser følgende kode i objektets opprettingshendelse:

FirstParticleSystem = part_system_create ();

Partikkelsystemet vil anta dybdeverdien til objektet som systemet er definert i, men du kan også sette dybden separat med GML:

part_system_depth (FirstParticleSystem, 0);

Husk at objekter og partikkelsystemer med høy dybdeverdi trekkes først til skjermen. Med en dybde på 0, vårt grønne partikkelsystem vil vises over objekter med en dybde større enn 0, og vises under objekter med en dybde mindre enn 0.

Partikkelsystemene trekkes til skjermen med en basisposisjon i forhold til (0,0). Hvis du av en eller annen grunn vil opprette en kompensasjon for alle fremtidige stillinger i dette partikkelsystemet, kan du bruke følgende kode for å opprette en ny baseposisjon (hvor ind er partikkelsystemet):

part_system_position (ind, x, y);

Med en ny basestilling satt til (10,10), en partikkel opprettet på (25,25) vil i stedet bli trukket til (35,35). Det er sjelden nødvendig å endre basisposisjonen til et partikkelsystem, men du kan finne det nyttig i ditt spesifikke prosjekt.

Opprette partikkelstype

Nå som systemet er satt opp, er det på tide å definere den faktiske partikkelen som emitteren vil skape. Partikler kan inneholde et stort antall parametere som dikterer hvordan partikkelen vil se ut og oppføre seg. Det første trinnet er å skape en variabel for partikkelen, og vi gjør dette i Skape hendelse av obj_first_particle gjenstand:

first_particle = part_type_create ();

Deretter begynner vi å definere de enkelte parametrene til partikkelen. Siden vi ikke planlegger å endre denne partikkelen under kjøretid, kan vi plassere alle av denne koden i Skape hendelse av obj_first_particle gjenstand.

part_type_shape bestemmer partikkelens grunnform. Det finnes 14 standardpartikkelformer i GameMaker Studio, og du kan også definere dine egne figurer. Vi vil dekke dette i avanserte delen nedenfor, men for nå la vi bare starte med et grunnfelt.

part_type_shape (first_particle, pt_shape_square);

For en fullstendig liste over tilgjengelige standardformer, sjekk den offisielle GameMaker dokumentasjonen.

Med part_type_scale, vi kan sette grunnverdiene X og Y for partikkelformen. Siden vi vil ha en perfekt firkantet form, bruker vi følgende kode:

part_type_scale (first_particle, 1,1);

part_type_size lar oss endre størrelsen på partikkelen ved opprettelse og så vel som over tid. Formatet for denne koden er part_type_size (ind, size_min, size_max, size_incr, size_wiggle)

  • ind er partikkelvariabelen. 
  • size_min og size_max bestem rekkevidden av partikkelstørrelsen når den først opprettes. Hvis du vil ha en jevn størrelse, skriv inn samme verdi for både min og max. 
  • size_incr er en verdi som gjør at partikkelen kan vokse eller krympe over tid. Denne verdien bestemmer veksthastigheten, så hvis du ikke vil at sprite skal endre størrelse, kan du bruke en verdi på 0
  • size_wiggle er litt mer komplisert, så vi vil dekke det i avansert teknikk delen nedenfor.

Her er partikkelstørrelsekoden som brukes i vår grønne partikkel-effekt:

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

Partikkelen vil bli opprettet med en størrelse et sted mellom 0,10 og 0,15 å skape variasjon, og sprite vil sakte krympe med en hastighet på -0,001. Denne hastighetsverdien avhenger mye av romhastigheten din, så du vil sannsynligvis trenge å eksperimentere med verdier for å få de ønskede resultatene. Vi vil ikke bruke noen størrelse wiggle, så vi setter verdien til 0.

Partikler i GameMaker Studio kan faktisk endre farger over tid. Dette oppnås med part_type_color2 og part_type_color3. Hvis du ikke vil at sprite skal bytte farger, kan du bare bruke part_type_color1. For vår grønne partikkeleffekt ønsker vi at den skal starte med en lys gul / grønn farge og deretter bytte til en solid grønn farge, så vi bruker part_type_color2:

part_type_color2 (first_particle, 8454143,65280);

De to fargene jeg har valgt er bestemte numeriske verdier som jeg bruker regelmessig, men hvis du vil bruke mer tradisjonelle hex-verdier, kan du bruke formatet $ rrggbb.

Partikler kan også bli mer eller mindre gjennomsiktige over tid med part_type_alpha2 og part_type_alpha3. Hvis du vil ha en konsistent alfa-verdi, bruk part_type_alpha1. For vår grønne partikkeleffekt, vil vi at partikkelen skal begynne helt ugjennomsiktig og falme med 25% ettersom den forblir på skjermen, så vi trenger to alfaverdier:

part_type_alpha2 (first_particle, 1,0.75);

I GameMaker er alfa en verdi fra 0 til 1. Et helt usynlig objekt vil ha en alfa-verdi på 0, mens en helt ugjennomsiktig gjenstand vil ha en alfa-verdi på 1.

Partikkelhastighet bestemmes akkurat som partikkelstørrelse. Partikler er opprettet innenfor en rekke hastighetsverdier, og den verdien kan øke eller redusere. Formatet for denne koden er del_type_speed (ind, speed_min, speed_max, speed_incr, speed_wiggle), hvor ind er partikkelvariabelen, speed_min og speed_max er hastighetsområdet, speed_incr er hastigheten hvor partikkelhastigheten endres, og speed_wiggle er en parameter som vi vil dekke senere. 

Hastighetskoden for vår grønne partikkel er:

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

Vår partikkel vil begynne å bevege seg med en hastighetsverdi et sted mellom 0.1 og 0.5. Denne hastigheten forblir konstant, så vi bruker en verdi på 0, og vi vil igjen ikke implementere hastighetswiggle, så vi bruker en verdi av 0.

Mens en partikkelens hastighetsparameter bestemmer hvor fort den beveger seg, bestemmer retningsparameteren hvor den beveger seg. Retningskoden er i følgende format: part_type_direction (ind, dir_min, dir_max, dir_incr, dir_wiggle) og igjen setter vi variabelen, startområdet, en inkrementell verdi og en wiggle-verdi. For den grønne partikkeleffekten vil vi at partikkelen skal begynne å bevege seg i alle retninger, og vi vil at den retningen skal forbli konstant:

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

Området 0 til 359 sikrer at partikkelen har en sjanse til å bevege seg i alle retninger (en vinkel mellom 0 og 359 grader). Hvis du ville ha en partikkel å flytte opp og bare opp, da vil du bruke et område på 90 til 90).

Graden av vår partikkel effekt er det som gjør det mest interessant. Selv om våre hastighets- og retningsparametere er satt til å skape en partikkel som begynner å bevege seg i en retning med konstant hastighet, skyver gravitasjonsparameteren inn og endrer partikkelen over tid. Med et format på part_type_gravity (ind, grav_amount, grav_direction), Gravitasjonsparameteren er veldig enkel:

part_type_gravity (first_particle, 0.02,90);

Ved å bruke et svakt vektuttak på 0,02 i en oppadgående retning (90 grader), kan vi lage en partikkel som ser ut til å flyte. Kombinert med størrelsen og alfa-parametrene, krympes partikkelen og blir gjennomsiktig over tid, ledsaget av gravitasjonsløftet.

Orienteringen av partikkelformen er også viktig for utseendet av effekten, så vi bruker part_type_orientation (ind, ang_min, ang_max, ang_incr, ang_wiggle, ang_relative) å rotere torget over tid. 

  • ind er partikkelvariabelen. 
  • ang_min og ang_max bestem startverdien av formens rotasjonsverdi.
  • ang_incr brukes til å øke eller redusere formens orientering over tid.
  • ang_relative er en boolsk verdi for å bestemme om orienteringen skal settes i forhold til partikkels bevegelse (sant) eller ikke (falsk). 

Vi vil at vår grønne partikkel skal rotere litt til venstre, så vi bruker følgende kode:

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

En av de viktigste parameterne til en partikkel er levetid verdi. Denne verdien bestemmer minimums- og maksimal tid som en partikkel skal trekkes til skjermen. Med to identiske min- og max-verdier vil alle partikler av den typen eksistere i samme tid. Vi ønsker at våre grønne partikler skal ha variasjon, så vi vil bruke et utvalg på 100 til 150 for levetidverdien:

part_type_life (first_particle, 100,150);

Den endelige parameteren for partikler er en enkel boolsk til å bestemme om partiklene skal blandes sammen med en additiv blandingseffekt:

part_type_blend (first_particle, true);

Opprette partikkelemitteren

Det første trinnet i å definere en emitter er å skape en variabel. Vi definerer denne emitteren i Create event of the obj_first_particle gjenstand.

first_emitter = part_emitter_create (FirstParticleSystem);

Deretter definerer vi emitterregionen med part_emitter_region (ps, ind, xmin, xmax, ymin, ymax, form, distribusjon).

  • ps er partikkelsystemet som emitteren tilhører og ind er emittervariabelen.
  • X- og y min- og max-verdiene bestemmer størrelsen på emitterområdet. 
  • form bestemmer formene til emitterområdet (ps_shape_rectangle, ps_shape_ellipse, ps_shape_diamond, ps_shap_line). 
  • fordeling er en distribusjonskurve (ps_dist_linear, ps_distr_gaussian, ps_distr_invgaussian).

Vi vil dekke formen og distribusjonsparametrene nærmere i avsnittet avanserte teknikker. For nå bruker vi standard ellipsform og gaussiske distribusjonsverdier:

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

Denne koden oppretter en elliptisk emitter-region som er 40 piksler høy og 40 piksler bred og sentrert på x- og y-verdiene av obj_first_particle gjenstand. Partikler opprettet av emitteren vil vises innenfor denne definerte regionen.

Aktiverer partikkelemitteren

Det neste trinnet er å bestemme en av to emittertyper: Burst eller Stream. En Burst-emitter skaper en spesifisert mengde av en bestemt partikkel når den utløses. En Stream-emitter skaper en spesifisert mengde av en bestemt partikkel ett gang hvert trinn. 

Vi tar en titt på de mer allsidige Burst-emittene i avansert teknikk, så nå lar vi bare bruke Stream-emitteren:

part_emitter_stream (FirstParticleSystem, first_emitter, first_particle, 1);

Vi plasserer denne koden i Skape hendelse av obj_first_particle objekt, noe som resulterer i at emitteren lager en partikkel hvert trinn så snart objektet er opprettet. Med en romfart på 30, vil vår emitter skape 30 partikler per sekund; å lage 60 partikler per sekund, ville du bare bruke en verdi på 2 i stedet for 1.

Og med det er vår enkle grønne partikkel-effekt fullført! Bruken av denne effekten er begrenset, men det er viktig å starte små før du går inn i de mer kompliserte aspektene av GameMaker Studio-partikkelsystemet. Når du forstår det grunnleggende i partikkelsystemet, kan du begynne å implementere mer avanserte partikkelsystemer.

Avansert partikkelsystemteknikk

Partikkel Wiggle

Wiggle er en enkel, men likevel kraftig parameter som kan drastisk endre utseendet på partiklene dine. Wiggle-parameteren får partiklen til å svinge mellom min og max-verdiene for partikkelens levetid. Verdien kan være mellom 0 og 20 og bestemmer hastigheten på wiggle. 

Eksemplet "Brannboble" i den innebygde demoen bruker en wiggle-verdi på 0,40 i part_type_size parameter:

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

Burst Emitters og Moving Objects

En av de mest vanlige implementeringene av partikkelsystemer innebærer partikler som kommer fra bak et bevegelige objekt, som for eksempel en røykspor på et rakett. Å oppnå denne effekten i GameMaker Studio krever en Burst-emitter som skal plasseres i et objekt Skritt begivenhet.

Det medfølgende eksemplet bruker det samme grønne partikkelsystemet som tidligere, men med en litt modifisert emitter. I stedet for å utløse en Stream-emitter i objektets Skape Hendelse, en Burst-emitter er plassert i objektets Skritt begivenhet. Den aktuelle posisjonen til musepekeren er markert mot den forrige posisjonen til markøren, og hvis det er en endring i markørens posisjon, utløses Burst-emitteren for å frigjøre fem partikler:

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

Emitter Region Shapes

Ved å bruke de forskjellige emitterformene og distribusjonskurver, kan du opprette mye forskjellige effekter. Linjær kurvefordeling kombinert med en linjeformet partikkelemitter kan skape en overbevisende regneeffekt.

part_emitter_region (RainParticle, rain_emitter, -100, room_width, y, y, ps_shape_line, ps_distr_linear);

Emitterformen er definert av en linje som begynner 100 piksler til venstre for romets opprinnelse og blir utvidet til bredden av rommet. En lineær distribusjonskurve brukes til å distribuere regnpartiklene jevnt over emitterområdet. Det er også nyttig å bruke part_system_update for å fremme regnpartikkelen flere trinn i Skape begivenhet. Denne koden gir inntrykk av at regnet falt før du lastet inn rommet, selv om partikkelsystemet ikke eksisterte i minnet ennå.

gjenta (room_speed * 3) part_system_update (RainParticle); 

Partikkel System Trinn og Dødseffekter

Individuelle partikler i et system kan også hekte andre partikler på Skritt og Død arrangementer. Eksemplet viser en lilla gnistpartikkel som gis mindre støvpartikler når den beveger seg til høyre, og gir en røykpartikkel ved slutten av levetiden:

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

Tilpassede partikkelformer

Ved bruk av part_type_sprite (ind, sprite, animere, strekke, tilfeldig), Du kan bruke tilpassede sprites i stedet for de innebygde GameMaker partikkeltyper. 

  • ind er partikkelvariabelen.
  • sprite er sprite-variabelen som skal brukes.
  • animere er en boolsk for å avgjøre om underbildene skal animeres.
  • tøye ut er en boolsk som samsvarer med animasjonslengden til partikkets levetid. 
  • tilfeldig er en boolsk for å avgjøre om startunderbildet skal velges tilfeldig.
part_type_sprite (heart_particle, spr_heart, usann, usann, usann);

Minnehåndtering

Det viktigste å huske om GameMaker Studio-partikkelsystemet er at du må manuelt fjerne elementer fra minnet når de ikke er i bruk. I motsetning til vanlige spillobjekter forblir partikkelsystemer i minnet selv om du bytter rom. Den enkleste måten å håndtere dette på er å plassere minnehåndteringskode i romendringshendelsene i spillobjektene dine.

  • part_system_clear (Ind): Rydder alle emittere og partikler som tilhører et bestemt partikkelsystem.
  • part_system_clear (Ind): Fjerner alle forekomster av en bestemt partikkeltype.
  • part_emitter_clear (ps, ind): Rydder alle partikler som tilhører en bestemt emitter.
  • part_emitter_destroy (ps, ind): Destruerer en bestemt emitter i et bestemt partikkelsystem.
  • part_emitter_destroy_all (ps): Destruerer alle emittere i et bestemt partikkelsystem.
  • part_type_destroy (Ind): Destruerer en bestemt partikkeltype.
  • part_system_destroy (Ind): Destruerer et helt partikkelsystem, inkludert alle partikler og emittere inneholdt i.

Konklusjon

Selv med en så lang opplæring, har vi fremdeles bare riper overflaten av hva slags effekter GameMaker Studio-partikkelsystemet er i stand til. Nøkkelen til å mestre partikler er kjennskap og eksperimenter, så hopp inn og begynn å lage dine egne effekter ved hjelp av den kunnskapen du har oppnådd. Pass på å sjekke ut den offisielle GameMaker-dokumentasjonen for å se alle tilgjengelige partikkelsystem GML!