Home | Aanpassen | Blog | Extra's | Log In | Info
Handleiding | D&D iconen | GML Parser | Archief | Iso City
Gebruikersnaam: Wachtwoord:  
Over ons | Features | Directory | Banners | Contact

Het ontwerpen van spellen met Game Maker
Het ontwerpen van spellen met Game Maker

Transformaties

Transformatie maakt het mogelijk om de plaats waar dingen in de wereld worden getekend te veranderen. Bijvoorbeeld, de functie om blokken te tekenen kan alleen blokken parallel aan de assen tekenen. Door eerst een draaitransformatie in te stellen kun je gedraaide blokken creëren. Ook worden sprites altijd parallel aan de xy-oppervlakte getekend. Door eerst een transformatie in te stellen kun je dit veranderen. Er zijn twee typen functies: functies die een transformatie instellen en functies die transformaties toevoegen.

d3d_transform_set_identity() Stelt de transformatie in op de identiteit (geen transformatie).
d3d_transform_set_translation(xo, yo, zo) Stelt de transformatie in op een overgang over de aangegeven vector.
d3d_transform_set_scaling(xv, yv, zv) Stelt de transformatie in op een vergroting of verkleining met de aangegeven hoeveelheden.
d3d_transform_set_rotation_x(richting) Stelt de transformatie in op een draaiing over de x-as met de aangegeven hoeveelheid.
d3d_transform_set_rotation_y(richting) Stelt de transformatie in op een draaiing over de y-as met de aangegeven hoeveelheid.
d3d_transform_set_rotation_z(richting) Stelt de transformatie in op een draaiing over de z-as met de aangegeven hoeveelheid.
d3d_transform_set_rotation_axis(xa, ya, za, richting) Stelt de transformatie in op een draaiing over de as aangegeven door de vector met de aangegeven hoeveelheid.
d3d_transform_add_translation(xo, yo, zo) Voegt een overgang toe over de aangegeven vector.
d3d_transform_add_scaling(xv, yv, zv) Voegt een vergroting of verkleining toe met de aangegeven hoeveelheden.
d3d_transform_add_rotation_x(richting) Voegt een draaiing over de x-as toe met de aangegeven hoeveelheid.
d3d_transform_add_rotation_y(richting) Voegt een draaiing over de y-as toe met de aangegeven hoeveelheid.
d3d_transform_add_rotation_z(richting) Voegt een draaiing over de z-as toe met de aangegeven hoeveelheid.
d3d_transform_add_rotation_axis(xa, ya, za, richting) Voegt een draaiing toe over de as aangegeven door de vector met de aangegeven hoeveelheid.
Realiseer je dat draaiing, vergroting en verkleining relatief zijn aan de origin van de wereld, niet relatief aan het object dat wordt getekend. Als het object niet op de origin is zal het ook verplaatsen naar een andere plaats, wat we niet willen. Dus om bijv. een object te draaien over zijn eigen x-as, moeten we eerst de origin overzetten, het dan draaien, en tenslotte terugzetten naar zijn eigen positie. Dit is waarvoor de functies om transformaties toe te voegen zijn.

Het volgende voorbeeld legt dit misschien beter uit. Ga er van uit dat we een sprite spr hebben die we op positie (100,100,10) willen tekenen. We kunnen de volgende code gebruiken om dit te doen

{
  d3d_transform_set_translation(100,100,10);
  draw_sprite(spr,0,0,0);
  d3d_transform_set_identity();
}

Merk op dat omdat we een transformatie gebruiken we de sprite nu op positie (0,0) moeten tekenen. (Dit gaat er van uit dat de huidige instantie een diepte van 0 heeft! Als je het niet zeker weet, eerst de diepte instellen.) Als we dit zouden gebruiken in onze first person shooter zouden we de sprite niet zien. De reden is dat het nog steeds parallel aan de xy-oppervlakte is. We willen het 90 graden draaien langs de x-as (of y-as). Dus moeten we een draaiing toevoegen. Onthoud de volgorde: we moeten eerst de sprite draaien en dan overzetten. Dus kunnen we de volgende code gebruiken.

{
  d3d_transform_set_identity();
  d3d_transform_add_rotation_x(90);
  d3d_transform_add_translation(100,100,10);
  draw_sprite(spr,0,0,0);
  d3d_transform_set_identity();
}

Soms wil je tijdelijk de huidige transformatie opslaan, bijvoorbeeld om een extra transformatie toe te voegen en dan de oude herstellen (dit gebeurt vaak als men hierarchische modellen tekent). Hiervoor kun je de huidige transformatie op een stack duwen en later hem er van af trekken om het opnieuw de huidige transformatie te maken. De volgende functies bestaan hiervoor:

d3d_transform_stack_clear() Wist de stack van transformaties.
d3d_transform_stack_empty() Geeft aan of de transformatie stack leeg is.
d3d_transform_stack_push() Duwt de huidige transformatie op de stack. Geeft aan of er ruimte op de stack was om het daarop te duwen (als je vergeet om de transformatie te trekken zul je op een gegeven moment geen ruimte op de stack meer over hebben).
d3d_transform_stack_pop() Trekt de bovenste transformatie van de stack en maakt het de huidige. Geeft aan of er een transformatie op de stack was.
d3d_transform_stack_top() Maakt de bovenste transformatie de huidige, maar verwijdert hem niet van de stack. Geeft aan of er een transformatie op de stack was.
d3d_transform_stack_discard() Verwijdert de bovenste transformatie van de stack maar maakt het niet de huidige. Geeft aan of er een transformatie op de stack was.

Het gebruik van transformaties is een krachtig mechanisme. Maar wees voorzichtig en zet de transformatie altijd terug op de identiteit zodra je ermee klaar bent.

Zoeken Zoeken


Alternatieve versies Alternatieve versies

Je kan de handleiding ook lezen op een lange pagina (± 1.5 mb)

Ook beschikbaar in: Engels Frans Duits

ZIP Download helpfile

Advertentie Advertentie

GameMaker Handleiding