game maker
Gebruikersnaam:
Wachtwoord:
Home Info Forums Help
Welkom, Gast. Alsjeblieft inloggen of registreren.
De activerings e-mail gemist?
+  Forums
|-+  Werken met Game Maker
| |-+  Tutorials en Uitbreidingen (Moderator: Maarten Baert)
| | |-+  [Tut] Primitives (2D)
Pagina's: [1]
« vorige volgende »
Print
Advertenties

Flumble
Gebruiker


Offline Offline

Berichten: 2018


« Gepost op: 21 Maart 2008, 20:00:45 »

Versies: 6.1 of hoger (5.3 is mogelijk, maar bevat maar 1 tekenfunctie)
Niveau: Gevorderden (Kennis van GML vereist)
Registratie vereist: Ja

Inhoud

In deze tutorial zal ik jullie wegwijs maken in het gebruik van primitieven. Dit is een krachtig tekenmechanisme waarmee je bijvoorbeeld sprites helemaal kan vervormen en tal van effecten kan maken. Deze tutorial is opgedeeld in de volgende hoofdstukken:

  • Hoofdstuk 1: Inleiding tot primitieven en de eerste functies
  • Hoofdstuk 2: Gekleurde primitieven tekenen
  • Hoofdstuk 3: Primitieven met texturen tekenen
  • Het einde
  • Updates

Bij elk hoofdstuk zit een (aantal) opdracht(en). Klik hier om de opdrachten de downloaden.


Introductie

Voordat je lukraak begint met functies intypen, moet je eerst een paar belangrijke dingen over primitieven kennen.
Een primitieve is een reeks van punten, lijnen of driehoeken die los of aan elkaar zitten. Welke soort primitieven je wilt hebben en de manier waarop ze aan elkaar zitten (alleen bij lijnen en driehoeken), geef je aan bij het beginnen van een primitieve. Om het gebruik van een primitieve te beginnen, gebruik je de code
GML:
draw_primitive_begin(<soort primitieve>);
Hiermee geef je dus aan Game Maker door dat jij primitieven wil gaan tekenen. <soort primitieve> kan een van de volgende constanten zijn:
  • pr_pointlist hiermee teken je afzonderlijke punten
  • pr_linelist hiermee teken je afzonderlijke lijnen
  • pr_linestrip hiermee teken je lijnen die aan elkaar zijn verbonden
  • pr_trianglelist hiermee teken je afzonderlijke driehoeken
  • pr_trianglefan hiermee teken je driehoeken die aan elkaar zijn verbonden
  • pr_trianglestrip hiermee teken je ook driehoeken die aan elkaar zijn verbonden
Hoe het met pr_trianglefan en pr_trianglestrip zit, vertel ik verderop, nadat je weet wat vertices zijn.
Het is belangrijk dat je Game Maker ook doorgeeft dat je klaar bent met het tekenen van je primitieven, zodat die het op het scherm tekent. Dit doe je met de functie:
GML:
draw_primitive_end();

Nu je weet hoe je de primitieven kan starten en stoppen, is het tijd voor het echte werk: het tekenen van punten, lijnen en driehoeken met vertices. Maar voordat we overgaan tot gml, moet je eerst weten wat een vertex is.
Een vertex kan je je voorstellen als een pixel op je scherm. Deze heeft een x- en een y-co÷rdinaat. In de modus pr_pointlist wordt er een puntje op het scherm getekend op die plek. Als je dan nog een vertex tekent, zal dit ook een puntje op het scherm worden. Maar als je bijvoorbeeld pr_linelist gebruikt, worden deze twee vertices met elkaar verbonden door een lijn. Als je dan nog twee vertices tekent, krijg je weer een nieuwe lijn. Maar als je dan pr_linestrip gebruikt, wordt er een lijn getrokken van vertex 1 naar vertex 2, van vertex 2 naar vertex 3 en van vertex 3 naar vertex 4. Zo krijg je dus drie lijnen die allemaal aan elkaar zitten.
Hier is een voorbeeld om te laten zien wat de verschillende modi doen:

Zoals je kunt zien is er iets vreemds met pr_trianglefan en pr_trianglestrip. Beide verbinden de driehoeken aan elkaar, maar op een andere manier.
pr_trianglefan verbindt de 1e vertex met de 2e en de 3e, maar als je een 4e vertex tekent, wordt er een driehoek gemaakt tussen de 1e, 3e en 4e vertex.
De modus pr_trianglefan verbindt de laatste vertex met de vorige en de 1e.
De modus pr_trianglestrip verbindt de laatste vertex met de vorige en die daarvoor.

Nu je (redelijk) snapt wat een vertex is en wat je ermee kunt, is hier de functie om hem te tekenen:
GML:
draw_vertex(x, y);

Je kunt nu opdracht 1 en 2 maken.

In de gevorderde opdracht stond dat je groene kogels moest maken, maar ik heb nog niets gezegd over het kleuren van primitieven. De primitieven hebben namelijk (net als draw_text() of draw_line()) de kleur die je opgeeft met draw_set_color().
Als je de basis onder de knie hebt, kunnen we verder met:

Gekleurde primitieven

Zoals bovengenoemd, kan je een hele primitieve een bepaalde kleur geven met draw_set_color(). Maar wat als je nou verschillende kleuren wil gebruiken of overvloeiende kleuren?
Hiervoor is de functie
GML:
draw_vertex_color(x, y, kleur, transparantie);
Hiermee teken je zoals gewoonlijk een vertex, maar nu met een eigen kleur en zelfs een eigen transparantie. Wanneer je lijnen of driehoeken met verschillende kleuren tekent, krijg je mooie overgangseffecten, zoals deze:

De eerste vertex is rood en niet transparant, de 2e is blauw en niet transparant en de derde is groen en volledig transparant. Tussen de rode en blauwe vertex zie je dat het overvloeit via paars.

Je kunt nu opdracht 3 en 4 maken.


Primitieven met een textuur

Nu komt het: je eigen sprites en achtergronden met vertices tekenen.
Allereerst moeten we de volgende functies doornemen:
GML:
   sprite_get_texture(sprite, subimage);
background_get_texture(achtergrond);
Hiermee vraag je op wat het id-nummer van een subimage van een sprite of een achtergrond is. Dit nummer is vaak anders dan het id van de sprite of achtergrond, dus moet je eerst de textuur opvragen.

Met het textuur-id van je plaatje, moet je de primitieven op een andere manier beginnen, wil je hem kunnen gebruiken. De functie hiervoor is:
GML:
draw_primitive_begin_texture(<soort primitieve>, <textuur-id>);
Velen vinden het handig om de textuur-id in het create-event op te slaan in een variabele, anderen vragen de textuur-id op bij het starten van de primitieven:
GML:
//Methode 1:
textuur = sprite_get_texture(spr_mijn_sprite, 0); //evt. in het create-event
draw_primitive_begin_texture(pr_iets, textuur);

//Methode 2:
draw_primitive_begin_texture(pr_iets, sprite_get_texture(spr_mijn_sprite,0));

Nu kan je de volgende functies gebruiken:
GML:
draw_vertex_texture      (x, y, xtex, ytex);
draw_vertex_texture_color(x, y, xtex, ytex, kleur, transparantie);
Bijna alle argumenten zullen je bekend voorkomen, op xtex en ytex na.
xtex en ytex geven aan wat de zgn. textuurco÷rdinaten zijn. Elk plaatje heeft namelijk een breedte en een hoogte. Laten we stellen dat aan de linkerkant xtex=0 en aan de rechterkant xtex=1. Hetzelfde geldt voor ytex, die aan de bovenkant 0 is, en aan de onderkant 1. Alle waarden hiertussen liggen dus op de textuur:

Met deze textuur heb ik een driehoek getekend, waarvan de bovenste vertex de textuurco÷rdinaat (0.5 , 0) heeft, de linker vertex de co÷rdinaat (0 , 0.5) heeft en de laatste vertex de co÷rdinaat (0.5 , 0.5) heeft:

Het resultaat is dat je een stukje van de sprite ziet: dat wat tussen de textuurco÷rdinaten ligt. Hier kan je goed zien welk stuk er is getekend:

Het mooie van primitieven met texturen, is dat je de textuurco÷rdinaten hetzelfde kan laten terwijl je de vertexco÷rdinaten verandert. Hierdoor kan je plaatjes oprekken, draaien en op allerlei andere manieren vervormen.

Waarschijnlijk gaat het niet helemaal goed wanneer je voor de eerste keer begint met deze modus. Het kan zijn dat je een transparant stuk rechts en onder je sprite hebt. Dit komt doordat Game Maker van texturen verwacht dat ze vierkant zijn en dat de grootte een macht van 2 is (dus 32, 64, 128 etc.). De simpelste manier om dit op te lossen, is door je sprites op te rekken. Maar ja, dan krijg je lelijke effecten.
Een andere methode maakt gebruik van deze twee functies:
GML:
texture_get_width (textuur);
texture_get_height(textuur);
Deze functies geven aan wat het gebruikte deel van de textuur is (dus niet het transparante deel ernaast en eronder). Als je nu alle textuurco÷rdinaten hiermee vermenigvuldigt, tekent Game Maker het goed.
Hier een voorbeeldje om de hele sprite te tekenen (op een vlak van 100 bij 100):
GML:
var textuur, W, H;
textuur = sprite_get_texture(spr_mijn_sprite, 0);
W = texture_get_width (textuur);
H = texture_get_height(textuur);

draw_primitive_begin_texture(pr_trianglestrip, textuur);
draw_vertex_texture(  0,   0, 0*W, 0*H); //of 0, 0
draw_vertex_texture(100,   0, 1*W, 0*H); //   W, 0
draw_vertex_texture(  0, 100, 0*W, 1*H); //   0, H
draw_vertex_texture(100, 100, 1*W, 1*H); //   W, H
draw_primitive_end();
draw_vertex_texture_color() is in principe een combinatie van draw_vertex_color() en draw_vertex_texture(), dus hierover hoef ik niets te vertellen.
Als je denkt het te snappen, is hier de laatste opdracht voor je:

Je kunt nu opdracht 5 maken.


Het einde

Zo, nu ben je bijna volleerd over primitieven. Alleen blijft er nog een ding over: herhaling in een textuur. Je hebt vast wel eens een achtergrond getiled in je kamer gezet, zodat het herhaald wordt van boven naar beneden en van links naar rechts. Nu denk je vast: "wat heeft dit er nou mee te maken?". Nou, veel.
Met de functie
GML:
texture_set_repeat(aan);
kan je de textuurco÷rdinaten groter dan 1 maken, waardoor de textuur wordt herhaald. Hiermee kan je bijvoorbeeld leuke effecten maken voor een achtergrond, zoals een watereffect.
Let wel op dat de herhaling uit wordt gezet zodra je een sprite, achtergrond of tekst tekent.

Updates
 2008-03-23:
Opdrachten in een pakket gezet en nieuwe opdracht toegevoegd. Ook staat er wat meer uitleg bij de opdrachten.
  2008-03-24:
Naast de .gm6 nu ook .gmk geŘploaded.
  2009-04-19:
Matrebatre heeft voor mij een stukje code aangepast (anders was 't nooit gebeurd Tong)
  2011-07-11:
Kleine toevoeging over textuurherhaling.
  2019-06-02:
Links aangepast zodat de plaatjes het weer doen.

« Laatste verandering: 2 Juni 2019, 13:40:32 door Flumble »
Naar boven Gelogd

Jan123
Gebruiker

Offline Offline

Berichten: 131


« Antwoord #1 Gepost op: 11 Augustus 2011, 12:26:08 »

Dus als je texture_set_repeat(true) en textuurco÷rdinaten groter dan 1 gebruikt, bewegen ze dan automatisch, of moet je nog wat extra's doen?


I am a in the GM Quiz!

Probeer C++ te leren...
Naar boven Gelogd

ericlegomeer
Forumbeheerder


Offline Offline

Berichten: 9222

http://xkcd.com/386/


« Antwoord #2 Gepost op: 11 Augustus 2011, 12:42:23 »

Nouja je moet texture_set_repeat aanzetten en verder textuurco÷rdinaten gebruiken welke groter dan 1 zijn. Even een voorbeeldje geŘpload: Download texturerepeat.gmk. Lijkt me dat het daarmee wel duidelijk wordt. Want er is dus niet meer nodig dan wat je al aangeeft, misschien had je ergens een klein foutje gemaakt Gemoedelijk


Naar boven Gelogd

Jan123
Gebruiker

Offline Offline

Berichten: 131


« Antwoord #3 Gepost op: 11 Augustus 2011, 21:07:45 »

In jouw exa heb ik een variabele xx, met waarde 0 aangemaakt. In het step event heb ik:
GML:
xx+=0.01;

Ik heb ook de xtex van de draw_vertex_texture functies vervangen door xx. Zo krijg ik een texture(1024x1024) die van rechts naar links beweegt. Dit is wat ik wilde en werkt allemaal goed. Maar ik krijg nu om de paar seconden een soort schokgolf door mijn texture! Weet je wat er fout is? (ik heb behalve de xx variabele en de x en y co÷rdinaten van de vertexen niks veranderd)


I am a in the GM Quiz!

Probeer C++ te leren...
Naar boven Gelogd

Flumble
Gebruiker


Offline Offline

Berichten: 2018


« Antwoord #4 Gepost op: 11 Augustus 2011, 22:34:45 »

Dit kan komen door:
a. het tekenen van andere vormen zonder weer texture_set_repeat aan te roepen (zie de toevoeging die ik zonet heb gemaakt in de tutorial)
b. dat je ergens xx mod een getal doet
c. dat je ergens anders iets raars doet met xx
d. dat de interne variabele voor de textuurco÷rdinaat buiten zijn bereik komt of anderzijds een bug in GM of dat je computer het niet snapt, maar heel waarschijnlijk is het a, b of c.

Als dit niet werkt, dan denk ik dat het beter is een nieuw topic te maken/deze reacties te verplaatsen, want dan ligt het probleem iets minder voor de hand.

Naar boven Gelogd

Laloeka
Gebruiker


Offline Offline

Berichten: 2551


WWW
« Antwoord #5 Gepost op: 5 Februari 2012, 01:31:30 »

Handige informatie voor grote primitives:

Een primitive in GameMaker ondersteund maximaal 1000 vertexes (ook in D3D).
Wil je daarna verder tekenen zul je dus een nieuwe primitive moeten tekenen.



-------
Naar boven Gelogd

Martin Beentjes
Gebruiker


Offline Offline

Berichten: 2332

Gelieve quotes gebruiken bij PB's.


« Antwoord #6 Gepost op: 27 Maart 2012, 16:42:16 »

Handige tutorial, alleen de link van de .zip is gebroken.

Verder legt het goed de basis uit van primitieven.

Edit: ik zag even de afbeelding verkeerd, excuus!

« Laatste verandering: 27 Maart 2012, 19:11:30 door mbeentjes »
Naar boven Gelogd

StefanJanssen
Gebruiker


Offline Offline

Berichten: 5211

Was StefannafetS


WWW
« Antwoord #7 Gepost op: 27 Maart 2012, 17:42:51 »

Handige tutorial, alleen de link van de .zip is gebroken.

Verder legt het goed de basis uit van primitieven.
hier doet hij het gewoon


Begrijp je iets niet in een uitleg van een gebruiker? Bekijk eerst de helpfile voor je iets vraagt
Naar boven Gelogd

Erik Leppen
Forumbeheerder


Offline Offline

Berichten: 9655


WWW
« Antwoord #8 Gepost op: 27 Maart 2012, 19:08:37 »

Een primitive in GameMaker ondersteund maximaal 1000 vertexes.
32000. Dat is een tijd terug aangepast.


Naar boven Gelogd

Flumble
Gebruiker


Offline Offline

Berichten: 2018


« Antwoord #9 Gepost op: 27 Maart 2012, 20:06:24 »

32000. Dat is een tijd terug aangepast.
Sinds GM8.1 neem ik aan? Hier in GM8.0 kom ik niet verder dan 1000.

Naar boven Gelogd

Erik Leppen
Forumbeheerder


Offline Offline

Berichten: 9655


WWW
« Antwoord #10 Gepost op: 27 Maart 2012, 21:08:29 »

Als het in 8.0 1000 was dan moet de wijziging in 8.1 zijn geweest. Dacht dat het langer geleden was, maar blijkbaar niet. Gemoedelijk


Naar boven Gelogd

Advertenties
« vorige volgende »
Pagina's: [1]
Print


Topic Informatie
0 geregistreerde leden en 1 gast bekijken dit topic.

Ga naar:  

Powered by SMF 1.1.21 | SMF © 2006-2007, Simple Machines
www.game-maker.nl © 2003-2019 Nederlandse Game Maker Community