GameMaker 5.1 Een handleiding voor leerlingen in het middelbaar onderwijs.
GameMaker is een visuele programmeeromgeving voor het maken van (relatief) eenvoudige 2D-platformspellen. Het programma is geschreven door Professor Mark Overmars. (Niet te verwarren met de voetballer, is geen familie.) Mark Overmars werkt aan de Universiteit van Utrecht en leidt daar de afdeling Informatie en Computerwetenschappen. Voor meer informatie en downloads kun je terecht op www.gamemaker.nl Daar vind je ook uitgebreidere handleidingen. De nieuwste voor versie 5.1 is echter heel groot en Engelstalig. In deze handleiding is het geenszins mijn bedoeling een spetterend of boeiend spel te ontwerpen. Dat laat ik graag aan jullie over. Ieder level is slechts bedoeld als voorbeeld. In ieder level laat ik je kennis maken met een ander aspect. Het is juist de goede combinatie van allerlei handelingen die het spel leuk maken. Het voorbeeldspel is te downloaden van de informatica-site. www.fonsvitae-informatica.nl Je kunt daar naar believen allerlei dingen veranderen zodat je het programma en de structuren een beetje onder de knie krijgt.
Gamemaker is een redelijk gebruiksvriendelijk programma. Dat wil zeggen als je eenmaal weet hoe het allemaal werkt is het programma eenvoudig te bedienen. Maar ja, dat is natuurlijk met de meeste programma’s het geval. Op zich is het maken van een spel dan ook niet zo heel erg moeilijk. De moeilijkheid zit ‘m in het bedenken van een aardig spel en dan met name het verloop van het spel. Over iedere stap in het spel moet heel goed worden nagedacht. Hoewel je zelf nauwelijks hoeft te programmeren (het programma genereert de meeste code) moet je wel op de hoogte zijn van bepaalde constructies en de logica daarvan. ALS er dit gebeurt DAN moet de volgende gebeurtenis zus en ANDERS zo en als dat gebeurt is dan moet ….. Enfin, ga zo maar door. Denk aan de IF, THEN, ELSE functies bij het maken van PSD’tjes. Goed logisch nadenken is een van de belangrijkste hoofdpunten bij het maken van een spel. Verder is het ook belangrijk niet teveel in één keer te willen. Bouw het spel langzaam op en test ieder nieuw element in het spel goed uit. Dan wens ik je heel veel plezier bij het maken van je eigen spel.
2
Het programma
Het openingsscherm ziet er als volgt uit
Links zie je een aantal mapjes waarin alle onderdelen van het spel komen.
Sprites
Sprites zijn kleine gif-plaatjes. Een sprite kan bestaan uit één enkel plaatje of een set plaatjes. Een animatie-gifje bestaat uit een set plaatjes. Een set plaatjes van een animatie-gifje
Zo’n klein gifplaatje wordt ook wel een icon genoemd. Veel van die icons kun je vinden op www.iconarchive.com . Plaatjes met de extensie .ico mogen ook in het programma worden gebruikt. [Ga niet op internet zoeken als het programma geopend is. Mijn ervaring is dat Gamemaker dat niet prettig vind waardoor je computer wel eens wil vastlopen.]
Het programma heeft een eenvoudige, maar afdoende afbeeldings-editor om eventueel sprites te bewerken.
Sounds
Een spel wordt pas leuk als je er ook geluidjes aan kunt toevoegen. Een ijselijke kreet, het breken van glas, het piepen van een deur of zomaar een melodietje. De sounds die gebruikt mogen worden zijn midi- of wav files. Op de informatica site kun je een map met sprites en geluidjes vinden. www.fonsvitae-informatica.nl
3
Backgrounds
Je kunt de speelvelden een achtergrondkleur geven of een backgroundgifje gebreuken. Een afbeelding ter grootte van het speelveld mag ook. Wees daar echter voorzichtig mee. Zo’n afbeelding is al snel te groot waardoor het spel mogelijk trager gaat werken.
Objects
Objecten zijn onderdelen in een spel die iets doen. Objecten worden zichtbaar gemaakt door ze aan een sprite te koppelen. Sprites doen niets in een spel. Sprites en objecten moeten dus aan elkaar gekoppeld zijn. Hoe dat moet zie je later. Aan een object kun je gebeurtenissen [Events] toevoegen. Bijvoorbeeld het botsen tegen een ander object of het gebruiken van de pijltjestoetsen. Wanneer een gebeurtenis (event) optreedt moet er aangegeven worden wat er dan moet gebeuren. Dat noemen we de afhandeling van een gebeurtenis. [Event-handler] Wanneer je een object gemaakt hebt, kun je die meerdere keren in het spel gebruiken. Iedere keer dat je een object gebruikt wordt een nieuwe instantie van het object aangemaakt. Nu klinkt het misschien allemaal wat ingewikkeld. Maar als we straks een spel gaan ontwerpen wordt het (hopelijk) wel duidelijk.
Rooms
Rooms zijn de speelvelden of levels zoals je wilt.
Een begin
Voordat je begint is het aan te bevelen eerst de benodigde plaatjes, geluidjes en dergelijke bij elkaar te zoeken. Het aardige is dat je al zoekend steeds meer ideeën voor het spel krijgt. Eer ik ook maar iets doe sla ik mijn spel al op. In dit voorbeeld onder de naam vbspel. Nu ga ik de spelelementen die ik denk nodig te hebben aan het programma toevoegen. Eerst de sprites die ik (voorlopig) denk te gaan gebruiken. Niet gebruikte sprites kan ik later altijd weer verwijderen of later kunnen altijd nog meer sprites toegevoegd worden. Klik op Add op de menubalk en kies voor Add Sprite Het scherm (links) verschijnt: -
Klik op Load Sprite en zoek het gewenste plaatje.
-
Geef het plaatje een geschikte naam en zorg dat het vakje Transparant is aangevinkt.
-
OK
De sprite is nu toegevoegd aan het mapje sprites. Op dezelfde manier voeg ik nog een aantal sprites toe.
4
Bij de sprite birdy heb ik even op de knop Edit Sprite geklikt. Zoals je ziet is Birdy een animatie-gifje. Image 4 heb ik niet nodig en haal ik weg (hoeft niet perse). (aanklikken Æ Delete)
Hetzelfde doe ik met het toevoegen van sounds. Voordat je op OK klikt kun je eerst via het groene driehoekje het geluidje beluisteren. Bevalt het niet klik dan weer op de Loud Sound knop en zoek een nieuw geluidje. (Bedenk wel dat de meeste computers op school geen geluid hebben.)
De backgrounds laat ik even zitten, die komen later.
5
Objecten toevoegen
Ga weer naar Add op de menubalk en kies voor Add Object. Het scherm onder verschijnt. Naast het vakje Sprite klik je op het kleine blauwe vierkantje en kiest de sprite waaraan je je object gekoppeld wil hebben. Geef het object een naam. Voor de meeste objecten geldt dat ze zichtbaar moeten zijn. Zorg dus dat het vakje Visible aangevinkt is. Welk object wel of niet Solid moet bedenken we later wel. Voeg op dezelfde manier nog wat objecten toe.
6
Rooms toevoegen Voeg een Room toe. Je weet nu hoe dat moet. Het scherm van de Room Properties (eigenschappen) verschijnt. Klik op het tabblad settings. Geef een naam, in dit geval level01. In het vakje Caption kun je een pakkende tekst zetten die dan boven het speelveld komt te staan. Bijvoorbeeld een hint wat er tijdens dit level van je wordt verwacht. Stel de grootte van het speelveld in. (in pixels) Onderaan zie je de vakjes Snap X en Snap Y Deze heb ik beide ingesteld op 32. Dit omdat ik allemaal sprites heb gebruikt van 32x32 pixels. Het is belangrijk dat je hier goed oplet. Je kunt best iets grotere sprites gebruiken, maar je speelfiguurtje, birdy in dit geval, zal dan struikelen over uitstekende pixels. Het spel zal dan vervelend en haperig gaan werken. Stel dus het grid (de ruitjes) en je plaatjes goed op elkaar af.
Klik nu nog even op het tabblad backgrounds en geef de achtergrond een kleurtje. Verder hoef je daar niets in te vullen.
7
Nu gaan we het speelveld vullen. Klik daarvoor op het tabblad objects. Maak het propertievenster zo groot mogelijk. In ieder geval zo groot dat je het hele speelveld kunt overzien. Onderaan zie je een vakje Object to add … Klik op het blauwe vierkantje en kies het gewenste object. Plaats een instantie van het object in het speelveld door middel van een linker muisklik. Met een rechter muisklik verwijder je het object weer. Van het hoofdrolspelertje kan natuurlijk maar één instantie neergezet worden. Van andere objecten kun je meerdere instanties plaatsen. Zet nog een paar instanties van objecten neer. Niet teveel, alleen maar om even iets te proberen.
In de afbeelding links zie je een deel van het speelveld. In het speelveld is één instantie van het object birdy neergezet en veertien instanties van het object tegel1.
We gaan nu ons hoofdrolspelertje een paar eigenschappen geven. Wat we willen is dat birdy over het scherm kan lopen in de richting waarheen wij hem sturen. Dit gebeurt aan de hand van de pijltjestoetsen. Dubbelklik op het object birdyobj.
8
Het volgende eigenschapsvenster van het object verschijnt.
gebeurtenissen
afhandelingen van de gebeurtenissen
(Events)
de acties
(Events-handlers) als je met de muis over een van de handlers gaat verschijnt er informatie over die handler
Klik op Add Event Æ Keyboard Æ Left Doe dit ook voor Right, Up en Down Als we geen pijltjestoets ingedrukt houden willen we dus dat birdy stilstaat. Voeg daarom ook nog No Key toe. De events zijn nu toegevoegd. Nu de bijbehorende event-handlers nog.
9
Selecteer een event Sleep de gewenste handler (onder tabblad move) naar het actieveldje Voor Left het pijltje naar links indrukken. Neem speed=4. Niet meteen te snel. Kan later altijd aangepast worden. Doe dit ook voor de andere events. Voor No Key het middelste vierkantje indrukken.
We kunnen nu wel even kijken wat er gebeurt. Klik op het kleine groene driehoekje op de werkbalk. (Run Game)
O la la, Birdy draait een beetje dol.
Dat komt omdat het een animatie-gifje is. Trek je daar niets van aan, dat gaan we zo dadelijk verhelpen. Probeer de pijltjestoetsen. Gaat Birdy de gewenste kant uit ?
Birdy kan dwars door de steenjes lopen, dat is niet wat we wensen. Verder kunnen we Birdy zo van het scherm laten lopen, ook dat willen we niet. Er valt dus nog heel wat te sleutelen. a. b. c. d.
Als het spel start moet Birdy ons vriendelijk aankijken en niet als een gek rondtollen. Birdy moet de kant opkijken van de looprichting. Bij iedere stap moet Birdy uitgelijnd zijn op het grid. Birdy mag niet meer dwars door de steentjes heen lopen.
Dit gaan we stap voor stap verhelpen.
10
a.
Een single plaatje van Birdy als het spel (of level) wordt gestart. Herinner je je nog dat de sprite birdy bestond uit een set van vier plaatjes ?
Image 0 is het plaatje dat ons recht aankijkt. Je mag echter ook een andere nemen. Wat we willen is dat bij aanvang van ieder level slechts een single plaatje van Birdy wordt gecreëerd. Roep het propertie venster van het birdy object op. -
b.
Add Event Æ Create Kies voor de event-handler tabblad Code en sleep de handler VAR naar het actieveld. Zie afbeelding Zet bij variable image_single en value =0. (want image 0 is het plaatje dat ons recht aankijkt.
Birdy moet kijken in de looprichting en niet rondtollen. Om dit te bewerkstelligen moeten we een stukje code invoeren. Let op! Dat hoeft niet als je gewoon een single plaatje gebruikt maar een figuurtje dat met de beweging meegaat is natuurlijk veel leuker. -
Add Event Æ Step Æ step Kies voor de event-handler tabblad Code en sleep de handler Execute a piece of code naar het actieveld. Neem de code uit de volgende afbeelding over
11
Bij horizontale snelheid naar links laat image 1 zien Bij horizontale snelheid naar rechts laat single image 2 zien Enz.
c.
Birdy moet steeds uitgelijnd worden op het grid Als Birdy ergens tegenaan botst mag hij niet vast komen te zitten. -
Selecteer een Keyboard-Event en sleep onder tabblad Control de juiste handler naar het actieveld. Zie afbeelding. Vul in beide vakjes de waarde 32 in. Dat is immers de waarde die we voor het grid hadden gekozen. Zorg dat deze actie als eerste staat. Gewoon met de muis naar boven slepen. Doe dit voor alle keyboard events.
12
d.
Birdy mag niet dwars door de steentjes heenlopen. Als Birdy tegen een steentje (tegeltje) aanloopt mag er niets gebeuren. Hij moet dan gewoon stil blijven staan en wachten tot hij een andere order ontvangt. Verder moet hij bij iedere botsing weer netjes terugspringen in het grid en niet tegen een voorwerp (in dit geval het tegeltje) aan blijven plakken. Anders komt hij nooit meer van zijn plaats. -
Add Event Æ Collision Æ tegelobj Kies bij de handlers onder tabblad Move de handler Snap to a grid en vul de juiste waarden in Kies bij dezelfde handlers Start moving in a direction en druk het middelste vierkantje in. -
NB Deze eigenschappen van Birdy gelden nu voor alle levels. Je hoeft dit dus slechts eenmaal te doen. Tot slot moeten we nog zorgen dat het tegelobject Solid is. Anders kan Birdy er alsnog doorheen lopen. Roep het propertie-venster van het tegelobject op en vink het vakje Solid aan. Verder doen de tegeltjes helemaal niets. Nu maar weer testen. OK. Onze hoofdrolspeler doet nu precies wat we willen. Hij kan echter nog steeds van het scherm aflopen. Daar komen we straks op terug.
13
Spelcontrole Voordat we nu verder gaan met het spel gaan we eerst spelcontrollers inbouwen. We willen immers als het spel begint een aantal levens hebben, punten kunnen verzamelen en als er geen levens meer zijn een score kunnen invullen. In principe hebben we drie controllers nodig - Startcontrol - Spelcontrol - Eindcontrol Je kunt voor deze drie controllers steeds dezelfde sprite gebruiken. Je maakt dan van één sprite drie verschillende objecten. Doe dat nu eerst. Zorg dat Visible en Solid uitgevinkt zijn. We willen zo’n controller ergens onzichtbaar in een hoekje van het speelveld plaatsen. Tevens mogen de bewegende spel-elementen er geen last van hebben.
Een beginscherm Maak in een of ander tekenprogramma een achtergrondje voor je beginscherm. Op dit beginscherm kun je wat informatie zetten. Voor het voorbeeld heb ik gewoon iets in Paint gedaan. Je mag echter ook een fraaie afbeelding nemen. Achtergrondje voor het startscherm gemaakt in Paint
Als je heel zeker bent wat voor spel je gaat maken, hoe het er uit komt te zien, de naam, enz. is het natuurlijk handig zo’n startscherm eerst te maken. De praktijk leert echter dat je al sleutelend aan het spel nog wel eens van gedachten wil veranderen. Daarom is het misschien handiger het startscherm achteraf te maken.
14
Voeg je achtergrond toe aan het programma. Add Background. Voeg een nieuwe Room toe (level00) en voeg je achtergrondje toe. Desgewenst kun je dit scherm nog verfraaien door er wat instanties van objecten aan toe te voegen. Zet in ieder geval een instantie van het startobject neer.
Nu moeten we de startcontroller zijn eigenschappen gaan geven.
startcontroller object
Als het spel opstart dan: -
moet de score op 0 staan
-
moet er begonnen worden met een aantal levens
-
speelt er eventueel een muziekje (moet je wel van tevoren aan het programma toevoegen.)
-
moet er een mogelijkheid zijn het muziekje uit te zetten
-
moet er spel informatie op te vragen zijn
-
moet het spel gestart kunnen worden
Deze eigenschappen van de startcontroller gaan we stap voor stap invoeren.
15
Roep het propertie venster van het startcontroller object op. Score op 0, beginnen met drie levens, een muziekje spelen. Add Event Æ Create Zoek daarbij de event-handlers: -
Set de score to 0
-
Set lives to 3
-
Play sound (de naam van het melodietje is in dit voorbeeld (‘mission’)
Je weet nu wel waar je de benodigde event-handlers kunt vinden. De keyboard toetsen Add Event Æ Keyboard Daarbij de volgende event-handlers: -
M-key om het muziekje te stoppen
-
S-key om het spel te starten (door naar de next room te gaan)
-
F1-key om informatie op te vragen
Daarbij de volgende event-handlers: Zie afbeeldingen hieronder
De game-info moet je nog wel zelf schrijven. Dubbelklik daartoe op het blauwe info-tekentje onder de map van de Rooms .
Je kunt bijvoorbeeld schrijven waar het spel over gaat en wat het doel is. Verder kun je informatie geven over gebruik van bepaalde toetscommando’s. Daar komen we zo dadelijk op terug bij de eigenschappen van de spelcontroller.
16
De spelcontroller Een instantie van dit object wordt in ieder level in een hoekje geplaatst. Eigenschappen van de spelcontroller: -
De score nu relatief op 0 zetten Het aantal levens bijhouden Als er geen levens meer zijn het spel beeindigen en de scoretabel tonen, het spel dan opnieuw laten beginnen. Het level opnieuw starten voor als de speler door eigen schuld vast komt te zitten. Dit kost dan wel een leven De informatie tonen. De mogelijkheid de muziek te stoppen. De mogelijkheid de muziek aan te zetten. De mogelijkheid om naar het vorige level te gaan. (alleen voor jezelf) De mogelijkheid om weer naar het volgende level te gaan.
Roep het propertievenster van de spelcontroller op. Begin spel Add Event Æ Other Æ Gamestart Daarbij de event-handlers: - Set the score relative to 0 - Set lives relative to 3 - (eventueel) Play Sound (zorg nu dat het vakje relatief aangevinkt is) Als er geen levens meer zijn Add Event Æ Other Æ No more lives Daarbij de handlers: - Show highscore - Restart game Verder nog wat key-commando’s Event-handlers Events A-key Play sound M-key Stop sound N-key Go to next room (alleen voor jezelf om door de levels heen te lopen tijdens het testen.) P-key Go to previous room R-key Restart current room Natuurlijk mag je ook andere letters gebruiken. Er zijn ook commando’s waarbij de toetsen vast liggen. Deze toetsen moet je nog wel als events en bijbehorende handlers toevoegen Kijk bij Game Options onder het tabblad Keys
zie afbeelding rechts Æ Vergeet niet al deze spel opties in je informatiescherm te zetten. Mocht je nog wijzigingen of aanvullingen hebben kan dat altijd later nog.
17
Nu gaan we toch eindelijk aan het echte spel beginnen. Ik geef in het voorbeeldspel slechts een paar brave zoete voorbeelden. Je kunt zelf het spel zo spannend of flitsend maken als je zelf wilt. Je fantasie is slechts je enige beperking. Hier en daar zal ik nog wat suggesties geven zonder voorbeeld omdat de events en de event-handlers sterk op elkaar lijken. Toch zijn er een aantal zaken waar je goed op moet letten: -
De speler van jouw spel mag niet door een fout in het spel vast komen te zitten.
-
De hoofdrolspeler (Birdy in het voorbeeldspel) of andere bewegende elementen mogen niet zomaar van het scherm verdwijnen.
-
De hoofdrolspeler mag niet naar een volgend level als niet alle handelingen zijn verricht.
-
Als alle handelingen zijn verricht moet er een opening naar een volgend level komen.
-
De score en het aantal levens moet worden bijgehouden.
Wat betreft het bouwen van het spel: -
Voeg steeds slecht één element aan een level toe.
-
Bedenk heel goed welke events en welke even-handlers daarbij moeten.
-
Schrijf alle stappen desnoods op een kladpapiertje.
-
Test na het toevoegen van de events en de handlers het spel uit.
-
Pas als alles goed werkt kun je een nieuw element toevoegen.
Voorbeeld level01. Het pakken van elementen. Om te voorkomen dat bewegende elementen van het scherm lopen/rijden/vliegen kun je een zichtbare of onzichtbare wand van tegels plaatsen. Deze tegels moeten Solid zijn en doen verder helemaal niets. Laat in de wand een opening naar het volgend level. Plaats in die opening twee finish objecten. In het voorbeeld hiernaast een hekje en een pijl. Als alle handelingen zijn verricht moet het hekje verdwijnen en kan het speelfiguurtje de pijl passeren naar het volgend level.
Twee finish objecten
18
Bij het passeren van de pijl kunnen en moeten enkele gebeurtenissen plaats vinden. -
in ieder geval naar het volgende level eventueel een tada geluidje eventueel bonus punten eventueel een extra leven.
(next room) (play sound)
In dit voorbeeld level gaat het om pakken van elementen. Dat wil in het voorbeeld level zeggen dat Birdy alle rode edelstenen moet pakken.
spelcontroller
Als Birdy in aanraking komt met zo’n rode steen dan: -
Moet de steen verdwijnen Eventueel een bleeb geluidje Moet de score opgehoogd worden
Als alle rode stenen gepakt zijn - moet het hekje verdwijnen. - Eventueel een geluidje Maak om te beginnen een level02 aan. Die mag je nog wel even helemaal leeg laten, maar de hoofdrolspeler moet wel naar een volgend level kunnen. Zet wel vast de spelcontroller in een hoekje en een instantie van de hoofdrolspeler.
19
In de voorbeelden die nu gaan volgen zal ik niet steeds weer voorkauwen wat je precies moet doen. Ik ga er vanuit dat je nu weet hoe je een Event en een Event-handler moet toevoegen. De afbeeldingen spreken voor zich. Rode stenen worden gepakt Propertievenster Birdyobject Een bleeb geluidje
De score wordt met 1 opgehoogd Komt in aanraking met rode steen
De instantie van het object rode steen wordt vernietigd. Let op dat niet Birdy maar de rode steen wordt vernietigd. Other dus.
Alle rode stenen zijn gepakt (finishobject) hekje moet verdwijnen
Propertievenster hekjeobject
Als het aantal rode steentjes (juweelobj) gelijk is aan 0…
start dan het blokje verwijder het hekje (self) speel geluidje sluit blokje
(Als na een vraag (If) meerdere handelingen volgen, worden deze handelingen tussen een start en een sluit blokje gezet.)
20
Als (finishobject) pijl wordt gepasseerd propertievenster pijlobject
50 bonuspunten
Een tada geluidje
De computer een heel klein momentje rust gunnen om het een en ander te verwerken
Naar het volgende level Je hebt hier een aantal opties hoe je het volgende level wilt laten verschijnen
Pijl komt in aanraking met Birdy
NB
De eigenschappen die je nu hebt toegeschreven aan het hekje, de pijl en de rode stenen blijven in alle levels gelden. Wil je dus opeens aan bijvoorbeeld de rode stenen andere eigenschappen toekennen zal je een tweede object aan de (zelfde) sprite moeten koppelen. Dat geldt voor alle objecten. Suggestie Dit is natuurlijk een heel simpel voorbeeld level. Als het level moeilijk is dan kun je bijvoorbeeld moeilijk te pakken objecten plaatsen waarmee je een extra bonuspunten kunt verdienen. Deze elementen hoeven niet perse gepakt te worden om naar het volgende level te gaan. Ook kun je natuurlijk objecten plaatsen waarmee je een extra leven kunt verdienen.
21
Voorbeeld level02 In aanraking komen met (bewegende) dodelijke (of verlammende) elementen. In het volgende voorbeeld level ga ik elementen toevoegen waar het hoofdrolspelertje van dood gaat als hij daarmee in aanraking komt. Als dat gebeurt dan: - moet het hoofdrolspelertje vernietigd worden - het aantal levens met 1 worden verminderd - eventueel een aaaghg geluidje - het level opnieuw beginnen Maar eerst - Een object koppelen aan een (monster) sprite. In het voorbeeld neem ik een spin, vind ik eng genoeg. (dat kun je nu) - Het object spin zijn eigenschappen geven (zie de afbeeldingen) - Level02 ontwerpen - Vast (een leeg) level03 maken (zie blz 19 onderaan)
Invisible tegelobject
Twee instanties van spinobject1 Bewegen zich horizontaal Een instantie van spinobject2. Beweegt zich verticaal.
22
Eigenschappen van het spinobject.
Als het level verschijnt moeten de spinnen al (horizontaal) bewegen. Snelheid 2
Als de spin een wandtegel raakt moet hij omkeren in tegengestelde richting
Birdy zegt goodbey
Birdy wordt vernietigd. Dit zijn de eigenschappen van spinobject. Dus Other.
Het aantal levens wordt met 1 verminderd.
De spin komt in aanraking met Birdy
Het level wordt opnieuw gestart
Voor spinobject2 gelden dezelfde instellingen. Alleen nu verticaal. Suggestie In plaats dat het hoofdrolspelertje dood gaat kun je hem ook een bepaald percentage van zijn gezondheid laten verliezen. Als die gezondheid 0 is dan gaat hij alsnog dood. Door hem bepaalde voorwerpen te laten pakken kan je zijn gezondheid weer laten groeien.
De gezondheid met een percentage laten afnemen of laten groeien. Een strookje ergens in het speelveld tekenen dat toont hoe het er met de gezondheid voorstaat.
Wat moet er gebeuren als de gezondheid een bepaald percentage heeft bereikt.
23
Voorbeeld level03 Verwisselen / veranderen van instanties of objecten. Denk daarbij aan het bekende Packman. Naar ik aanneem bij iedereen bekend. Daar zweven spookjes over het speelveld. Als je in aanraking komt met zo’n spookje verlies je een leven. Je kunt echter een voorwerpje pakken zodat de spookjes voor bepaalde tijd veranderen in goedaardige spookjes die je niets doen. De spookjes veranderen dan van kleur. Als de tijd om is worden het weer dodelijke spookjes. Natuurlijk verschieten de spookjes niet echt van kleur maar wordt er van plaatje(s) gewisseld. In het volgende level ga ik daar een voorbeeld van geven hoe je zoiets moet doen. Verder laat ik Birdy de rode juwelen pakken. Ik zet er echter ook een aantal groene juwelen tussen. Als Birdy in aanraking komt met zo’n groen juweel wordt hij teruggestuurd naar de startpositie en veranderd het groene juweel in een rood juweel. Niks spectaculairs dus. Het gaat om het voorbeeld.
Boosaardige spookjes
Pilletjes Als Birdy zo’n pilletje heeft gepakt veranderen de spookjes voor bepaalde tijd in goedaardige spookjes.
Als Birdy in aanraking komt met het groene juweel wordt hij teruggestuurd naar de startpositie. Het groene juweel veranderd in een rode.
24
Popertievenster Birdy Als Birdy in aanraking komt met groene steen.
Birdy wordt teruggestuurd naar de startpositie Self
Een instantie van juweelgroen veranderd in een instantie van juweelrood. Other Het juweel moet veranderen en niet Birdy
Birdy pakt een pilletje (spook1 is het boze spook, spook2 is het aardige spook) Other
Alle goedaardige spookjes moeten na bepaalde tijd weer terug veranderen in boosaardige spookjes. Alle instanties van spook2 moeten dus weer veranderen in spook1. Dus toepassen op spook2
Alarmklok instellen. Na 160 steps moet er iets gebeuren met alle instanties van spook2. Op het moment dat het pilletje wordt gepakt moeten alle instanties van spook1 veranderd worden in spook2.
Zie propertievenster spook2
25
Propertievenster spookobject1 (het boze spook) Als het level wordt geopend moeten de spookjes al rondzweven. Alle richtingen
Als spook in aanraking komt met Birdy moet Birdy worden vernietigd. Dus Other
Als het spook tegen de onzichtbare wand botst moet hij omkeren ongeacht welke richting
Propertievenster spookobject2 (het aardige spook)
Als het alarm afgaat (ingesteld bij Birdy pakt pil) Dan moeten de aardige spookjes weer veranderen in boze spoken. Zie spook1
Self
Vergeet niet in te stellen dat als Birdy tegen spook1 opbotst dat hij dan dood gaat. Dit zijn de zelfde instellingen als bij de spin.
26
Voorbeeld level04 Het voortduwen van elementen. Als het hoofdrolspelertje elementen kan voortduwen opent dat meteen weer een scala aan mogelijkheden. In het volgende voorbeeld laat ik Birdy weer de rode juwelen pakken. Hij moet echter met behulp van de rotsblokjes openingen maken.
Als een rotsblokje in botsing komt met een zwart vlakje, verdwijnt zowel het rotsblokje als het zwarte vlakje zodat een opening ontstaat. Birdy moet de rotsblokjes verstandig gebruiken. (voortduwen dus)
Het object zwart is een heel eenvoudig object. Het is solid en heeft dezelfde eigenschappen als het tegelobject. Zowel monster-objecten als het Birdy-object botsen dus tegen zwart aan en kunnen niet verder. Wanneer echter een rotsobject tegen zwartobject botst moeten beide vernietigd worden.
Eigenschappen zwartobject
Als het zwart object in botsing komt met het rotsobject dan….
self other
27
Het rotsobject is iets gecompliceerder - Het is solid en heeft dezelfde eigenschappen als het tegelobject, het kan dus monsters tegenhouden. - Het kan verschoven worden door het birdyobject, maar alleen als er ruimte is. Anders moet birdy helemaal niets doen, hetzelfde dus als hij tegen een tegel aanloopt.
Als het rotsobject in botsing komt met birdy
Als de ruimte na het rotsblok vrij is. Self dus. Er mag geen enkel object staan.
Het birdyobject beweegt zich zowel horizontaal (hspeed) als verticaal (vspeed) met snelheid 4. 8*4 = 32 en dat is precies de afmeting van het volgende vakje. (na de rots) Het rotsobject moet kijken naar de richting en de snelheid van het object birdy. Het other object dus Vandaar 8*other.hspeed en 8*other.vspeed
lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
28
En wanneer die ruimte aanwezig is, dan springt het rotsobject (self) precies één vakje in dezelfde richting waarin het andere object (birdy) zich bewoog
Of anders
Als er een zwartobject op de nieuwe positie staat moet het rotsobject toch 32 pixels verspringen.
29
Tenslotte moeten we nog aan het birdyobject vertellen dat het niets moet doen wanneer het tegen een rots aanbotst. Het verschuiven van de rotsen door birdy hebben we immers al ingesteld bij het rotsobject.
Suggesties: - Door het verschuiven van objecten kun je gevaarlijke monsters gevangen zetten. -
Of monsters ‘pletten’
-
Water en vuur. De hoofdpersoon kan zich lelijk branden aan vuur, door het aanslepen van water kan het vuur gedoofd worden.
-
Een Sokoban-achtig level maken (Zie voorbeeld level 05)
-
Een labyrint waar je door het verschuiven van objecten een uitweg kunt vinden.
Voorbeeld level05 is een Sokoban level Zonder verdere uitleg.
30
Voorbeeld level06 Bommen en Explosies Het triggerobject, het bomobject en het explosieobject Deze drie objecten horen bij elkaar. In het level staan zowel een trigger als een bom opgesteld. (Niet te dicht bij elkaar.) Wanneer birdy in contact komt met de trigger dan : -
-
wordt het triggerobject vernietigd wordt het bomobject, dat gekoppeld is aan een sprite van 32x32 pixels vervangen door het explosieobject, dat gekoppeld is aan een sprite van 96x96 pixels. Wordt het explosieobject samen met alle andere objecten in het betreffende gebied van 96x96 pixels vernietigd.
NB de sprite explosie is een animated gif.
trigger
bom
Als het triggerobject in aanraking komt met birdy
Dan moet het bomobject veranderen in explosieobject
En het triggerobject zelf moet verdwijnen
31
Eigenschappen explosieobject
Zodra het object explosie is gecreëerd wordt bovenstaand stukje code uitgevoerd dat alle aangrenzende objecten vernietigd. Als de animatie afgelopen is wordt ook het explosieobject vernietigd
Suggesties: - Je kunt natuurlijk meerdere instanties van het bomobject plaatsen, als de hoofdrolspeler dan in aanraking komt met de trigger gaan alle bommen tegelijk af. -
Je kunt ook meerdere bommen met meerdere triggers gebruiken. Dan moet je van de sprite bom meerdere objecten maken – bv bom1, bom2, enz. Zo ook van de trigger. Als de hoofdrolspeler dan in aanraking komt met trigger1 dan gaat bom1 af, enz.
-
Je kunt de hoofdrolspeler ook een bom naar een geschikte positie laten brengen om bijvoorbeeld een monster te doden.
Zorg wel dat de hoofdrolspeler niet te dicht bij de bom staat anders wordt hij ook vernietigd. De trigger dus niet te dicht bij de bom plaatsen.
32
Voorbeeld level07 Eénrichtingverkeer (ontwerp Mark Overmars) Birdy wordt voortdurend één bepaalde richting opgestuurd.
De objecten up, down, left en right zijn hele simpele objecten die zelf helemaal niets doen. De code zit bij het object Birdy. Iedere stap houdt het object Birdy in de gaten of er misschien contact is met een van de pijl objecten. Wanneer dit contact er is dan worden richting en snelheid van het object Birdy aangepast.
Bij iedere stap wordt gekeken of Birdy in contact komt met een van de pijlen
Eigenschappen Birdy
Dan wordt Birdy in de richting van de pijlen gestuurd met snelheid 8. Dit moet voor alle pijlen worden ingesteld.
33
Het einde van een spel Eerder hebben we een startcontrol en een spelcontrol gemaakt. Om het spel te beëindigen hebben we ook een eindcontrol nodig. Deze eindcontrol zorgt voor een keurige afhandeling van het spel. Zonder zou het hoofdrolspelertje naar een volgend level gaan terwijl er geen volgend level is en zou er een foutmelding komen. Voeg nog een room toe en plaats daarin de onzichtbare eindcontroller. Net als de startroom kun je ook hier een fraaie achtergrond toevoegen. De eindcontrol zorgt ervoor dat: - er een boodschap verschijnt - de scoretabel vertoond wordt - het spel opnieuw wordt gestart
Bij het maken van de eindcontrol wordt een wekker aangezet die na 1 step (=vrijwel direct) een stil alarm doet afgaan. Dit alarm toont een boodschap (zelf te schrijven), laat de highscore-tabel zien en start het spel opnieuw.
34
De lay-out van de scores en het aantal levens verfraaien
Je kunt door wat eigenschappen aan de spelcontroller toe te voegen zorgen dat het aantal levens en de score, zoals boven, wordt weergegeven in het speelveld.
Kies lettertype, grootte, kleur, enz. Positie van de tekst: Lives:
Maak het spelcontrol_object visible en voeg het Event Draw toe
Positie van de score: breedte van de room-150 pixels
35
Tot slot moet er een stukje code worden ingevoerd om het aantal levens als kleine birdy’s te tekenen.
herhalingslus
teken een sprite met aangepast
naam van de sprite
horizontale positie van de sprite
verticale positie van de sprite
schaalfactor
resultaat:
NB Ondanks dat het object visible is gemaakt zal je het toch niet zien. De spelcontroller zorgt dat bovenstaan resultaat gecreëerd wordt op de plaats waar de spelcontroller is neergezet. In dit geval in de uiterste linkerhoek onder.
36
Sprites van een strip Een strip is één afbeelding met meerdere figuurtjes. Ook wel een sprite-sheet genoemd. Zie onder. Het probleem bij deze vellen is dat niet per figuurtje aangegeven is hoe de afmetingen zijn. Dat moet je dus een beetje uitzoeken en later eventueel aanpassen.
Een sprite van een strip afhalen doe je als volgt: Add sprite. In plaats van Load Sprite te kiezen, kies nu meteen voor Edit Sprite Æ Create from Strip
Zoek de gewenste strip
37
Van het spritesheet kies ik drie plaatjes op rij. Als bij ‘images per row’ 1 wordt ingevuld krijg je drie verticale selectie_rechthoekjes. De afmetingen van de selectierechthoek De positie van het plaatje, tov de linker bovenhoek. Door op de sheet te klikken worden daar de waarden vanzelf ingevuld. Je kunt ze nog iets aanpassen
Het is even een beetje puzzelen voordat je de juist waarden hebt. Maar na een aantal waarden proberen wordt het allemaal snel duidelijk.
De scheiding tussen de plaatjes
Na de gewenste rechthoekselectie kom je weer in de Sprite Editor. Je ziet daar alle drie de plaatjes. Dat betekent dat er een animatie is gemaakt.
Hier kun je vast een voorproefje van de animatie zien en de animatie snelheid instellen. Eventueel kun je de grote van de sprite nog aanpassen.
38
Tiles Een tile-set lijkt een beetje op een sprite-sheet, dus ook een vel met veel kleine plaatjes (tiles). Een tile is echter een stukje van een achtergrond en doet verder helemaal niets. Je kunt er dus niet tegen aan botsen of events aan toevoegen. Met tiles kun je wel een fraaie achtergrond ontwerpen. Op internet zijn veel tile-sets te vinden. Wegen, spoorlijnen, ruines, landschappen, enz. Ook op informatica site vind je enkele tile-sets. - Zoek een geschikte tile-set en voeg deze toe als background. - Voeg een nieuwe room toe.
Klik op het tabblad tiles…
Kies een deeltje dat je als achtergrond wil gebruiken en plaats het op het speelveld. …en zoek de gewenste til-set
Het plaatsen op het speelveld gaat op dezelfde manier als het plaatsen van objecten. Je kunt voor een achtergrond meerdere tile-sets gebruiken. Zie volgende baldzijde.
39
Voor dit stukje achtergrond zijn drie verschillende tile-sets gebruikt.
Op de gemaakte achtergrond kun je gewoon objecten plaatsen.
Het is altijd even goochelen met de waarden van de grootte. Het is proberen tot je de juiste selectie hebt gevonden. Dat kan per stukje verschillen. Voor dit plaatje heb ik negen stukjes van 32x32 genomen. En voor het laatste randje drie stukjes (verticaal) van 16x32
NB Sommige tile-sets lenen zich ook heel goed als sprite-sheet.
40
Nog enkele wetenswaardigheden.
Depth. Spoken, griezels of andere bewegende objecten kunnen zich tegelijkertijd op dezelfde positie bevinden als een ander stilstaand object. Zie voorbeeldlevel 2. Soms gaan ze over een ander object heen en soms gaan ze er achter langs. Dit kan geregeld worden met Depth. Het object met de grootste Depth wordt als eerste getekend en ligt dus onderop. Wanneer objecten dezelfde Depth hebben worden ze getekend in de volgorde waarin ze zijn gemaakt.
Je kunt een object een Parent geven. Het object erft dan automatisch alle eigenschappen van zijn Parent. Die hoef je dan niet meer in te stellen. En kan natuurlijk ook zelf nog een aantal andere eigenschappen bezitten. Bij bijvoorbeeld het level Sokoban moeten de rotsblokken dezelfde eigenschappen hebben als het juweelrood. Als alle rotsblokjes weg zijn kan er naar het volgende level worden gegaan. Verder heeft het rotsblok ook eigenschappen van zichzelf ook een aantal eigenschappen. Er kan bijvoorbeeld tegen geduwd worden.
Omdat de meeste sprites niet een volledig vakje vullen van 32x32 pixels wordt het vakje ‘Precise collision checking”uitgezet. Bij een botsing wordt nu niet meer exact gecontroleerd of de sprite is geraakt, maar wordt er gekeken of het vakje van 32x32 pixels is geraakt. Let hier op! Anders kan je hoofdrolspelertje lelijk blijven haken achter een of ander object en loopt het spel vast.
41
Tot slot moet je van het spel een ‘stand-alone’ versie maken. Het ontwerp van het spel (de ‘sourcecode’) wordt bewaard in een bestand met de naam: Spelnaam.gmd en kun je alleen openen in het programma gamemaker. De stand-alone versie van het spel wordt bewaard in een bestand met de naam: Spelnaam.exe. Om deze versie te openen heb je het programma niet nodig. Je kunt het spel eventueel op internet zetten.
Een stand-alone versie van het spel maken.
Dan wens ik je nog heel veel plezier bij het ontwerpen van een flitsend spel. Voor (veel) meer informatie kun je de Helpfunctie raadplegen. Voor het maken van een zogenaamd scroll-spel wijs ik je op het voorbeeld met bijbehorende (Engelstalige) lesbrief op de informatica-site.
42