Het ontwerpen van spellen met Game Maker
Geavanceerde tekenfuncties
Deze functies zijn alleen beschikbaar in de geregistreerde versie van Game Maker.Hierboven, zijn een aantal basis tekenfuncties beschreven. Hier vindt je een aantal extra functies die je veel meer mogelijkheden bieden. Eerst en vooral zijn er functies om vormen met gradiëntkleuren te tekenen. Ten tweede zijn er functies om meer algemene veelhoeken te tekenen, en definitief is er de mogelijkheid om textuur in kaart gebrachte veelhoeken te tekenen.
De volgende uitgebreide versies van de basis tekenfuncties bestaan, elk van hen krijgt extra kleurenparameters die de kleur bepalen bij verschillende toppen. De standaard tekenkleur wordt niet gebruikt in deze functies.
draw_point_color(x, y, col1) Tekent een punt op positie (x,y) in de gegeven kleur.
draw_line_color(x1, y1, x2, y2, col1, col2) Tekent een lijn vanaf positie (x1,y1) tot (x2,y2), met een vloeiende overgang tussen col1 en col2.
draw_rectangle_color(x1, y1, x2, y2, col1, col2, col3, col4, outline) Tekent een vierkant. De vier kleuren bepalen de kleuren in de linker-boven, rechter-boven, rechter-onder, en linker-onder hoek. outline bepaald of alleen de buitenste lijn moet worden getekend (true) of alles moet worden opgevuld(false).
draw_roundrect_color(x1, y1, x2, y2, col1, col2, outline) Tekent een vierkant met ronde hoeken. col1 is de kleur in het midden en col2 the kleur op de grens. outline bepaalt of alleen de buitenste lijn getekend moet worden (true) of dat het opgevuld moet worden (false).
draw_triangle_color(x1, y1, x2, y2, x3, y3, col1, col2, col3, outline) Tekent een driehoek. De drie kleuren zijn de kleuren van de drie hoeken welke worden geïnterpoleerd. outline bepaalt of alleen de buitenste lijn moet worden getekend (true) of dat het opgevuld moet worden (false).
draw_circle_color(x, y, r, col1, col2, outline) Tekent een cirkel op (x,y) met straal (radius) r. col1 is de kleur in het midden en col2 de kleur aan de buitenkant. outline bepaalt of alleen de buitenste lijn getekend moet worden (true) of moet worden opgevuld (false).
draw_ellipse_color(x1, y1, x2, y2, col1, col2, outline) Tekent een ellips. col1 is de kleur in het midden en col2 aan de buitenkant. outline bepaald of alleen de buitenste lijn moet worden getekend (true) of moet worden opgevuld (false).
Je kunt grotere primitieven ook tekenen. Dit is iets anders. Je begint door de primitief te specificeren die je wilt tekenen. Daarna specificeer je de hoeken, en als laatste definieert je de primitief, op welk ogenblik het wordt getekend. Er zijn zes types van primitieven:
pr_pointlist De hoeken zijn een setje punten.
pr_linelist De hoeken zijn een set van delen van lijnen. Elk paar van een deel van een lijn. Dus Er moet een even aantal set van hoeken zijn.
pr_linestrip De hoeken vormen een polylijn met de eerste vastgemaakt aan de tweede enz. De laatste is niet vastgemaakt aan de eerste. Je moet een extra kopie maken van de eerste hoek voor dit.
pr_trianglelist De toppen zijn een reeks driehoeken. Elk drievoud toppen vormt een driehoek. Zo moet het aantal toppen een veelvoud van 3 zijn.
pr_trianglestrip De toppen vormen opnieuw driehoeken maar dit keer iets anders. De eerste drie vormen de eerste driehoek. De laatste twee van deze hoeken, samen met de volgende hoek, vormen de tweede driehoek enz. Zo specificeert je een nieuwe driehoek, die met vorige wordt verbonden.
pr_trianglefan Gelijkaardig aan een driehoekslijst maar dit keer maakt de eerste hoek deel uit alle driehoeken. Opnieuw, specificeert elke nieuwe hoek een nieuwe driehoek, die met de vorige hoek en de eerste hoek wordt verbonden.
De volgende functies bestaan om nieuwe primitieven te tekenen.
draw_primitive_begin(kind) Begint een primitief van het geselecteerde type.
draw_vertex(x, y) Voegt hoek(x,y) toe aan de primitief, gebruikmakend van kleur en alpha waarde die eerder moeten zijn geselecteerd.
draw_vertex_color(x, y, col, alpha) Voegt hoek (x,y) toe aan de primitief, met zijn eigen kleur en alpha waarde. Dit stelt je in staat om primitieven de maken waarvan de kleuren en alpha overlopen.
draw_primitive_end() Beëindigt de eigenschappen van de primitief. Deze functie tekent het.
Tot slot is het mogelijk om primitieven van sprites of achtergronden te tekenen die als vormen gebruikt kunnen worden. Tijdens het gebruiken van een vorm wordt het beeld geplaatst op de primitief, die het een nieuwe vorm geeft om de primitief te passen. De vormen worden gebruikt om detail aan primitieven toe te voegen, bijv. een bakstenen muur. Om vormen te gebruiken moet je eerst de id van de vorm verkrijgen die je wilt gebruiken. Voor dit bestaan de volgende functies:
sprite_get_texture(spr, subimg) geeft de id van de vorm terug corresponderend met subafbeelding subimg van de geselecteerde sprite.
background_get_texture(back) geeft de id van de vorm terug corresponderend met de geselecteerde achtergrond.
Een geselecteerde textuur zou nog niet in videogeheugen kunnen zijn. Het systeem zal het daar zetten zodra je het nodig hebt maar soms wil je dit zelf beslissen. Voor dit bestaan de volgende twee functies:
texture_preload(texid) Zet onmiddellijk de textuur in videogeheugen.
texture_set_priority(texid, prio) Wanneer er ook weinig videogeheugen is zullen sommigen tijdelijk worden verwijderd om ruimte voor anderen te maken die nodig zijn. Degenen met laagste prioriteit worden eerst verwijderd. Het gebrek, allen hebben prioriteit 0 maar je kunt de prioriteit hier veranderen. (Gebruik alleen positieve waarden!)
Om texturen aan primitieven toe te voegen moet je specificeren welke delen van de texturen waar moeten worden gezet op de primitief. De posities in de textuur zijn vermeld met waarden tussen 0 en 1 maar er is hier een probleem. De grootte van texturen moet bevoegdheden van 2 zijn(zo bijv. 32x32 of 64x64). Als je sprites of achtergrond als texturen wilt gebruiken zorg je beter ervoor zij een dergelijke grootte hebben. Zo niet, zal de test leeg zijn. Te weten komen wat van de textuur scheiden wordt eigenlijk gebruikt je kan de volgende twee functies gebruiken. Zij keren een waarde tussen 0 en 1 terug die op de breedte of de hoogte van het daadwerkelijke deel van de textuur wijst die wordt gebruikt. Het specificeren van deze waarde als textuurcoördinaat zal op de recht of onderkant van de textuur wijzen.
texture_get_width(texid) Geeft de waarde van de breedte van de textuur met gegeven id terug. De breedte ligt tussen 0-1.
texture_get_height(texid) Geeft de waarde van de hoogte van de textuur met gegeven id terug. De breedte ligt tussen 0-1.
Om getextureerde primitieven te tekenen gebruik je de volgende functies:
draw_primitive_begin_texture(kind, texid) Begin een primitief van de vermelde soort met de gegeven textuur.
draw_vertex_texture(x, y, xtex, ytex) Voegt hoek (x,y) toe op positie (xtex,ytex) in de textuur, mengend met de kleur en de alpha waarde alvorens xtex en ytex normaal tussen 0 en 1 zou moeten liggen maar ook de grotere waarden kunnen worden gebruikt, leidend tot een herhaling van de textuur (zie verder).
draw_vertex_texture_color(x, y, xtex, ytex, col, alpha) Voegt hoek (x,y) toe op positie (xtex,ytex) in de textuur, gemengd met zijn eigen kleur en alpha waarde.
draw_primitive_end() Beëindigt de beschrijving van de textuur. Deze functie tekent het.
Er zijn drie functies die beïnvloeden hoe de texturen worden getekend:
texture_set_interpolation(linear) Wijst erop of lineaire (true) te gebruiken interpolatie of het meest dichtbijgelegen (false) pixel. De lineaire interpolatie geeft meer vlotte texturen maar kan ook een beetje onscherp zijn en kost soms extra tijd. Het plaatsen beïnvloedt ook de tekening van sprites en achtergrond. Het normale is false. (Dit kan ook in de spelopties worden veranderd.)
texture_set_blending(blend) Wijst erop of aan gebruik het mengen met kleuren en alpha- waarden. Schakelen van dit zou veel sneller op oude hardware kunnen zijn. Het plaatsen beïnvloedt ook de tekening van sprites en achtergrond. Het normale is true.
texture_set_repeat(repeat) Wijst erop of het gebruik van de textuur herhaald moet worden. Dit werk als volgt. Zoals hierboven vermeld liggen de coördinaten tussen 0-1. Als je een waarde groter dan 1 specificeert, wordt de rest niet getekend. Door te plaatsen herhaal waar de textuur wordt herhaald. Merk op dat sprites en de achtergronden altijd zonder het herhalen worden getekend. Zo zodra je de sprite van de achtergrond tekent wordt deze waarde teruggesteld aan false. Het normale is false.
Er zijn twee meer functie die niet alleen nuttig voor tekeningstexturen zijn. Normaal worden de primitieven gemengd met de achtergrond gebruikmakend de alpha waarde. Je kunt eigenlijk erop wijzen hoe dit moet gebeuren. Naast de normale wijze is het mogelijk om erop te wijzen, dat de nieuwe kleur moet aan de bestaande kleur worden toegevoegd of van de bestaande kleur worden afgetrokken. Dit kan worden gebruikt om bijv. vleklichten of schaduwen tot stand te brengen. Ook is het mogelijk om te sorteren van vergt het maximum van de nieuwe en bestaande kleur. Dit kan bepaalde verzadigingsgevolgen vermijden die je met het toevoegen kunt krijgen. Merk op dat zowel het aftrekken als het maximum niet met de alpha waarde volledig rekening houden. (DirectX staat dit niet toe.) Zo zorg je beter ervoor het buitengebied zwart is. Er zijn twee functies. Eerste geef je slechts de vier hierboven beschreven opties. De tweede functie geeft je meer mogelijkheden. Je zou een beetje met de montages moeten experimenteren. Indien effectief gebruikt kunnen zij worden gebruikt om bijv. interessante explosie of halogevolgen tot stand te brengen.
draw_set_blend_mode(mode) Selecteert de modus om te mengen. De volgende waardes zijn mogelijk: bm_normal, bm_add, bm_subtract, en bm_max. Vergeet niet om de modus te veranderen naar normaal na het gebruikt want anders worden sprites en zelfs achtergronden getekend met de meng modus.
draw_set_blend_mode_ext(src, dest) Selecteert welke modus er moet worden gebruikt voor de bron en bestemmings kleur. De nieuwe kleur is soms de bron en soms de bestemming. Deze factoren zijn bepaald met deze functie. Om dit te begrijpen, De bron en bestemming hebben allebei als rood, groen, blauw, en alpha componenten. Dus de bron is (Rs, Gs, Bs, As) en de bestemming is (Rd, Gd, Bd, Ad). Alle getallen moeten tussen de 0 en 1 liggen. De meng factoren die je kan kiezen voor zijn:Bijv. de normale meng modus verandert de bron naar bm_src_alpha en de bestemming naar bm_inv_src_alpha. Vergeet niet de normale modus terug te zetten omdat anders de sprites en zelfs de achtergronden worden getekend met de nieuwe meng modus.
- bm_zero: Meng factor is (0, 0, 0, 0).
- bm_one: Meng factor is (1, 1, 1, 1).
- bm_src_color: Meng factor is (Rs, Gs, Bs, As).
- bm_inv_src_color: Meng factor is (1Rs, 1Gs, 1Bs, 1As).
- bm_src_alpha: Meng factor is (As, As, As, As).
- bm_inv_src_alpha: Meng factor is (1As, 1As, 1As, 1As).
- bm_dest_alpha: Meng factor is (Ad, Ad, Ad, Ad).
- bm_inv_dest_alpha: Meng factor is (1Ad, 1Ad, 1Ad, 1Ad).
- bm_dest_color: Meng factor is (Rd, Gd, Bd, Ad).
- bm_inv_dest_color: Meng factor is (1Rd, 1Gd, 1Bd, 1Ad).
- bm_src_alpha_sat: Meng factor is (f, f, f, 1); f = min (As, 1Ad).
De textuurprimitieven van de tekening zijn weinig werk maar kunnen tot grote resultaten leiden. Je kunt het zelfs gebruiken om nep 3D spelen te maken.