"Collision Mask", hvad er det?

Hvordan man i GameMaker definerer, hvor meget en figur fylder, og hvad det vil sige "at ramme den".

En "collision mask" er det område af et objekts sprite, som skal kunne ramme noget andet. Hvis et objekt ikke har tilknyttet en sprite direkte eller som mask index (mere om dette senere), har den ikke en collision mask. Det betyder ikke, at man ikke kan skrive kollisionskode for et sprite-løst objekt, men det betyder, at den indbyggede "collision event" og funktioner som place_meeting() ikke vil have noget at arbejde med, og derfor aldrig vil registrerer en kollision fra eller mod det givne objekt.

Man indstiller en sprites collision mask ved at åbne sprite-vinduet og folde "Collision Mask" ud i venstre side af vinduet.

Collision mask indstillinger i sprite vinduet

I "Collision Mask" området kan man bestemme, hvordan den individuelle sprites collision mask skal tage form, ved at indstille "Mode", "Type", "Tolerance" samt koordinater når det er aktuelt. Som standard, når en ny sprite bliver lavet, er mode sat til "Automatic" og type sat til "Rectangle". "Automatic" betyder, at koordinaterne for spritens collision mask er sat sådan, at en firkant imellem dem lige præcis kan indeholde alt det tegnede (på tværs af alle billeder, hvis der er mere end ét). Og "Rectangle" betyder så, at netop en firkant udgør spritens collision mask.

En collision masks "Type"

Hvis typen på en collision mask er sat til "Rectangle" som ved standardopsætningen, betyder det imidlertid også et ikke-roterende rektangel. Dvs. at hvis du for eksempel bruger image_angle til at rotere dit objekt, vil firkanten bare vokse og krympe, og ikke rotere sig med billedet (se venstre eksempel herunder). Hvis rektanglet skal rotere sig med figuren, skal man i stedet sætte typen til "Rectangle with rotation" (højre eksempel herunder).

Foruden et rektangel, kan man også indstille typen til "Ellipse", "Diamond", "Precise" og "Precise per frame". Typen "Precise" laver en collision mask, som kun dækker de pixels der er tegnet på på tværs af billeder i spritens animation, og "Precise per frame" giver hvert billede i animationen sin egen collision mask som kun præcis dækker deres pixels hver især. "Precise" og "Precise per frame" roterer med spriten, men "Ellipse" og "Diamond" gror og krymper ligesom det ikke-roterede rektangel.

Et ikke-roterende rektangel er den hurtigste måde at tjekke kollisioner på for GameMaker, så hvis du kan nøjes med dette, er det klart det bedste valg. Andre former er langsommere, da GameMaker skal lave mere komplekse udregninger - især "Precise" og "Precise per frame" er ret komplekse at udregne, så brug dem kun når det er strengt nødvendigt, eller hvis du har relativt få objekter og kollisioner i dit spil. I et lille spil vil der ikke være en mærkbar forskel på de fleste computere, men hvis du laver et større spil kan det godt lede til lidt lag.

En collision masks "Mode"

"Mode" arbejder i symfoni med typen: Den definerer hvor stort et område af spriten, der må medtages den collision mask. Når den er sat til standardværdien "Automatic", er det som sagt hele den tegnede sprite på tværs af alle billede. Men man kan også vælge "Full Image" for at medtage hele spritens størrelse (inlusiv tomme områder), eller "Manual" for selv at definere et område. Herunder har jeg for eksempel sat typen til "Diamond" og defineret et afgrænset område med "Manual"-mode.

Collision mask editor med special-defineret mask

Tolerance

I situationer hvor det tegnede på spriten har en indvirken på collision masken - det er for eksempel, når "Mode" er sat til "Automatic" eller når "Type" er sat til "Precise" eller "Precise per frame" - har du mulighed for at indstille en tolerance for pixels gennemsigtighed. Tolerancen er som standard sat til 0, hvilket vil sige at den medtager alle pixels som ikke er fuldkommen gennemsigtige, og hvis du skruer den helt op til 255 vil den ikke medtage nogen pixels overhovedet.

Når du laver en collision mask, er det altid en god idé at overveje tidligt, hvordan den skal sættes op. Det kan være noget værre rod at ændre det senere, da det kan have indvirken på mange elementer i dit spil. Som sagt kan almindelige, firkantede collision masks typisk klare det meste - men det kan være en god idé at justere størrelsen på disse. Er der tale om en fjende eller noget andet, der kan skade spilleren, kan det give god mening at gøre dens collision mask lidt mindre, så spilleren aldrig føler, at de blev ramt uden rigtig at blive ramt. Ligeledes, hvis der er tale om noget positivt for spilleren, som for eksempel et point eller en power-up, kan man gøre dens collision mask lidt større, så den er nemmere at samle op.

Sprite index og mask index

Som tidligere beskrevet vil et objekts collision mask være baseret på den sprite der er sat på objektet. Og hvis du skifter spriten, for eksempel ved sprite_index = spr_some_other_sprite, vil objektets collision mask ligeledes skifte. Hvis vi har en spiller i vores spil med en masse forskellige sprites og animationer (gå, stå, løbe, hop, dukke, etc.), kan det godt være lidt irriterende at sørge for, at alle de mange collision masks er sat op ens. Men hvis de er forskellige, kan man hurtigt risikere, at spilleren sidder fast i gulvet, mure eller lignende.

Man kan komme uden om dette problem ved at sætte objektets "mask index". Dette er en sprite du kan sætte på et objekt udover dens sprite index. Hvis man sætter sådan en, vil denne sprites collision mask blive anvendt i stedet for den satte sprites. På nedenstående billede har jeg for eksempel lavet en sprite kaldet "mask_player" som jeg bruger som collision mask til min spiller.

En sat mask index for et spiller objekt

På denne måde kan man få lidt mere kontrol over collision masken for det givne objekt. Man skal dog stadig sørge for, at denne mask index og de sprites der benyttes har samme "origin punkt" - origin punktet og koordinater i GameMaker kan du læse om i Koordinater, hvad er det?.

Jeg håber dette skriv har givet lidt indsigt i, hvilken rolle collision masks spiller i GameMaker, og hvordan du bedst kan bruge dem. Herfra er det blot at prøve sig frem.

Mere i samme serie:

  1. Koordinater, hvad er det?
  2. "Collision Mask", hvad er det? (denne)

Published