Gamemaker opdracht

Je internetbrowser kan de game niet laten zien! Probeer een andere browser.

Inhoud

-1Inleiding
0Wat heb je nodig?
0.1Gamemaker 8.1 Lite
0.2Irfan view
1Belangrijke events
2Sprites maken
3Eerste objecten maken
3.1Afspraken voor de naamgeving
4Eerste room maken
5Speelfiguur laten bewegen
5.1Horizontale beweging
5.2Verticale beweging
5.3Collision mask
6 Mooiere graphics
6.1 Tilesheet
7 Monsters en andere gevaren
7.1 Monsters
7.1.1 Lopende monsters
7.1.2 Vliegende monsters
7.2 Valkuilen
8 Ladders en hellingen
8.1 Ladder
8.2 Helling
9 Views gebruiken
9.1 Buiten speelveld
10 Schieten
11 Score bijhouden
11.1 Punten verdienen
11.2 Score informatie op het scherm tonen
12 Voedsel of munten verzamelen
13 Geluid
14 Winnen
15 En nu verder...
16 De beoordeling

Les 1

  1. Lees hoofdstuk -1 Inleiding door.
  2. Lees hoofdstuk 0 Wat heb je nodig? door.
  3. Installeer Gamemaker 8.1 op je computer thuis.
  4. Installeer Irfanview op je computer thuis.
  5. Lees hoofdstuk 1 Belangrijke events door.
  6. Lees hoofdstuk 2 Sprites makendoor.
  7. Maak foto's van jezelf en maak daarmee een sprite die naar rechts loopt en een die naar links loopt.
  8. Lees hoofdstuk 3 Eerste objecten maken door.
  9. Maak een object voor je speelfiguur, met één van de zojuist gemaakte sprites.
  10. Lees hoofdstuk 4 Eerste room maken door.
  11. Maak een room voor je spel.
  12. Lees hoofdstuk 5 Speelfiguur laten bewegen door.
  13. Verzorg de horizontale beweging van je speelfiguur.

-1 Inleiding

In deze opdracht ga je werken aan een zogenaamde Platform game. Zo'n game heet zo omdat in het spel allerlei platforms voorkomen waarop de speler kan lopen op zoek naar de uitgang van het level.

Op je telefoon (smartphone, I-pad) heb je daar misschien wel een voorbeeld van. Je loopt met een figuur door een speelveld en je moet over muren en andere hindernissen heen springen, ladders gebruiken, hindernissen en monsters omzeilen, muntjes en bonussen verzamelen en ondertussen de uitgang vinden naar het volgende level.

We gaan er vanuit dat je al eens een eenvoudig spel hebt gemaakt met gamemaker, bijvoorbeeld het fruit-spel of het drakenspel. Bovendien weet je wat we bedoelen met de volgende begrippen:

Verder moet je kunnen werken met het assenstelsel van gamemaker. Het is niet moeilijker dan bij wiskunde, maar er zijn twee belangrijke verschillen: ten eerste is de y-as omgedraaid: de positieve kant zit dus onder de x-as . Ten tweede meet gamemaker afstanden in pixels, dat zijn beeldpunten op het scherm. Eén pixel is dus een vrij kleine afstand. Op een gemiddeld beeldscherm passen er 30 à 40 pixels in één centimeter. In het plaatje hieronder zie je een room in gamemaker met het assenstelsel getekend in het groen.

Kijk hier hoe het assenstelsel er uit ziet

De coördinaten in het groene assenstelsel hierboven zijn absoluut. Een absolute positie heeft de oorsprong altijd linksboven in de room. Maar je zult heel vaak met een relatieve positie gaan werken. Kijk maar eens in het plaatje hieronder. Je ziet dat relative is aangevinkt. Dat betekent dat we niet met absolute coördinaten (-5,0) te maken hebben, maar met relatieve. Relatieve coördinaten (-5,0) zijn 5 pixels links van waar het object zich nu bevindt. Door met relatieve coördinaten te werken kun je het verplaatsen van objecten dus veel eenvoudiger maken.

Relatieve coördinaten

Een richting heet in gamemaker een direction. Je hebt bijvoorbeeld direction 0, dat is naar rechts. En direction 270 is naar beneden. Je merkt al wel dat zo'n direction in graden wordt uitgedrukt. Welke richtingen horen er bij direction 90, 180 en 360 denk je? Je kunt hier klikken om je antwoord te controleren.

In het vervolg geven we events en acties aan met een ander lettertype. Dan weet je altijd precies wat we bedoelen en waar je in gamemaker moet zoeken. Een event krijgt een ander lettertype, en een actie is bovendien cursief. Bijvoorbeeld Create event - Move fixed actie.

0 Wat heb je nodig?

0.1 Gamemaker 8.1 Lite

Op school werken we met de Lite versie van Gamemaker 8.1. Deze versie is gratis te gebruiken. Het is absoluut niet nodig de volledige versie van Gamemaker aan te schaffen.

Op school staat Gamemaker al op het educatieve netwerk, maar je zult er ook thuis mee moeten werken, dus we adviseren je gamemaker op je eigen computer te installeren.

http://www.yoyogames.com/legacy
Voor de gratis versie klik je op de knop 'Download installer'.

0.2 Irfan View

Het programma Irfan View (freeware) gebruik je om afbeeldingen te bewerken om sprites mee te maken: De meeste sprites zul je transparant (doorzichtig) maken, en converteren naar .png of .gif. Je kunt met Irfan View ook kleine aanpassingen doen met het tekenpalet. Bovendien heb je misschien een tekenprogramma nodig om je achtergronden te bewerken.

Hier op school tref je Irfan View al aan op het educatief netwerk. Het wordt aanbevolen dit geweldig stukje gereedschap ook op je eigen computer te installeren. Je kan het programma (en de NL taalmodule) gratis downloaden op:

http://www.irfanview.com

We gaan ervan uit dat je goed met dit programma overweg kan.

1 Belangrijke events

In onderstaande lijst vind je korte uitleg over de belangrijkste events die in gamemaker kunnen optreden. Je kunt de lijst eventueel als naslag gebruiken.

Een uitgebreidere uitleg staat bijvoorbeeld op deze site.

Create Het create event treedt op als het object waar het in staat voor het eerst wordt gemaakt. Als het object al in het speelveld staat, gebeurt dit event op het moment dat het speelveld in beeld komt.
Alarm Er zijn meerdere alarm events, genummerd van 0 tot en met 11. Ieder van deze events is eigenlijk een wekker. Op het moment dat de wekker begint te rinkelen, treedt ook het event op. Je kunt met dit event dus een gebeurtenis een bepaalde tijd uitstellen.
Step Het step event gebeurt tientallen keer per seconde. Als je een bepaalde actie heel vaak per seconde wil laten gebeuren, plaats je die actie in het step event.
Collision Het collision event treedt op wanneer sprites van twee objecten overlappen. Dit event zul je in elk spel heel vaak gebruiken, ook wanneer het niet onmiddellijk voor de hand ligt. Als je object tegen een 'solid' object aanbotst, zal het blijven stilstaan (tenzij je zelf andere acties hebt geprogrammeerd bij het collision-event). Als je object tegen een niet-solid object aanbotst, treedt er wel een collision-event op, maar vliegt je object gewoon over het andere heen.
Keyboard Met een keyboard event kun je het spel laten reageren op het toetsenbord.
Draw Normaal gesproken wordt de sprite van een object in iedere stap van het spel op het scherm getekend. Als je echter iets anders wil laten zien op het scherm kun je dat in het Draw event programmeren.

2 Sprites maken

Er zijn heel veel manieren om aan mooie sprites te komen. Je kunt ze bijvoorbeeld op het internet vinden, zelf tekenen of inscannen. Eén van de eisen die we aan jouw game stellen is dat er een afbeelding van jezelf in je game voorkomt. Je kunt bijvoorbeeld het speelfiguur of een van de tegenstanders jouw afbeelding geven. Deze eis stellen we zodat je minder eenvoudig andermans werk kunt inleveren. Het is natuurlijk de bedoeling dat je zelf een game maakt.

Je zult dus enkele foto's van jezelf nodig hebben. Dat is tegenwoordig geen probleem. Je hebt vast zelf wel een telefoon die ook kan fotograferen en filmen of anders wil een klasgenoot vast wel even een foto van je maken. De resolutie (kwaliteit) van de foto hoeft niet geweldig te zijn want om bruikbaar te zijn in je game moet de afbeelding toch flink verkleind worden.

We geven een voorbeeld. We hebben drie foto's van je docent gemaakt en ze met Irfan View in één afbeelding geplakt.

Zorg er bij je eigen 'actie-fotootjes' voor dat de afbeeldingen niet te groot zijn. Een afbeelding van bijvoorbeeld 160 pixels bij 80 pixels is heel mooi.
Controleer in ieder geval met Irfan View |Afbeelding|Informatie| of je afbeelding niet in duizendtallen aan pixels uit je camera komt, want in dat geval moet je afbeelding echt in grootte aanpassen:
|Afbeelding|Grootte wijzigen...|.

Drie of meer fotootjes kan je gemakkelijk als één afbeelding plakken in Irfan View via |Afbeelding|Maak panorama afbeelding ...|. Niet vergeten je afbeelding op te slaan als .png en de transparante kleur te kiezen.

Met deze 'blauwe' aanwijzingen proberen we je een beetje op het juiste spoor te zetten. Maar het is de bedoeling dat je zelf research doet, dingen uitvist en uitprobeert, opzoekt. Dat is de ware manier van ICT bedrijven en dingen op te steken.

Het idee is dat we alle drie de als subimage in één sprite stoppen, waardoor er straks in gamemaker een mooie animatie te zien is. Maar er is nog achtergrond zichtbaar. Die achtergrond moeten we eerst met Irfan View egaal kleuren. Zie het voorbeeld hieronder.

In Irfan View kun je dit eenvoudig doen. Druk op F12 om de tekengereedschappen aan te zetten. Met het potlood en het opvulgereedschap heb je de achtergrond snel egaal. Gebruik een slimme waarde voor de tolerantie of beter nog, varieer die wanneer nodig.

Als de achtergrond eenmaal egaal is slaan we de foto op als een .png bestand waarbij we de achtergrondkleur transparant kiezen. Dan zie je de achtergrond niet meer en dat geeft het mooiste effect in je game.

Dit bestand laden we nu in gamemaker door achtereenvolgens Create a Sprite - Edit Sprite - Create from Strip te kiezen. Daarna slaan we de sprite op onder de naam spr_char_right. Hier zie je hoe je met wat proberen de juiste waarden vindt om de afbeelding in drie gelijke stukken te hakken.

Als deze subimages van de sprite achterelkaar worden afgespeeld, zie je:

Deze sprites wijzen allemaal naar rechts, maar we willen aparte sprites wanneer het speelfiguur naar links kijkt. Gelukkig kan de sprite editor dat voor ons doen met de optie 'Mirror'. Probeer dat maar eens uit en sla het resultaat op onder de naam spr_char_left.

Na deze opdrachten heb je in ieder geval een afbeelding van jezelf die naar rechts en naar links kan lopen: een spr_char_right en een spr_char_left.

Voor de muren in je spel heb je ook een sprite nodig, een zwart vierkant blokje van 16 bij 16 pixels. Dat kan heel snel in gamemaker: Create a sprite - Edit Sprite - Create a new sprite - 16 bij 16 pixels - Make opaque - OK. Geef deze sprite de naam spr_block.

create a new sprite

maak het blokje ondoorzichtig (opaque)

Na deze opdracht heb je een vierkant gevuld blokje spr_block.

3 Eerste objecten maken

Zowel van de speelfiguur en de muren moeten we objecten maken. Kies voor Create an object en geef het de naam obj_character. Als sprite kies je de sprite naar spr_char_left of spr_char_right, dat maakt niet zoveel uit.

Bij het muur-object is het belangrijk dat je 'solid' aanvinkt. Alle objecten waar je niet doorheen kunt bewegen zoals muren moeten 'solid' zijn.


Na deze opdrachten heb je de objecten obj_char en obj_block.

3.1 Afspraken voor de naamgeving

Je hebt al gemerkt dat we de namen van sprites zijn begonnen met de prefix spr_. We spreken af dat we voor de duidelijkheid de naam van een sprite altijd beginnen met spr_. Net zo beginnen we objectnamen met obj_. Geluiden laten we beginnen met snd_ en achtergronden met bgr_.

4 Eerste room maken

We kunnen de eerste room nu gaan maken. Klik maar op Create a room en dan zie je links in beeld een aantal tabjes. Bij het tabje settings kun je de naam en de afmetingen van de room instellen. Als naam zou je bijvoorbeeld room1 of level1 kunnen nemen. De afmetingen moeten perse een veelvoud zijn van 16, omdat het obj_block 16 bij 16 pixels was. Neem width 640 en height 480 voor de eerste room. Als je later nog een groter level zou willen maken dan kan dat natuurlijk.

Bij 'Caption for the room:' op het tabblad Settings vul je je voor- en achternaam in, gevolgd door het level.
Bijvoorbeeld Frank de Brouwer - level 1. Dat verschijnt dan in de titelbalk van het gamingvenster.
Dat invullen van je naam en level is verplicht en gebruikt de docent bij de beoordeling.

Neem aan de onderkant van je room de blokjes op zoals in de afbeelding.
Je kunt de blokjes snel plaatsen met behulp van de shift-toets en ingedrukte linkermuisknop.
Je kunt de blokjes snel verwijderen met de shift-toets en ingedrukte rechtermuisknop.

5 Speelfiguur laten bewegen

In de meeste platform games is het gebruikelijk dat er zwaartekracht op je speelfiguur werkt. In je spel zal daardoor je verticale snelheid toenemen zolang je geen vaste grond onder de voeten hebt. We gaan dit programmeren in gamemaker. Eerst maken we de horizontale bewegingen in orde.

5.1 Horizontale beweging

Bij het fruitspel en het drakenspel heb je de objecten laten bewegen met een Move fixed actie. Om onze figuur te besturen is dat niet zo heel handig. Ten eerste moet je een move fixed actie ook weer beëindigen met een no key event en de snelheid blijft constant, ook al druk je vaker of langer op de pijltjestoets.

Voor onze figuur kiezen we dus voor iets anders: als je op de linker of rechter cursortoets drukt, springt hij gewoon een klein stukje naar rechts of naar links. Wel moet je eerst testen of die positie vrij is, want anders kunnen er gekke dingen gebeuren. Dus open het object van je speelfiguur en voeg het Keyboard - Left event toe. Twee acties zijn nodig: Check Empty om te kijken of de relatieve positie (-4,0) vrij is. En daarna Jump to Position om de daadwerkelijke beweging naar (relatieve) positie (-4,0) uit te voeren. Op dezelfde manier kun je de beweging naar rechts programmeren.

Check Empty gaat over de controle van de beweging. Deze actie kun je bij de acties vinden onder het tabblad control. Onthoud dat alles waarmee je dingen kunt controleren, testen of nagaan aantreft bij het tabblad Control.

Zorg ervoor dat je je speelfiguur (character) in de room (level) hebt opgenomen en dat de speelfiguur met de pijltoetsen naar links of rechts kan bewegen.

Door middel van 'Change Sprite' op het tabblad Main1 kan je ervoor zorgen dat je speelfiguur naar rechts of naar links kijkt. Daarbij is het belangrijk om bij de optie 'subimage' van 'Change Sprite' de variabele image_index in te vullen (dat is een ingebouwde variabele in gamemaker om de animatie goed te laten verlopen).

Als je speelfiguur niet in het gewenste tempo beweegt (animeert) dan kan je de animatiesnelheid aanpassen met een stukje code 'Execute a piece of code' (Tabblad Control: Execute Code). Het script dat je dan in moet vullen is bijvoorbeeld image_speed = 0.3; Het getal 0.3 kan hoger of lager zijn afhankelijk van hoe snel je de animatie wil laten werken. Het =-teken spreek je in dit geval uit als 'wordt' omdat een waarde aan de variabele image_speed wordt toegekend.

Door bij je speelfiguur een Keyboard - No key event toe te voegen en daarbij de actie 'Execute a piece of code' met de volgende programmacode if spr_char_right then image_index = 1;

kan je de animatie van de speelfiguur stil zetten op het gewenste frame (hier image_index = 1) als de pijltoetsen niet ingedrukt worden. De code achter de tekens // noemen we commentaarcode. Dat is code voor de programmeur om te onthouden wat de programmacode doet (commentaarcode wordt groen weergegeven).


Game Information - Online Help functietoets F1
Als je eerste les van je game, simulatie of model klaar is, volgt nog de 'finishing touch': voorzie je game van je naam en een duidelijke instructie van wat de bedoeling is en hoe je game gespeeld moet worden. Tijdens het spel kan de speler op functietoets F1 drukken en dan verschijnt de Online help. Voorlopig kan je als 'Online help' volstaan met het invullen van je naam en aan te geven dat je de hoofdpersoon laat lopen met behulp van de pijltjestoetsen.
Die 'Online help' ga je nu eerst even maken:
Klik op Game Information om je game, simulatie of model te voorzien van je voor- en achternaam, je klas en uitleg (zie FAQ punt 21).

Global Game Settings
In de Global Game Settings wordt de maker van de game vermeld en kunnen de instellingen van de game aangepast worden.
Via Global Game Settings vul je op het tabblad info informatie over de auteur(s) van de game in. Voorlopig hoef je bij de Global Game Settings op het tabblad info enkel je naam en klas te vermelden.
Ook kan je via dit tabblad allerlei instellingen voor je game regelen, maar dat bewaren we voor later (zie FAQ punt 22).

Als het goed is heb je nu bij zowel de 'Game Information' (Online Help) als bij de 'Global Game Settings' je voor- en achternaam en klas vermeld. Het is belangrijk dat je dat goed gedaan hebt, want dat gebruikt je docent bij het beoordelen van je game, simulatie of model.

Na deze eerste les heb je de room met de horizontale beweging voor elkaar gekregen. In de volgende les kijken we naar de verticale beweging, springen, vallen, de zwaartekracht, maken we gebruik van mooiere graphics en gebruiken we een tilesheet. Het is belangrijk dat deze eerste les in orde is, want daar ga je op verder.


Les 2

  1. Lees hoofdstuk 5 Speelfiguur laten bewegen door.
  2. Zorg ervoor dat jouw speelfiguur zowel horizontaal als verticaal kan bewegen met de pijltjestoetsen.
  3. Zorg ervoor dat jouw speelfiguur kan springen met de pijltjestoets omhoog.
  4. Zorg ervoor dat jouw speelfiguur vanzelf naar beneden valt als hij nergens op steunt.
  5. Lees hoofdstuk 6 Mooiere graphics door.
  6. Plaats een mooie achtergrond afbeelding in je room.
  7. Download een tilesheet van internet of maak er zelf een met Irfanview of Paint
  8. Ontwerp een level voor je game, gebruik daarvoor de tiles.
  9. Plaats bovenop de tiles je block-object. Maak dat object onzichtbaar

5.2 Verticale beweging

De beweging in deze richting is iets moeilijker. We willen namelijk dat er een zwaartekracht op je speelfiguur werkt. Maar als je figuur op de vloer staat mag hij daar natuurlijk niet doorheen zakken. Er is ook een nadeel aan werken met zwaartekracht: daardoor kan de snelheid veel te groot worden, waardoor de speelfiguur door een platform heen kan zakken.

Dus het idee is als volgt: Kijk eerst of de speelfiguur in de lucht hangt. Ja? -> Stel de zwaartekracht in. Nee? ->Zet de zwaartekracht op 0. Ook moet je kijken of de snelheid niet te hoog is. Zo ja, dan stel je de snelheid in op de maximaal toegestane waarde.

We gaan dit allemaal coderen: Voeg het Step event toe. Alle acties die je bij het Step event neerzet, worden tientallen keren per seconde uitgevoerd. Dat moet hier ook, want we moeten heel vaak per seconde controleren of onze figuur misschien in de lucht hangt en of we dus de zwaartekracht moeten aanzetten. Voeg nu de volgende acties toe: Check Empty om te kijken of de relatieve positie op (0,1) vrij is. Set Gravity met direction 270 en gravity 0.5 . Else. Set Gravity met direction 270 en gravity 0 . Test Variable met variable vspeed, value 12 en operation larger than. Speed Vertical met vert. speed 12.

Als je het allemaal goed hebt gedaan ziet het er zó uit:

Kijk hier hoe de zwaartekracht code er uit ziet

In de afbeelding zie je ook nog een Collision event staan. Dat is nodig omdat het nog niet zeker is dat het speelfiguur juist is geland. Op het moment van de botsing met de vloer moeten we de verticale snelheid op 0 zetten. Maar het kan zijn dat de figuur nog een klein beetje in de lucht hangt. (Dat komt omdat hij na de botsing wordt teruggezet op de laatste plaats waar nog nét geen botsing optreedt.) Daarom verplaatsen we hier de figuur naar de precieze plek van de botsing.

Voeg dus het event toe: Collision met je vloer. In het voorbeeld is dat een block object maar bij jou kan dat anders heten. De eerste acties is: Move to Contact met direction direction, maximum 12 en against solid objects. En de tweede actie is: Speed Vertical met vert. speed 0.

Move to Contact is natuurlijk te vinden op het tabblad Move.

Maar nu moeten we nog zorgen dat je ook kan springen. Met wat we tot nu toe hebben gedaan kunnen we alleen ergens vanaf vallen, maar nog niet springen! Omdat het een beetje gek is als je ook kunt springen terwijl je midden in de lucht hangt, moeten we testen of je figuur op de vloer staat. Als dat zo is, stellen we een verticale snelheid in. Dus voeg het Keyboard - Up event toe, met de actie Check Collision bij relatieve positie (0,1) en Only solid objects. En daarna de actie Speed Vertical met vert. speed -10. De waarde voor de verticale snelheid hangt natuurlijk af van de grootte van je speelveld en je sprites en van de waarde die je eerder aan de gravity hebt gegeven. Je moet maar eens uitproberen wat goed werkt.

5.3 Collision mask

Een collision mask (letterlijk: botsing masker) is een deel van een plaatje dat wordt bekeken wanneer er een botsing met een ander object kan optreden. Bij deze platformgame is het belangrijk om zelf een collision mask te definiëren en niet de precise collision check van gamemaker te gebruiken. Als je dat namelijk wel zou doen, kan je figuur aan de rand van een platform blijven hangen.

Instellingen van het collision mask

In het plaatje kun je zien welke instellingen je moet kiezen. Zeker als je meerdere sprites gebruikt voor één object, moet je er voor zorgen dat elke subafbeelding van élke sprite dezelfde collision mask heeft, want anders kan het mis gaan op het moment dat je van afbeelding wisselt. Je figuur kan dan ineens ergens vast komen zitten.

Controleer dus of je spr_character_left en je spr_character_right precies dezelfde collision mask hebben, zowel bij elke subimage als ten opzichte van elkaar!

6 Mooiere graphics

Voor de achtergrond van je levels kun je eenvoudig plaatjes downloaden van het internet. Er is keuze genoeg. Of misschien kun je zelf een mooie achtergrond maken.

Het plaatsen/maken van een achtergrond in je spel kan je misschien beter als laatste doen. Tenzij het voor het plaatsen van objecten op de voorgrond van je achtergrond (via een tilesheet) handiger is om dat eerder te doen (zie onder). Zorg er wel voor dat je achtergrond dezelfde afmetingen heeft als de afmetingen van je room (zie settings). En anders kan je een en ander bijwerken met Irfan View.

Maar voor de platforms in het speelveld is het niet handig om voor elk verschillend platform een ander object aan te maken. Dat kost veel geheugen en daardoor wordt het spel erg traag. Een veel elegantere oplossing hiervoor is een zogenaamde tilesheet.

6.1 Tilesheet

Hieronder zie je de tilesheet (klik om groter te maken) van Super Mario Bros 3, die we gewoon van het web hebben gedownload. (made by jdaster64) Je ziet dat hij uit kleine (16 bij 16 pixels) figuurtjes bestaat die we kunnen combineren om er grotere tekeningen mee te maken.

Tilesheet van Super Mario Bros 3 (Made by jdaster64)

Je kan de bovenstaande afbeelding downloaden via een rechtermuisklik op de afbeelding (eerst groter maken door er op te klikken) en daarna de afbeelding opslaan in de map waarin je gamebestanden opgeslagen staan. Je kan natuurlijk ook op Internet naar een ander tilesheet zoeken of er zelf een maken.

Eerst moeten we deze tileset in gamemaker inladen. Dat gaat op dezelfde manier als met een achtergrond afbeelding. Klik dus in menu Resources op Create Background, laad de tileset in en vink nu ook Use as a tile set aan. Er verschijnen nu horizontale en verticale lijnen in de tileset en je moet nu de parameters onder Tile properties gebruiken om er voor te zorgen dat alle tiles precies in één eigen vierkantje passen. Zie ook het voorbeeld hieronder.

Tilesheet ingeladen in gamemaker

Als je nu de instellingen van je room opent en op het tabje tiles klikt, kun je een tilesheet kiezen en het level gaan tekenen. Gebruik je fantasie en maak een uitdagend level! Klik hieronder de miniatuur voor een vergroting.

Jij maakt natuurlijk je eigen spel. Onderstaand zie je een voorbeeld van een eerste room. Niet namaken, maar zelf met een beter idee op de proppen komen. Bedenk eens goed waar jouw/jullie game over moet gaan en hoe je daarin zelf verwerkt wordt. Wij leveren hier de ideeën hoe je een en ander kan aanpakken, jij zorgt zelf voor de creativiteit bij je eigen spel. Het is niet noodzakelijk dat je nu al een achtergrond hebt... Je mag dus echt heel wat anders maken. Je moet er wel zelf in voor komen.

De room is gevuld met tiles

Als je nu het spel test, zul je merken dat de tiles die je net hebt gemaakt, nog helemaal niets doen. Je speelfiguur vliegt er dwars doorheen! Dat komt omdat tiles geen objecten zijn, maar gewoon simpele plaatjes, meer niet. Je hebt dus nog steeds de block-objecten nodig en over elke tile plaats je een block-object. In het eigenschappen-venster van het block-object maak je het nu onzichtbaar en dan zie je in het spel alleen de tiles! De block-objecten zijn dan weliswaar onzichtbaar, maar ze zijn er wél dus je speelfiguur kan er gewoon op landen en tegenaan botsen. Klik de miniatuur voor een vergroting.

Over elke tile is een block object geplaatst

Je ziet dat we behalve het eerder gemaakte block object (16 bij 16 pixel), ook andere block objecten hebben gemaakt. Die zijn bedoeld om over kleinere of grotere tiles te plaatsen. Je kunt bij de instellingen van de nieuwe block-objecten als parent het eerder gemaakte block-object instellen, zodat de deze ook alle eigenschappen van het eerste block-object erven.

Zoals je ziet in dit voorbeeld kun je ook andere blokjes maken, waarmee je de grenzen van het spel kan vastleggen. Als je bij de nieuwe blokjes opgeeft dat ze de eigenschappen van het eerder gemaakte blok overnemen (ze hebben dus als parent ('ouder'): het eerder gemaakte blok), hoef je dat niet meer apart te programmeren bij de andere blokjes. Handig! Deze eigenschap noemen we overerving, iets dat vaak gebruikt wordt bij het object georiënteerd programmeren. We gaan er vanuit dat je in jouw game weer geregeld hebt dat dit goed werkt.
In de afbeelding zie je dat obj_block_16 de parent is van obj_block_24.

Je hebt bijvoorbeeld bij je speelfiguur acties geprogrammeerd die gebeuren wanneer je speelfiguur met het eerder gemaakte block botst. Die acties gelden vanaf nu automatisch ook voor alle andere block-objecten!

Dit klinkt misschien even moeilijk maar het concept van inheritance wordt bij alle computerprogramma's ontzettend veel gebruikt en het is dus belangrijk dat je weet wat hiermee bedoeld wordt!

Heb je eigenlijk je eigen alterego al in het spel opgenomen in een grootte die bij het spel past? Gewoon in de room plaatsen en uitproberen of alles wat beschreven is ook daadwerkelijk functioneert. En pas ook hier weer je eigen creativiteit toe.


Les 3

  1. Lees hoofdstuk 7 Monsters en andere gevaren door.
  2. Maak sprites voor minstens één lopend en één vliegend monster.
  3. Programmeer de objecten voor je lopende en vliegende monster.
  4. Maak een 'marker' object waar je monsters tegenaan zullen botsen.
  5. Maak minstens één valkuil in je level.
  6. Lees hoofdstuk 8 Ladders en hellingen
  7. Teken (met de tiles) minstens één ladder in je level.
  8. Maak het ladder object.
  9. Verander de events van je speelfiguur zodat hij ook op een ladder kan bewegen.
  10. Verander de events van je speelfiguur zodat hij zonder te springen op een helling omhoog kan bewegen.

7 Monsters en andere gevaren

Een spel is natuurlijk nooit leuk als er geen uitdaging in zit. Je kunt heel veel dingen verzinnen om het moeilijker te maken, en wat in elk spel wel voorkomt zijn vijanden. We gaan zowel lopende als vliegende monsters maken. Het verschil is dat je lopende monsters kunt vernietigen door er bovenop te springen en dat lukt niet bij vliegende monsters.

7.1 Monsters

Je hebt natuurlijk voor ieder monster weer (minstens) één sprite nodig en een object. In het voorbeeld heeft ons monster twee sprites met ieder twee subimages. Er is een sprite voor als het monster naar links beweegt en ook een sprite voor als het naar rechts beweegt. De subimages zorgen er voor dat je het monster ook echt ziet bewegen. Kijk maar eens naar deze twee subimages van hetzelfde monster: subimage1 en subimage2. Hier zie je wat er gebeurt als we gamemaker deze afbeeldingen snel achter elkaar laten afspelen: imagesachterelkaar. En als het monster straks in je spel beweegt, zie je dit: bewegendmonster

Als je wil hebben dat een monster doodgaat wanneer je er bovenop springt, heb je ook een sprite nodig van een plat monster, bijvoorbeeld: platmonster

7.1.1 Lopende monsters

Maak nu zelf de sprites voor de monsters (of iets anders, bijvoorbeeld spookjes, autootjes, scheepjes,...) in jouw game.
Let op de bewegingsrichting die je ze gaat laten maken. Voor elke bewegingsrichting heb je een bijpassende sprite nodig.

Als monstertje kan je natuurlijk ook een sprite maken van je partner, waarmee je het spel maakt, of van jezelf in een andere outfit. Maar je kan ook op Internet zoeken naar een geschikte sprite. In dat laatste geval is het waarschijnlijk handig om te zoeken naar een animated gif (dus een .gif-bestand).

Een stukje verderop heb je in je game een klimmend monstertje nodig. Misschien handig om, als je zelf in de game voorkomt, al een drietal fotootjes te maken in een klimhouding, zodat je jezelf in het spel kan verwerken. Zoals je al weet verwerk je die fotootjes van jezelf met Irfan View (panorama afbeelding), past de achtergrondkleur aan voor transparantie (doorzichtig maken) en past de grootte van de afbeelding aan voor je spel. Dat laatste kan overigens ook gemakkelijk binnen gamemaker zelf.

Je kunt een vliegend monstertje maken door jezelf wat vleugels te geven. Daartoe roteer je bijvoorbeeld je eigen plaatje/fotootje 90 graden en teken je er wat vleugels op. Maak drie plaatjes en je bent een monsterengel.... Dat tekenen kan gemakkelijk met Paint. Daarna aanpassen met Irfan View en verwerken met GameMaker.

Het markerobject waarover je hieronder leest kan je gemakkelijk in gamemaker zelf maken. Namelijk op dezelfde manier waarop je het zwarte blokje gemaakt hebt. Alleen nog even een kleurtje geven.

Nou, in deze paragraaf komt weer een heleboel aan computertechnieken om de hoek kijken.

Je leert hoe je omgaat met lopende poppetjes, klimmende poppetjes, vliegende poppetjes en hoe je poppetjes op een helling naar boven of naar beneden kunt laten lopen. 

Pak eventueel een papiertje om her en der wat dingen op te schrijven. Want je hoeft echt niet alles van buiten te weten (dat doet je docent ook niet). Maar met wat je hier ziet moet je wel zelfstandig aan de slag kunnen....

Research & Development
Bedenk een scenario voor je eigen game, ontwerp er afbeeldingen bij en bouw de game.
Probeer een serious game (educatief spel) te maken. Bedenk bij je scenario voor welke doelgroep je game (of simulatie) is, wat je er van kan leren en hoe je er voor kan zorgen dat het spel ook werkelijk leuk blijft (uitdagend blijft).
In deze les komt een aantal technieken aan de orde, die je in je game kan gebruiken. Voorwaarde is dat je zelf als hoofdpersoon in de game voor komt.

Beoordeling
Bij de beoordeling van je game wordt rekening gehouden met de moeilijkheidsgraad (het aantal verschillende technieken uit de lessen gametechnologie dat je gebruikt), je creativiteit, het aantal levels en de vormgeving.
Je zou bijvoorbeeld in level 1 (je eerste room) de 6 lessen kunnen verwerken, zoals je hier leert met je eigen speelfiguur. In level 2 (je tweede room) en eventuele volgende levels kan je je creativiteit toevoegen met bijvoorbeeld varende schepen, een gezondheidslevel of wat dan ook. Als je eenmaal de techniek beheerst kan je echt leuke dingen maken!!!
Succes met je game!!!

Wat nu als je geen foto van jezelf wil gebruiken voor de monsters? Dan kun je misschien een tileset downloaden. Hieronder zie je er een. Je kunt er monsters van inladen door in de sprite-editor te kiezen voor 'Create from strip'. Zo heb je heel snel monsters met verschillende subimages en die verschillende richtingen in kijken. Niet vergeten: ook bij ieder monster moeten alle 'collision masks' hetzelfde zijn, dus zorg voor identieke collision masks bij iedere sprite en iedere subimage van het monster! (Zie sectie 5.3 voor collision masks.)

monstertiles

Je kan de bovenstaande afbeelding downloaden door er op te klikken en daarna via een rechtermuisklik op de afbeelding de afbeelding opslaan in de map waarin je gamebestanden opgeslagen staan. Je kan natuurlijk ook op Internet naar een ander tilesheet zoeken of er zelf een maken.

Zodra je de sprites hebt van een monster, kun je de objecten maken. Voor het bewegende monster en het platte monster heb je aparte objecten nodig. Het idee is dat het bewegende monster verandert in een plat monster zodra je speelfiguur er bovenop springt.

Hoe voorkom je dat een monster uit de room beweegt Ook heb je een extra object nodig om te voorkomen dat je monsters uit het speelveld bewegen. Zie hiervoor het rechterplaatje. De kleine blauwe vierkantjes zijn zogenaamde markers. Als een monster tegen zo'n marker aanbotst, beweegt het de andere kant op. Maak maar zo'n marker-object en zorg ervoor dat het niet solid en ook niet visible is. Zodoende zie je het straks niet in beeld maar monsters kunnen er wel tegenaan botsen. Maak je marker object ongeveer even groot (in pixels) als je monsters, anders blijft het monster hangen als hij tegen de marker botst.

We gaan ervanuit dat je nu de volgende sprites hebt gemaakt: spr_monster_left, spr_monster_right en spr_marker. De namen mogen anders zijn en natuurlijk mag je ook nog meer sprites in je spel verwerken.
We gaan ervanuit dat je nu de volgende objecten gemaakt hebt: obj_monster en obj_marker. De namen mogen anders zijn en natuurlijk mag je meer objecten in je spel verwerken.
Neem daarna instanties van obj_monster en obj_marker op in je room (zie afbeelding).

Markers plaatsen

Als dit klaar is kan je verder gaan met de les. Daarin gaan je onder andere de beweging van een monster regelen.
Sla je werk regelmatig op en bewaar een backup. Maak bij het opslaan gebruik van versienummers om te voorkomen dat je werk verloren gaat. Overigens is het gebruik van een usb-stick tijdens de lessen handig, maar je mag je werk natuurlijk ook steeds op de ELO in je e-Portfolio bewaren.

Laten we eerst het gedrag van een monster eens programmeren. Dat is snel gebeurd. Als het monster gemaakt wordt, moet het gaan bewegen, dus maak een Create event met een Move - fixed actie. Bij een botsing met een marker moet het monster omdraaien, dus programmeer een Collision event met een Reverse horizontal actie. Tenslotte zie je in de figuur hieronder hoe je met een End Step event ervoor kunt zorgen dat de monsters steeds in de richting kijken waarin ze bewegen. Zo'n End Step event gebeurt een aantal keren per seconde, juist voordat gamemaker het monster op het scherm tekent. Als de snelheid negatief is, kijkt het monster naar links en als de snelheid positief is, kijkt het monster naar rechts.

monsterobject

Let op: als je meerdere subafbeeldingen hebt voor een monster en je wil die ook allemaal gebruiken, moet je bij de Change sprite actie bij subimage image_index invullen. Gamemaker laat dan alle subimages met korte tussenpozen één voor één zien. Die tussenpozen kun je langer maken door een kleiner getal bij speed in te vullen.

Test de beweging van je monster en controleer of het monster steeds naar de juiste richting kijkt.

Maak nu ook een object voor het platte monster. (Eerst heb je weer een sprite nodig, maar dat gaat weer met de sprite-editor. Je kunt met de optie 'Scale' het monster in de verticale richting plat duwen.)

We gaan ervanuit dat je spr_monster_plat gemaakt hebt en daarna obj_monster_plat bij de objecten hebt opgenomen. De namen mogen anders zijn. Voor het vervolg is het nodig dat je een plat monster hebt. Je hoeft nog geen instantie van obj_monster_plat in de room op te nemen.

Zo'n plat monster moet na een tijdje vanzelf verdwijnen, of je kunt het ook regelen dat een plat monster na een tijdje weer genezen is en weer verder loopt. Dat kan bijvoorbeeld bij een schildpad. Laten we eens kijken hoe je dat in orde maakt. Open het object van het platte monster en voeg een Create event toe met één actie: Set alarm.

We gebruiken dit om een tijdje te wachten totdat het monster weer moet gaan bewegen. Er gaan ongeveer 30 steps in een seconde, kies daar zelf een verstandig getal. Bij het alarmnummer kun je het eerste alarmnummer nemen wat nog vrij is, bijvoorbeeld alarm 0. Door het zo in te stellen wind je eigenlijk een wekker op die over een bepaald aantal steps begint te rinkelen. Op dat moment wordt een Alarm event gegenereerd, dus voeg het Alarm 0 event toe en kies de juiste actie.

Als je het monster weer wil laten leven, kies je voor de Change instance actie (zet 'yes' bij Performing events).

En als je het platte monster wil laten verdwijnen gebruik je de Destroy instance actie.

Nu moeten we nog zorgen dat je af bent als je een monster raakt, tenzij je het monster van boven raakt. Dat doen we bij het object van je speelfiguur. Open dat en voeg een Collision event toe met het monster. Hieronder zie je welke acties je minimaal nodig hebt. Eerst moet je kijken of je wel bovenop het monster springt. Daarvoor moeten we een uitdrukking bekijken met de Test expression actie:

vspeed > 0 && y < other.y + 13

Hier testen we twee dingen: ten eerste of het speelfiguur wel naar beneden beweegt (met vspeed > 0) en ten tweede of de botsing wel plaatsvindt in de buurt van de bovenkant van het monster (met y < other.y + 13). Het getal 13 hierin hangt af van de grootte van je monsters, gemeten in pixels. Je zult wat moeten experimenteren om een geschikte waarde te vinden. Het vervelende hier is dat het getal ook afhangt van de oorsprong die je hebt gekozen bij de sprites van je speelfiguur. In ieder geval geldt: hoe lager het getal, hoe moeilijker het voor de speelfiguur is. Als je merkt dat je het altijd wint van een monster bij een botsing, kies dan een lagere waarde. Het kan zelfs zo zijn dat je een negatieve waarde nodig hebt!

Acties bij een botsing met een monster

Daarna programmeer je wat er moet gebeuren als je het monster hebt geplet. Het monster stilzetten met Move fixed en verander het daarna in een plat monster. Als je verloor van het monster, dan ben je af en kun je het speelveld opnieuw starten.

Test je spel en breng eventuele verbeteringen aan.

Je hebt geleerd hoe je met het alarm-event (timer) een object na een bepaalde tijd weer tot leven kunt laten komen of vernietigen (opruimen) in het spel.

Ook heb je geleerd hoe je het collision-event kunt gebruiken om te controleren of je op een object springt (van boven benadert) met behulp van de 'Test expression-actie'.

De code vspeed > 0 && y < other.y + 13 gebruik je om bepaalde acties voor elkaar te krijgen als aan bepaalde voorwaarden is voldaan:

IF vspeed > 0 AND y < other.y + 13 THEN {programmeeracties}; dus

ALS object naar beneden beweegt EN y(object) < y(ander object)+13 THEN {programmeeracties}.

Handige technieken om je game interactief te maken.

7.1.2 Vliegende monsters

Vliegende monsters zijn eigenlijk nog eenvoudiger dan lopende monsters. We regelen het namelijk zo dat je een vliegend monster niet kunt vernietigen door er bovenop te springen. Daardoor wordt het Collision event wat eenvoudiger.

7.2 Valkuilen

Hoe maak je een valkuil Een valkuil kun je maken door op de bodem een aantal instanties van een valkuil object te plaatsen. Als je speelfiguur zo'n object raakt, ben je af. Inmiddels zou je moeten weten hoe je dat voor elkaar krijgt. Natuurlijk moet je dat valkuil object wel onzichtbaar maken en in het spel teken je de valkuil met de tiles uit de tilesheet.

8 Ladders en hellingen

Tot nu toe kan je speelfiguur alleen maar naar links of rechts bewegen en springen. In het voorbeeld hierboven hebben we al een ladder getekend (de groene plantenstengel), maar die werkt (natuurlijk) nog niet (want die bestaat uit tiles en niet uit objecten). In deze paragraaf leer je hoe je zo'n ladder programmeert.

8.1 Ladder

Ladder object over tiles heen Eerst hebben we een ladder object (we noemen het obj_ladder) nodig met een sprite die uit een verticaal gericht blokje bestaat. Dit object mag natuurlijk weer niet visible en evenmin solid zijn.

Maak spr_ladder en obj_ladder aan. Teken een ladder verticaal naar boven in je room. Door de shift-toets samen met de linkermuisknop te gebruiken kan je gemakkelijk de obj_ladder instanties (verticale blokjes) plaatsen.
Met behulp van de alt-toets heb je een fijn-regeling (fine-tuning) als je de instanties op een bepaalde plek wilt zetten.
In de rest van het verhaal gaan we ervanuit dat je een verticale ladder in je room hebt gemaakt. Met behulp van geschikte tiles kan je de ladder mooie graphics geven (maar dat kan je eventueel ook later nog doen).

Als onze speelfiguur in contact is met dit object, moet de zwaartekracht uitstaan en kan hij ook niet springen. Dat gaan we in het Step event regelen. Bovendien moeten we andere acties programmeren bij de <Up> en de <Down> toetsen.

Acties bij <Down> Open de eigenschappen van de speelfiguur. We beginnen met het event voor de cursortoets <Down>. Als we op de ladder staan willen we naar beneden, dus voeg de volgende acties toe: Check object met obj_ladder, positie (0,0) en natuurlijk relative. Daarna Check empty met positie (0,3) voor only solid objects en ook weer relatief. Vervolgens Jump to Position (0,3) en relatief. Deze laatste twee acties moeten tussen haakjes, zoals in het voorbeeld rechts.

haakjes Let goed op de vinkjes bij 'relative', want we gaan nu niet uit van de absolute coördinaten.
Met haken of haakjes worden de tekens in de afbeelding bedoeld.

Acties bij <Up> Nu passen we de acties bij het <Up> event aan. Hier links zie je wat er al stond. Zet daar maar haken om heen, met de Start Block en End Block events. We gaan weer controleren of je speelfiguur in contact is met de ladder, zo ja dan kan hij met de pijltjestoets omhoog bewegen en zo nee, dan gebeurt er gewoon wat er al stond. Bovenaan in de lijst Actions plaats je dus een actie Check object met obj_ladder, positie (0,0) en relative. Nu starten we weer een block met Start Block. Daarna Check empty met positie (0,-3) voor only solid objects en ook weer relatief. Vervolgens Jump to Position (0,-3) en relatief. Nu beëindigen we het block met End Block en tenslotte moet er nog een Else komen staan. Hier kun je controleren of je het goed hebt gedaan.

Tenslotte bewerken we het Step event. Helemaal aan het einde van de lijst acties gaan we kijken of je speelfiguur op de ladder staat. Dat doen we weer met een Check object met obj_ladder, positie (0,0) en relative. Start nu een block met Start Block. Nu zetten we zowel de zwaartekracht als de verticale snelheid op nul, dus Set Gravity met direction 270 en gravity 0 en Speed Vertical met vert. speed 0. Als je een aparte sprite hebt gemaakt voor als je speelfiguur op de ladder staat, dan kun je die nu in beeld brengen met Set Variable waarbij je image_index de waarde geeft van het plaatje dat je wil zien (Bijvoorbeeld 0, of 1). Vergeet niet het block af te sluiten met End Block.

gebruik ladder

Als het goed is, kan je poppetje nu ook de ladder gebruiken. Test je werk maar eens even om te kijken of alles werkt zoals het zou moeten.

8.2 Helling

Het is voor je game heel 'leuk en natuurlijk' om je speelfiguur over een helling te laten bewegen. Je hoeft er niet zoveel voor te programmeren, maar je moet natuurlijk wel weer zorgen voor geschikte sprites en objecten.

heuvel maken

Daarna breng je de benodigde instanties, om de helling of heuvel mee op te bouwen, in je room.

Vergeet niet om de aangemaakte objecten de eigenschappen te laten overerven (inheritance) van het eerder gemaakte blokje obj_block of obj_block_16.

Maak nu eerst de sprites en objecten voor de heuvel aan en bouw daarna de heuvel in de room met de desbetreffende instanties.

In het volgende stukje leer je de beweging over een heuvel programmeren.

Onze speelfiguur kan tot nu toe alleen over horizontale platforms lopen. Als het platform een beetje omhoog loopt, moet hij persé springen. Het zou leuk zijn als lopen ook kan over een niet al te steile helling. Om dat te programmeren veranderen we de acties bij de <Left> en <Right> events.

Open de eigenschappen van je speelfiguur en kijk bij het <Left> event. Er staan nog maar twee acties, namelijk een test om te kijken of de positie 4 pixels links van het speelfiguur leeg is en als dat zo is de actie jump naar die positie. Je bent nu zelf ervaren genoeg om de volgende wijzigingen aan te brengen. Dit moet er namelijk gebeuren als de speler op de linker cursortoets drukt:

Als je er echt niet uitkomt, kun je hier kijken. Natuurlijk niet vergeten dat je ook de acties bij het <Right> event programmeert!

room les 3

In dit lesblok heb je allerlei technieken geleerd om je speelfiguur en andere figuren te laten bewegen en te laten reageren op de omgeving.
In het volgende blok leer je views gebruiken om je spel dynamischer te maken. En je leert hoe je de speelfiguur kunt laten schieten en dergelijke acties. Een actie noemen we ook wel een methode (iets dat je het object kan laten doen).

Intussen heb je al drie lessen gametechnologie erop zitten en moet je al een behoorlijke 'feeling' ontwikkeld hebben op het gebied van programmeren en gametechnologie: 'research & development'. Zaken die een belangrijke rol spelen in het HBO en op de universiteit

Les 4

  1. Lees hoofdstuk 9 Views gebruiken door.
  2. Stel een view in zodat er ingezoomd wordt op deel van je room.
  3. Zorg ervoor dat het spel wordt herstart zodra je speelfiguur buiten de room beweegt.
  4. Lees hoofdstuk 10 Schieten door.
  5. Maak voor de kogel een sprite en een object.
  6. Maak voor de ammunitie een sprite en een object.
  7. Pas het kogel object en het speelfiguur object aan zodat je voortaan ook kunt schieten.

9 Views gebruiken

Tot nu toe hebben we steeds de hele room in beeld gehad. Maar dat maakt het spelen minder spannend. Het is leuker als je maar een deel van de room kunt zien, rondom je speelfiguur.

Voorbeeld view

Dan moet je namelijk zelf ook de juiste weg door de platforms zoeken. De ontwerper kan nu ook dingen verbergen in moeilijk te vinden uithoeken van het level.

Gelukkig is deze functionaliteit in gamemaker ingebouwd. Zoek de eigenschappen van de room en klik op het tabje 'views'. Klik op het vinkje bij Enable the use of views. Selecteer de eerste view (view 0) en klik op het vinkje Visible when room starts zodat deze view zichtbaar wordt. Vul een lengte en breedte in (bijvoorbeeld 320 bij 240). Bij X en Y hoef je niets in te vullen omdat we gaan zorgen dat je speelfiguur altijd in beeld is. Met Port on screen hoef je ook niets te doen omdat we maar één view hebben.

Gebruik van views

Onder in het eigenschappenvenster kun je aangeven welk object je wil volgen. Dat is natuurlijk je speelfiguur. Het beeld schuift dan altijd met je speelfiguur mee. Om er voor te zorgen dat het speelfiguur niet te dicht bij de rand komt, vullen we 80 in bij Hbor en Vbor zodat er altijd minstens 80 pixels rondom je speelfiguur zichtbaar zijn. Om geen abrupte bewegingen te krijgen van het venster kiezen we 6 voor de maximale snelheid waarmee het venster verschuift. Misschien moet je deze waarde nog wat aanpassen nadat je het spel hebt getest.

Als je de instellingen in de room gemaakt hebt en op het groene vinkje klikt, kan het zijn dat de melding (Warning) 'There are instances of tiles outside the room ...' verschijnt.

In het algemeen kan je dan maar het best op 'No' klikken (maar beredeneer even wat met de vraag bedoeld wordt, zodat je de melding begrijpt).

Bij het testen zul je merken dat het speelveld nu wel heel klein wordt. Dat los je op door bij de Global Game Settings een zoom (Fixed scale) van 200% in te stellen.

9.1 Buiten speelveld

Misschien heb je al eens gemerkt dat je speelfiguur nog buiten het speelveld kan springen. Je kunt het op meerdere manieren oplossen, maar in ieder geval is het veilig om in te bouwen dat je hebt verloren zodra je buiten beeld bent. Dat doe je met het Outside room event. Vul bij de acties een Test variable in. Kijk hiermee of de variabele y groter is dan room_height. In dat geval is het speelfiguur al lager dan de bodem van het level gevallen en kun je toch niet meer terug. Dus voeg daarna de actie Restart room toe.

10 Schieten

Tot nu toe kun je monsters alleen vernietigen door er bovenop te springen. Maar als je ze ook kunt schieten wordt je spel weer wat afwisselender en leuker. Bovendien is het niet eens vreselijk moeilijk te programmeren. Je hebt wel een sprite nodig van een kogel en natuurlijk een object. De sprite kun je misschien zelf tekenen maar je mag hem ook downloaden:

Kogel

Je kan de kogel downloaden door er op te klikken en daarna via een rechtermuisklik op de afbeelding de afbeelding opslaan in de map waarin je gamebestanden opgeslagen staan. Je kan natuurlijk ook op Internet naar een andere afbeelding zoeken of er zelf een maken.

Het is het eenvoudigst te programmeren als je speelfiguur onbeperkt kan schieten. (Dus dat doen we lekker niet). Ergens in het spel leggen we ammunitie en zodra je speelfiguur die heeft opgeraapt, kan hij een beperkt aantal kogels schieten. Het object ammunitie heeft alleen maar een sprite en doet verder niets. Het ligt er gewoon totdat de speler er tegenaanbotst. Dit ammunitie object moet je natuurlijk nog wel even maken en in de room plaatsen. Niet vergeten want anders kun je niet schieten!

We gaan ervanuit dat je zoiets als spr_ammo en obj_ammo gemaakt hebt in je game en dat je op een of meer plekken in je room een instantie van obj_ammo geplaatst hebt.

Bij de eigenschappen van je speelfiguur gaan we wat meer veranderen:

Nu heb je een nieuw te maken kogel object nodig. We gaan er voor zorgen dat een kogel verdwijnt als het buiten de room belandt, tegen een muur aanbotst of tegen een monster aanbotst. In het laatste geval verwijnt het monster natuurlijk ook.

Open de eigenschappen van je kogel object en ...

We moeten er alleen nog voor zorgen dat de speler ook kan schieten als hij ammunitie heeft. Schieten gebeurt natuurlijk met de spatiebalk. Als er ammunitie is, wordt er een instantie van het kogel object gemaakt en de variabele ammunitie wordt met 1 verminderd. Maar er is één moeilijkheid: de kogel moet in de goede richting gaan, namelijk in de richting waarin je speelfiguur kijkt. Dat testen we met de variabele sprite_index. Voor de verandering geven we een plaatje met de acties bij dit event. Je moet zelf bij de acties de juiste parameters invullen!

Acties bij de spatiebalk

Het kan verstandig zijn bij de sprite van de kogel, spr_kogel, op de knop center te klikken, om de oorsprong van de kogel te beïnvloeden. Dit heeft namelijk invloed op de plaatsing van de kogel in je room en hoe de kogel ten opzichte van het poppetje afgevuurd gaat worden.

Je moet er rekening mee houden dat als je op de spatiebalk drukt het poppetje een kogel afvuurt. De x en y coördinaten van 'Create Moving' moeten zodanig ingesteld zijn dat de kogel niet meteen het poppetje raakt. In dat geval zou de kogel al verdwijnen voordat je deze in je game ziet. Laat dus de kogel ontsnappen (creëer de kogel) buiten de positie van het poppetje.

Regel de x en y ook goed af om de kogel uit de gewenste plek van het poppetje te laten komen, bijvoorbeeld uit de mond of zo ;-)

Overigens, zoals je vast al gezien hebt, maak je niet gebruik van het 'Keyboard'-event om de kogel af te vuren maar van het 'Key Press'-event. Beredeneer waarom.

In de volgende les leer je hoe je de score kunt bijhouden en hoe je bepaalde zaken kan verzamelen die punten of extra levens op kunnen leveren.

Les 5

  1. Lees hoofdstuk 11 Score bijhouden door.
  2. Pas de eigenschappen van je speelfiguur aan zodat je punten krijgt voor het schieten en pletten van monsters.
  3. Zorg ervoor dat de score en informatie over je levens in beeld staan.
  4. Lees hoofdstuk 12 Voedsel of munten verzamelen door.
  5. Maak een sprite en een object van een muntje of iets anders wat je wil laten verzamelen.
  6. Stel in dat je voor iedere 25 muntjes een leven bij krijgt.

11 Score bijhouden

11.1 Punten verdienen

Tot nu toe heeft onze speler nergens punten kunnen verdienen. Dat hoort natuurlijk niet zo. Bij een spel moet je kunnen winnen, maar je moet ook een score verdienen om te vergelijken met die van andere spelers. De vraag is nu: bij welke gebeurtenissen krijg je punten? Dat kan zijn als je een room hebt uitgespeeld, of als je een monster hebt vernietigd. Zoek bij de eigenschappen van je speelfiguur maar eens terug naar deze events en voeg daar op de juiste plaats een actie toe die de score verhoogt. Je kunt zelf een verstandige keuze maken hoeveel punten zo'n actie waard is.

11.2 Score informatie op het scherm tonen

Nu kunnen we dan wel punten verdienen, maar we zien de score nog niet op het scherm. En als we toch bezig zijn met informatie op het scherm tonen, laten we daar dan gelijk ook tonen of we nog kogels hebben en hoeveel levens er nog over zijn.

We maken het scorepanel met een veel voorkomende techniek: met een achtergrond object. We noemen het (verrassend) obj_achtergrond en geven het geen sprite. Dit object gaat alle taken uitvoeren die op de achtergrond moeten gebeuren, dus niet direct iets met een bewegend voorwerp uit het spel te maken hebben.

Maak een object obj_achtergrond (let op: ook al voert dit object taken uit op de achtergrond, toch moet je het vinkje bij Visible aanklikken!) en voeg het Game start event toe. In dit event geef je de speler 3 levens met de Set lives actie. Gamemaker heeft een standaardmechanisme om de score te laten zien, maar dat gaan we niet gebruiken. We willen namelijk zelf een mooiere manier programmeren. Dat standaardmechanisme zetten we uit met de actie Score caption. Selecteer zowel bij lives, health als score: don't show.

Voeg nu ook het No more lives event toe en maak twee acties: Show highscore en Restart game. Zorg natuurlijk voor een mooie opmaak bij de highscores!

Tenslotte gebruiken we het Draw event om onze gegevens op het scherm te tonen. Hier onder zie je welke acties daar in staan.

Acties bij het draw event

Achtereenvolgens:

Het is wat lastig om precies te bepalen waar deze figuren getekend moeten worden. In het voorbeeld tekenen we ze linksboven. In gamemaker heeft de linkerbovenhoek van het speelveld de coördinaten

(view_xview , view_yview).

In het voorbeeld tekenen we de groene rechthoek 5 pixels naar rechts en naar beneden, terwijl de rechthoek 95 pixels breed en 45 pixels hoog is. Voor de andere elementen van het scorepanel is de positie ook steeds te bepalen uitgaand van view_xview en view_yview. Misschien moet je nog een nieuwe sprite maken voor het poppetje dat de levens aangeeft, maar het kan zijn dat je al een geschikte sprite in je spel hebt zitten.

Parameters bij de draw rectangle actie Voorbeeld van het scorepanel met de levens

Misschien schrik je nog van de actie Test variabele in ander object. De variabele die informatie over de hoeveelheid ammunitie bevat, is gemaakt in het object obj_character. Daarom moet je er naar verwijzen door eerst de objectnaam op te schrijven, dan een punt, en dan pas de naam van de variabele, zoals we hier in deze actie ook gedaan hebben.

Achtergrondobject in room Maar als je het spel nu test gebeurt er nog niets. Je ziet geen scorepaneel in beeld. Dat komt omdat we het object obj_achtergrond nog in de eerste room moeten plaatsen. Omdat het object geen sprite heeft, zie je een blauw rondje met daarin een vraagteken nadat je het in de room zet. Test je werk maar eens, en kijk of je inderdaad het scorepaneel in beeld krijgt.

Nu het Draw event klaar is, wil dat niet zeggen dat je speelfiguur al punten kan scoren en levens kan verliezen. Bij elke botsing van het speelfiguur met een monster, maar ook bij elke botsing met het valkuil object, en bij het outside room event, moet je zelf programmeren dat er een leven af gaat en dat de room (en niet het spel) opnieuw gestart wordt. Bovendien moet je elke keer dat je een monster plet of schiet, punten bijkrijgen. Daar kun je zelf voor zorgen. Een kleine hint: al deze events die je moet aanpassen zitten in je speelfiguur-object en je kogel-object.

12 Voedsel of munten verzamelen

Behalve ammunitie kun je nog veel meer dingen in je spel verstoppen die de speler moet zien te vinden, bijvoorbeeld voedsel of munten. In ons voorbeeld hebben we ook munten verstopt. De sprite voor een muntje was heel eenvoudig te maken, omdat onze tilesheet plaatjes voor munten bevatte. Met de optie Edit Sprite en Add from strip kun je eenvoudig de vier sprites uit de tilesheet snijden die bij de muntjes horen, kijk maar:

Afbeeldingen van munten in de sprite zetten

Nu maak je een object obj_munt en je geeft het deze sprite als afbeelding. Als de speler met zijn figuur botst met een muntje, gaan we de score verhogen maar we gaan ook bijhouden (dat kan natuurlijk met een variabele in het object van de speelfiguur) hoeveel munten hij al heeft opgeraapt. Voor iedere 25 (aantal kun je zelf kiezen natuurlijk) munten krijgt hij er dan bijvoorbeeld een leven bij. Probeer maar eens of je dit kunt maken.

Les 6

  1. Lees hoofdstuk 13 Geluid door.
  2. Laat gamemaker geluiden afspelen als je een monster plet, een muntje pakt of een leven verliest.
  3. Lees hoofdstuk 14 Winnen door.
  4. Zorg ervoor dat de highscores in beeld komt als je het laatste level hebt uitgespeeld.
  5. Lees hoofdstuk 15 En nu verder... door.
  6. Kies één van de mogelijkheden uit hoofdstuk 15 uit om nog te realiseren.
  7. Lees hoofdstuk 16 De beoordeling door.

13 Geluid

Een spel is leuker als bij sommige gebeurtenissen een geluid wordt afgespeeld. Bijvoorbeeld als je een kogel schiet, of als je geraakt wordt door een monster, of als je in een valkuil valt, of als je een muntje opraapt.

Geluiden in je spel stoppen is niet moeilijk. Je hebt dan wel een geluidsbestand nodig. Je kunt het zelf componeren, of opnemen met de geluidsrecorder maar natuurlijk ook downloaden. Bovendien levert gamemaker een heleboel geluidsbestanden mee in de Sounds-folder in de installatie-folder. Klik hier om een paar geluidsbestanden te downloaden die bij dit spel horen. Je kunt geluiden in je game brengen door ze aan te maken met Create sound uit het menu Resources of het knopje op de werkbalk.

Laten we eens kijken hoe we een geluid afspelen als je een leven verliest. Het mooiste effect krijg je als je bij de botsing met het monster onmiddellijk het geluid afspeelt, en daarna een korte pauze inlast. De speler heeft dan even tijd om te beseffen dat hij een leven kwijt is. Dat ziet er bijvoorbeeld zo uit als hieronder. Als je botst met het monster, gaat er een leven af, wordt het geluid 'snd_auw' afgespeeld, wachten we één seconde en starten we de room opnieuw.

Acties wanneer je af bent

Natuurlijk moet je geluid toevoegen bij alle mogelijke botsingen met monsters, muntjes of de valkuil en wanneer je een kogel wegschiet. Kortom, loop bij je kogel-object en obj_character weer alle events na om te kijken of daar geluid bij moet.

Je kan in gamemaker niet twee verschillende .mp3-bestanden gelijktijdig afspelen. Als je dus voor je achtergrondgeluid en voor je effecten .mp3-bestanden kiest dan zal het achtergrondgeluid ophouden met spelen als er een effect plaats vindt. Dit probleem kan je oplossen door voor het achtergrondgeluid bijvoorbeeld een .wav-bestand of een .mid-bestand te maken of te zoeken. Maak je geluidsbestanden niet te groot. De gehele omvang van je game moet namelijk onder de 8 MegaByte blijven, want anders is de game niet via de ELO in te leveren. Een geluidsbestand kan je gemakkelijk inkorten of bijwerken met het open source programma Audacity. Audacity staat op het educatief netwerk op school maar je kan het ook gemakkelijk downloaden en installeren op je eigen computer.

14 Winnen

Spellen zijn pas leuk als je ze kunt winnen. Onderweg moet je moeilijkheden overwinnen, het kan zelfs zijn dat je eerst een paar keer verliest, maar uiteindelijk wil je winnen. Maar ons spel heeft nog geen einde. Ergens in je room moet je een object plaatsen dat het einde van het level aangeeft. Een botsing met dat object start dan de volgende room (als die er is). Maak eerst dit object voordat je verder gaat, noem het obj_eindelevel

In de eigenschappen van je speelfiguur maak je een nieuw event, een collision met obj_eindelevel. Zorg voor de volgende acties:

15 En nu verder...

Je hebt nu al flink wat mogelijkheden gezien die je kunt gebruiken in je platform game. Als je nog meer wil, moet je je fantasie laten werken!

Wat nu belangrijk is, is dat je je eerste room uitprobeert totdat je tevreden bent. Hij moet niet te makkelijk zijn, maar ook niet te moeilijk.

Wat is er daarna nog mogelijk? Enkele ideeën:

Online Help functietoets F1
Als je game klaar is volgt nog de 'finishing touch': voorzie je game van een duidelijke instructie van wat de bedoeling is en hoe je game gespeeld moet worden. Tijdens het spel kan de speler op functietoets F1 drukken en dan verschijnt de online help. Die moet je natuurlijk wel even maken. Klik op Game Information om je game, simulatie of model te voorzien van uitleg (zie FAQ punt 21).

Maker(s) van de game en instellingen game
Via Global Game Settings kan je bij het tabblad info informatie vermelden over de auteur(s) van de game. Ook kan je via dit tabblad allerlei instellingen voor je game regelen. Probeer een en ander maar eens uit en kies die instellingen waarbij je game het best uit de verf komt (zie FAQ punt 22).

16 De beoordeling

In de game moet je zelf verwerkt zijn. In het eerste trimester heb je geleerd hoe je van jezelf een animated gif kunt maken. In het begin van de lessen gametechnologie is dat nog even kort aangestipt.
Het moet echt een eigen game worden. Verwerk in de game dan ook een 'eigen verhaal' en eigen sprites.
De broncode van de game (dus niet de executable), dat is het bestand game_naam.gm81, lever je in op de ELO.
Het cijfer voor de game telt mee voor je proefwerk pw2 van het tweede trimester.