Paden (paths)
In geavanceerdere spellen wil je dat instanties bepaalde routes afleggen in de rooms. Hoewel je dit kunt bewerkstelligen door gebruik te maken van bijvoorbeeld timer events of scriptcode, blijft het toch een tamelijk ingewikkelde aangelegenheid. Het gebruik van path resources maakt het echter een stuk eenvoudiger. Het idee is tamelijk simpel. Je definieert een path door het gewoon te tekenen. Vervolgens plaats je een actie in de creation event van het object die het object vertelt die bepaalde route te volgen. In dit hoofdstuk wordt dat in detail uitgelegd.
Het definiëren van paden
Om een pad aan je spel toe te voegen moet je kiezen voor de optie Add Path uit het Addmenu. Het volgende venster verschijnt dan op je scherm (in dit geval hebben we al een klein pad getekend).
Links boven in het scherm kun je, zoals gebruikelijk, de padnaam opgeven. Daaronder staan de punten waarmee je het pad kunt definiëren. Elk punt heeft zowel een positie als een snelheid (aangegeven met sp). Afhankelijk van hoe je het pad in het spel gebruikt kan de positie absoluut zijn, dat betekent dat de instantie waarvoor dit pad bedoeld is later exact op die plaats in de room zijn weg vervolgt, of relatief, hetgeen betekent dat een instantie altijd aan het begin van het pad begint en daarna zijn weg vervolgt. De snelheid moet als volgt worden opgevat. Als een instantie het pad volgt is de standaard snelheid 100. Een lagere waarde betekent een vermindering van zijn snelheid terwijl een hogere waarde leidt tot een toename van de standaard snelheid. (Dus het geeft een procentuele waarde aan van de feitelijke snelheid.) Snelheid zal worden geïnterpoleerd tussen de verschillende punten waardoor de snelheid gelijkmatig verandert.
Om een punt aan het pad toe te voegen moet je klikken op de knop Add. Er wordt dan een kopie gemaakt van het geselecteerde punt. Nu kun je de feitelijke positie en snelheid wijzigen door de waarden in de daarvvor bestemde invoervelden te veranderen. Elke keer als je een punt in de lijst selecteert kun je de waarden ervan wijzigen. Klik op Insert om een nieuw punt vóór het huidige punt in te voegen. en klik op Deleteom het huidige punt te verwijderen.
Aan de rechterkant van het venster zie je het feitelijke pad. De rode stip geeft het geselecteerde controlepunt aan. De blauwe stippen geeven de andere controlepunten aan. Het groene vlak geeft het startpunt van het pad aan. Je kunt het pad ook wijzigen door gebruik te maken van de muis. Klik waar dan ook met de linkermuisknop op de afbeelding om een punt toe te voegen. Klik op een bestaand punt, houd de linkermuisknop ingedrukt en sleep het punt waarheen je wil. Daardoor zal het pad verander worden. Als je de <Shift> toets ingedrukt houdt terwijl je op een punt klikt, voeg je een extra punt toe. Tenslotte kun je met de rechtermuisknop punten uit het pad verwijderen door erop te klikken. (houd er wel rekening mee dat je op deze manier niet de snelheid kunt wijzigen.) Normaliter worden de punten op de hoekpunten van de grid weergegeven. Je kunt de gridinstellingen veranderen met behulp van de werkbalk aan de bovenkant. Daar kun je ook aangeven of de grid wel of niet zichtbaar moet zijn. Als je een punt precies wilt positioneren moet je de <Alt> toets ingedrukt houden als je een punt toevoegt of van plaats verandert.
Je kunt de vorm van het pad op twee manieren beïnvloeden. Allereerst kun je het type verbinding gebruiken. Daarbij heb je de keuze uit rechtlijnige verbindingen of vloeiende lijnen. Daarnaast kun je aangeven of het pad gesloten moet zijn of niet.
Op de werkbalk vind je een aantal belangrijke controls. Van links naar rechts hebben ze de volgende betekenis. De eerste knop geeft aan dat je klaar bent en het venster wilt sluiten waarbij de wijzigingen worden opgeslagen. (Als je de wijzigingen niet wilt opslaan moet je op het kruisje rechtsboven in het venster klikken, waardoor het venster sluit zonder opslag van de wijzigingen.) Daarnaast bevindt zich de knop waarmee je de laatste wijziging ongedaan kunt maken.
Het volgende stel knoppen stelt je in staat om het pad te wissen, om de volgorde waarin het pad wordt afgelopen om te draaien, het pad te verplaatsen, het pad horizontaal te spiegelen, het pad verticaal om te draaien, het pad te draaien onder een bepaalde hoek en om het te vergroten of te verkleinen. Daarnaast zijn er knoppen om de view te verplaatsen (niet het pad zelf; het feiteljke viewgebied wordt aangegeven beneden in de statusbalk) en om de view te centreren.
Zoals al eerder boven is aangegeven kun je de waarden aangeven waar de punten moeten komen en of de grid zichtbaar moet zijn. Tenslotte is er een knop die je in staat stelt om een speciale room als achtergrond te laten zien voor het pad. Door hiervan gebruik te maken kun je eenvoudig het pad op een bepaalde plaats in de room plaatsen, bijvoorbeeld op een racecircuit, waardoor later de instanties de juiste route kunnen volgen. (dit heeft alleen maar zin als je gebruik maakt van absolute paden; zie onder.)
Het toekennen van paden aan objecten
Om een pad toe te kennen aan een instantie van een object, kun je de path actie in enig event plaatsen, bijvoorbeeld in de creation event. In deze actie moet je het pad specificeren uit het drop down menu. Daar kun je ook nog enkele andere waarden aangeven.
Je moet het pad aangeven dat gevolgd dient te worden en de snelheid in pixels per step. Als de snelheid een positieve waarde heeft, start de instantie aan het begin van het pad. Als de waarde negatief is, start de instantie aan het eind. Wees je er wel van bewust dat toen je het pad definieerde je de feitelijke snelheid relatief specificeerde aan deze opgegeven snelheid. Er bestaat ook een action om de snelheid waarmee het pad wordt afgelopen kan worden gewijzigd. Je kunt dit bijvoorbeeld gebruiken om een instantie sneller of langzamer te laten lopen op het pad. Merk daarbij op dat dan de normale snelheid van de instantie wordt ontkent (in feite zet je die op 0) als het pad wordt uitgevoerd. Zaken als wrijving en zwaartekracht hebben ook geen invloed op de beweging van een instantie als die zich beweegt op zijn pad.
Vervolgens moet je het gedrag van de instantie aan het eind van het pad aangeven, met andere woorden, wat moet er precies gebeuren als het eind van het pad bereikt is? Je kunt ervoor kiezen om de beweging op het eind van het pad te stoppen. Je kunt er ook voor kiezen om het pad opnieuw te laten aflopen, hetgeen betekent dat de instantie terugspringt naar de beginpositie van het pad en opnieuw zijn weg vervolgt. Een derde optie is het pad vanaf deze positie opnieuw te doorlopen, waarbij het eindpunt van de voorige doorloop het beginpunt is van de nieuwe doorloop van het pad (dat is hetzelfde als het pad gesloten is). Tenslotte kun je ervoor kiezen om de beweging om te draaien en het pad in omgekeerde volgorde te laten aflopen. Houd er rekening mee dat aan het eind van een pad een event optreedt; zie onder.
Tenslotte kun je aangeven of het pad absoluut of relatief moet zijn. een absoluut pad wordt uitgevoerd op de plek waar het is gedefinieerd. De instantie wordt op het beginpunt geplaatst en vervolgt zijn weg naar het eindpunt (bij een positieve snelheid). Dit is bijvoorbeeld nuttig als je een bepaald racecircuit hebt waarop je een pad hebt gemaakt. Wanneer je kiest voor en relatief pad zal een instantie vanaf zijn huidige positie het pad volgen. Dit is nuttig wanneer een instantie een beweging ter plekke moet maken. Bijvoorbeeld, ruimteschepen in het space invader spel kunnen een bepaalde draaibeweging maken op hun huidige positie om bijvoorbeeld vijanden te kunnen ontwijken.
Als je een instantie op een andere plek op het pad wilt neerzetten kun je gebruik maken van actie om de path position in te stellen. Een path position ligt altijd tussen 0 en 1, waarbij 0 betekent op de startpositie en de 1 de eindpositie van het pad. Merk op dat in elke stap de richtingsvariabele automatisch wordt aangepast aan de positie waarop de instantie zich bevindt op het pad. Je kunt deze variabele gebruiken om de correcte oriëntatie van de sprite te kiezen.
Als je scripts of kleine stukjes code gebruikt heb je meer controle over de manier waarop het pad wordt uitgevoerd. Er bestaat een functie om het pad van een instantie te starten. De variabele path_position geeft de huidige positie aan op het pad (tussen 0 en 1, zoals boven is vermeld). De variabele path_speed geeft de snelheid langs het pad weer. Een variabele path_scale kun je gebruiken om de grootte van het pad te bepalen. De waarde 1 betreft de oorspronkelijke grootte. Een grotere waarde betekent dat het pad is vergroot; een kleinere waarde maakt het kleiner. De variabele path_orientationgeeft de richting aan waarin het pad dient te worden uitgevoerd (in graden tegen de wijzers van de klok in). Dit stelt je in staat om het pad in verschillende richtingen uit te voeren (bijvoorbeeld van onder naar boven of van links naar rechts). Er is ook een variabele die het eingedrag controleert. Tenslotte zijn er een groot aantal functies die vragen naar eigenschappen van het pad (bijvoorbeeld de x- en y-coördinaten van bepaalde posities) en er bestaan functies om paden te maken. Er bestaan zelfs functies om botsingsvrije paden te maken voor een instantie om een bepaald doel te bereiken. Voor details moet je kijken in deel 4 waarin de taal GML uitvoerig aan bod komt.
Je zult je wel afvragen wat er gebeurt als een instantie botst tegen een andere instantie terwijl hij zijn pad bewandelt. In feite gebeurt hetzelfde als had die instantie een normale snelheid. Als het om een solid object gaat zal dit worden teruggeplaatst. Als beide instanties niet solid zijn zullen ze op hun nieuwe posities worden geplaatst. Vervolgens worden de collision event(s) uitgevoerd en wordt er nagegaan of de botsing is opgelost. Zo niet en de andere instantie is solid, dan zal de instantie stoppen, zoals het hoort (aannemende dat er een collision event gedefinieerd is). Bovendien wordt de path_position variabele niet opgehoogd. Als de instantie die de weg had geblokkerd verdwene is, zal de instantie zijn weg op het pad weer vervolgen. Om zelf collisions te kunnen afhandelen kan de variabele path_positionprevioushandig zijn. Het onthoudt de vorige positie in het pad en je kunt de padpositie instellen met behulp van deze variabele om te voorkomen dat je zomaar verder gaat op het pad.
The path event
Zoals al boven is beschreven kun je aangeven wat er moet gebeuren als een instantie aan het eind van het pad is gekomen. Op dat moment treedt er een End of Path event op. Die kun je vinden in de tab Other events. Hier kun je acties in plaatsen. Je wilt bijvoorbeeld aan het eind de instantie laten verdwijnen of juist die instantie aan een nieuw (ander) pad laten beginnen.