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

Beweging plannen

Beweging plannen helpt je om instanties van een gegeven locatie naar een andere locatie te verplaatsen, ondertussen botsingen vermijdend met andere instanties (bijv. muren). Beweging plannen is een moeilijk probleem. Het is onmogelijk om algemene functies te geven die goed werken in alle situaties. Ook is het uitrekenen van botsingvrije bewegingen een tijdvretende operatie. Dus je moet voorzichtig zijn hoe en wanneer je het toepast. Houd deze opmerkingen in je achterhoofd wanneer je een van de volgende functies gebruikt.

Game Maker maakt verschillende soorten van beweging plannen mogelijk. De eenvoudigste manier laat elke instantie een stap zetten naar een bepaalde doel- positie, proberend rechtdoor te gaan als het mogelijk is, maar een andere richting te nemen als dat nodig is. Deze functies moeten worden gebruikt in het step-event van een instantie. Zij komen overeen met de beweging plannende acties die ook beschikbaar zijn:

mp_linear_step(x, y, stepsize, checkall) Deze functie laat de instantie een stap nemen recht naar de opgegeven positie (x,y). De grootte van de stap wordt aangegeven door stepsize. Als checkall 'true' is zal de instantie stoppen als het een andere instantie raakt. Als dit 'false' is stopt het alleen als het een solid instantie raakt. Merk op dat deze functie niet probeert een obstakel te ontwijken of er omheen gaat. In dat geval faalt het. De functie geeft terug of de doelpositie is bereikt.
mp_linear_step_object(x, y, stepsize, obj) Hetzelfde als de functie hier boven maar deze keer worden alleen instanties van obj aangemerkt als obstakel. obj kan een object zijn of een instantie id.
mp_potential_step(x, y, stepsize, checkall) Als de vorige functie, laat deze functie de instantie een stap voorwaarts nemen naar een bepaalde positie. Maar in dit geval probeert het obstakels te vermijden. Als de instantie in een solid instantie zal bewegen (of elke instantie als checkall 'true' is) zal de richting worden gewijzigd om de instantie te ontwijken en er omheen te bewegen. De zoektocht werk niet gegarandeerd met in de meeste eenvoudige gevallen zal het effectief naar het doel bewegen. De functie geeft terug of het doel is bereikt.
mp_potential_step_object(x, y, stepsize, obj) Hetzelfde als de functie hierboven maar deze keer worden alleen instanties van obj aangemerkt als obstakels. obj kan een object zijn of een instantie id.
mp_potential_settings(maxrot, rotstep, ahead, onspot) De vorige functie werkt met een aantal parameters die met deze functie kunnen worden gewijzigd. Globaal werkt de methode als volgt. Eerst wordt er geprobeerd recht naar het doel te bewegen. Het kijkt een aantal stappen vooruit die kunnen worden ingesteld met ahead (standaard 3). Verlaging van deze waarde betekend dat de instantie later zal starten met het wijzigen van de richting. Verhoging betekend dat de richting eerder zal worden gewijzigd. Als deze controle leidt tot een botsing wordt er gestart met het kijken naar links en naar rechts voor de beste richting. Het doet dit in stappen met de grootte rotstep (standaard 10). Verlaging geeft meer mogelijkheden maar is langzamer. De parameter maxrot is iets moeilijker uit te leggen. De instantie heeft een huidige richting. maxrot (standaard 30) geeft aan hoe groot de wijziging van de huidige richting mag zijn. Dus ook al kan het rechtstreeks naar het doel maar met een grote richtingsverandering zal het dus niet maxrot overschrijden. Als je maxrot groot maakt kan de instantie makkelijker het doel bereiken. Als je de waarde kleiner maakt wordt het pad vloeiender maar zou het langer kunnen duren voor het doel is bereikt (of zelfs zou kunnen mislukken). Als er geen stap kan worden gemaakt zal het gedrag afhankelijk zijn van de waarde van parameter onspot. Als onspot is 'true' (de standaard waarde), zal de instantie draaien naar zijn doel met de waarde aangegeven door maxrot. Als dit 'false' is zal het helemaal niet verplaatsen. Op 'false' zetten is bruikbaar voor bijv. auto's maar verminderd de mogelijkheid om een pad te vinden.

Merk op dat de mogelijke nadering slechts plaatselijke informatie gebruikt. Dus het zal alleen een pad vinden als deze plaatselijke informatie voldoende is om de goede richting te bepalen. Het zal bijvoorbeeld (over het algemeen) mislukken om een pad te vinden door een doolhof.

De tweede soort functies rekent een botsingvrij pad uit voor de instantie. Als dit pad is berekend kun je deze toewijzen aan de instantie als route om naar het doel te bewegen. De berekening van het pad zal wat tijd nemen maar na dit zal de uitvoering van het pad snel zijn. Natuurlijk is dit alleen geldig als de situatie ondertussen onveranderd blijft. Als bijvoorbeeld obstakels veranderen moet je misschien het pad opnieuw berekenen. Merk opnieuw op dat deze functies kunnen mislukken. Deze functies zijn alleen beschikbaar in de geregistreerde versie van Game Maker.

De eerste twee functies gebruiken de lineaire beweging en mogelijke veld doelen wat ook wordt gebruikt in de step functies.

mp_linear_path(path, xg, yg, stepsize, checkall) Deze functie berekend een rechtlijnig pad voor de instantie vanaf zijn huidige positie naar de positie (xg,yg) gebruik makend van de opgegeven stap grootte. Het gebruikt stappen als in de functie mp_linear_step(). Het opgegeven pad moet al bestaan en zal worden overgeschreven door het nieuwe pad. (Zie een later hoofdstuk hoe paden te maken en te verwijderen.) De functie zal teruggeven of een pad is gevonden. De functie zal stoppen en mislukking rapporteren als er geen rechtstreeks pad bestaat tussen start en doel. Als het mislukt wordt er toch een pad gemaakt dat loopt tot de positie waar de instantie is geblokkeerd.
mp_linear_path_object(path, xg, yg, stepsize, obj) Zelfde als de functie hierboven maar deze keer worden alleen instanties van obj aangemerkt als obstakels. obj kan een object of een instantie id zijn.
mp_potential_path(path, xg, yg, stepsize, factor, checkall) Deze functie berekend een pad voor de instantie vanaf zijn huidige positie en richting naar de positie (xg,yg) gebruikt maken van de opgegeven stapgrootte proberend botsing met obstakels te vermijden. Het gebruikt mogelijke veldstappen, als in de functie mp_potential_step() en ook de parameters die kunnen worden ingesteld met mp_potential_settings(). Het opgegeven pad moet al bestaan en zal worden overgeschreven door het nieuwe pad. (Zie een later hoofdstuk hoe paden te maken en te verwijderen.) De functie zal teruggegeven of een pad is gevonden. Om te voorkomen dat de functie continu door zal rekenen moet factor groter zijn dan 1. De functie zal stoppen en mislukking rapporteren als het niet een pad kan vinden dat korter is dan de afstand tussen start en doel vermenigvuldigd met factor. Een factor van 4 is normaal goed genoeg maar als je grote omwegen verwacht is het beter factor groter te maken. Als het mislukt wordt het pad toch gemaakt in de richting van het doel maar zal deze niet bereiken.
mp_potential_path_object(path, xg, yg, stepsize, factor, obj) Hetzelfde als de functie hierboven maar deze keer worden allen instanties van obj aangemerkt als obstakels. obj kan een object zijn of een instantie id.

De andere functies gebruiken een veel complexer mechanisme gebruik makend van een op een grid (tabel of raster) gebaseerde benadering (ook wel A* algoritme genoemd). Het zal succesvoller zijn in het vinden van paden (hoewel het ook kan mislukken) en zal kortere paden vinden maar het vergt meer werk van jouw kant. Het globale idee is als volgt. Eerst maken we een grid op (het relevante deel van) de room. Je kunt er voor kiezen om een fijn grid (wat langzamer is) of een grof grid te gebruiken. Daarna wordt voor alle relevante object besloten welke cellen zij raken (gebruik makend van de botsingrechthoek of precieze controle). Deze cellen worden dan gemerkt als verboden. Dus een cel zal in zijn geheel verboden zijn, ook al wordt het slechts voor een klein gedeelte geraakt door een obstakel. Ten slotte specificeren we een start en een doel positie (die in vrije cellen moeten liggen) en de functie berekend het kortste pad (of bijna het kortste) tussen deze punten. Het pad zal door het midden van de cellen lopen. Als de cellen zo groot zijn dat de instantie geplaatst in het midden van een cel niet erbuiten steekt zal het succesvol zijn. Dit pad kun je nu aan een instantie geven als pad om te volgen.

De op grid gebaseerde benadering is zeer krachtig (is wordt gebruikt in veel professionele spellen) maar het verlangt van jou dat je zorgvuldig nadenkt. Je moet beslissen welk gebied en welke grootte goed genoeg zijn om het spel op te lossen. Ook moet je beslissen welke objecten moeten worden ontweken en of precieze controle belangrijk is. Al deze parameters beïnvloeden de efficiëntie van de benadering enorm.

Vooral de grootte van de cellen is cruciaal. Onthoud dat de cellen zo groot moeten zijn dat het bewegend object (geplaatst met zijn oorsprong in het midden van een cel) er niet buiten steekt. (Wees voorzichtig met de positie van de oorsprong van het object. Realiseer je ook dat je het pad kunt schuiven als de oorsprong van het object niet in het midden ligt!) Van de andere kant, hoe kleiner de cellen hoe meer mogelijke paden er ontstaan. Als je Cellen te groot maakt, zullen eventuele openingen tussen obstakels worden gesloten omdat alle cellen een obstakel hebben.

De actuele functies voor de grid gebaseerde benadering zijn als volgt:

mp_grid_create(left, top, hcells, vcells, cellwidth, cellheight) Deze functie maakt een grid. Het geeft een index terug die moet worden gebruikt in alle andere oproepen. Je kunt meerdere grids maken en beheren op hetzelfde moment. left en top gegeven de positie van de linker bovenhoek van de grid aan. hcells en vcells geven het aantal horizontale en verticale cellen aan. cellwidth en cellheight tenslotte geven de grootte van de cellen aan.
mp_grid_destroy(id) Vernietigd de aangegeven grid en haalt het uit het geheugen. Vergeet deze niet uit te voeren als je de grid niet meer gebruikt.
mp_grid_clear_all(id) Markeert alle cellen in de grid als vrij.
mp_grid_clear_cell(id, h, v) Zuivert de aangegeven cell. Cell 0,0 is de cell links boven.
mp_grid_clear_rectangle(id, left, top, right, bottom) Zuivert alle cellen die de aangegeven rechthoek raken (in room coördinaten).
mp_grid_add_cell(id, h, v) Markeert de aangegeven cell als verboden. Cell 0,0 is de cell links boven.
mp_grid_add_rectangle(id, left, top, right, bottom) Markeert alle cellen die de aangegeven rechthoek raken als verboden.
mp_grid_add_instances(id, obj, prec) Markeert alle cellen die een instantie van het obj raken als verboden. Je kunt ook een enkele instantie gebruiken door de instantie id op te geven. Ook kun je het sleutelwoord all gebruiken om alle instanties van alle objecten aan te geven. prec betekend of precieze botsingcontrole moet worden gebruikt (werkt alleen als precieze controle aan is gezet voor de sprite van de instantie).
mp_grid_path(id, path, xstart, ystart, xgoal, ygoal, allowdiag) Berekend een pad door de grid. path moet een bestaand pad zijn dat zal worden vervangen door het berekend pad. xstart en ystart geven de start van het pad en xgoal en ygoal het doel aan. allowdiag geeft aan of diagonale bewegingen zijn toegestaan of alleen horizontale en verticale. De functie geeft terug of het succesvol een pad heeft gevonden. (Merk op dat het pad onafhankelijk is van de huidige instantie; Het is een pad door de grid, niet een pad voor een specifieke instantie.)
mp_grid_draw(id) Deze functie tekent de grid met groene cellen voor lege en rode cellen voor verboden cellen. Deze functie is langzaam en alleen geleverd als 'debug' hulpmiddel.

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