Een simulatie maken met Gamemaker Versie: 1.0 Datum: 11 december 2009 Auteur: www.gamescool.nl Deze tutorial komt uit onder de Creative Commons Attribution-NonCommercial-ShareAlike 2.5 Licentie
De laatste tijd hoor je heel veel over zogenaamde Serious Games. Dat zijn games die een bepaald nuttig doel hebben, zeg maar games ‘waar je wat van kunt leren’. Een aparte categorie binnen de serious games zijn de simulaties. Eigenlijk zijn simulaties helemaal geen games en eigenlijk bestaan simulaties al tientallen jaren. In de tweede wereldoorlog werden er al simulaties gemaakt voor piloten, natuurlijk nog zonder computers, maar het waren wel echte oefenkasten om gevechten met de vijand mee te ‘simuleren’. Bij een game is er een bepaald doel, vaak het winnen van de tegenstander. Bij simulaties gaat het niet zozeer om het doel, maar om het observeren van processen. Vandaar dat ze zo geschikt zijn voor studie en onderzoek. Het maken van een simulatie kost veel tijd, en is werk van specialisten. Bovendien moet je behoorlijk kunnen programmeren, als je een computersimulatie wilt maken. Vandaar dat ik eens wilde kijken of je met een goedkoop en eenvoudig te leren programma als Gamemaker ook een simulatie kan maken. Een groot voordeel van het werken met Gamemaker is dat de docenten, die inhoudsdeskundigen zijn, zelf hun simulatie kunnen maken voor gebruik in de lessen, al dan niet samen met leerlingen. Lees de tutorial hieronder verder, om te zien hoe je met relatief simpele middelen en zonder al te ingewikkeld programmeerwerk een simulatie kunt maken in Gamemaker. Tutorial: SOA simulatie in Gamemaker Niveau: half gevorderd Voorkennis: de eerste 5 lessen van www.gamescool.nl Lesdoel: introductie in GML, verder begrip van objecten en instanties, werken met eigenschappen (properties) van instanties. Uitgangspunt van deze tutorial is dat zo min mogelijk gebruik is gemaakt van GML (Game Maker Language) om het zo toegankelijk mogelijk te houden. Desalniettemin gebruik ik het hier en daar, omdat het veel makkelijker was dan met de ‘klik en klaar’ symbolen in Gamemaker en om te laten zien dat GML niet moeilijk is. Waar gaat deze simulatie over? De simulatie die gebouwd gaat worden gaat over de overdracht van Seksueel Overdraagbare Aandoeningen (SOA’s). Niet echt een vrolijk onderwerp, maar wel belangrijk en blijvend actueel. Zoals bij alle simulaties, is er een onderliggend model
dat we gaan programmeren. In dit geval met Gamemaker. Alhoewel ik geen lesbrief heb gemaakt en ook niet heel diep in ga op het didactische gebruik van de simulatie, is hij bedoeld voor gebruik bij jongeren. Bijvoorbeeld in de klas als onderdeel van seksuele voorlichting, maar er kan ook gedacht worden aan een voorlichting simulatie in een campagne tegen de verspreiding van HIV. Wat te denken van een ‘SOAsimulatiezuil’ in een uitgaanscentrum? Dat is weer eens wat anders dan de ouderwetse arcadekast! Stap1: het werkveld maken Start Gamemaker op. Je hebt de geregistreerde versie nodig, versie 6.1. Ga naar
en dan naar stel dan op het tabblad de resolutie in op <1024 x 768>. Klik eerst <Set the Resolution of the Screen> aan. Het klopt dat er nog steeds oude monitoren gebruikt worden met 600 x 800 pixels, maar voor onze simulatie is dat te weinig. Dus helaas voor de oude bakkies! Stap 2: De sprites Ga naar de sprites mapje, klik dit aan met je rechter muisknop om sprites toe te voegen. Klik op . Bij Gamemaker wordt een aantal sprites meegeleverd. Kies hiervan de “dot” sprite. Die sprite is te vinden in het “pacman” mapje, bij de gamefiles van Gamemaker. Noem de sprite “mannetje”. Kopieer de sprite en noem de tweede sprite “vrouwtje”. (Dit doe je door de sprite aan te klikken me de rechter muisknop en dan te kiezen.) Deze dot worden de mannetjes en vrouwtjes in onze simulatie. Als je wilt kan je ze later vervangen door realistischer plaatjes, maar voor nu voldoet dit. Althans, we moeten natuurlijk wel kunnen zien of het om een mannetje dan wel om een vrouwtje gaat. Dubbelklik het “mannetje” sprite aan. Klik op <Edit Sprite> en dubbelklik dan op de dot. Je komt in een soort Paint scherm terecht (Paint is een simpele graphics edittor uit Windows). Klik een paar keer op het vergrootglas om het beter te kunnen zien. We gaan ons mannetje een kleur geven. En welke kleur hebben mannetjes....juist! blauw! Kies een mooie blauwe kleur rechts in het kleurenpalet en maak je dot mooi blauw. Doe het zelfde met de vrouwtjes sprite, maar maak deze....juist!...roze. Het is maar dat we het verschil kunnen zien, andere kleuren zijn natuurlijk ook toegestaan. Verder gebruiken we in deze simulatie nog een doodshoofd, een bloemetje en een bijtje. Bij de resource files op www.yoyogames.com zijn deze plaatjes te vinden en voor het gemak heb ik ze ook bij de files van deze tutorial bijgevoegd. Laadt ook een ‘dood’ sprite , een bloemetje-sprite en een bijtje-sprite in Gamemaker in. (Guess, guess, waar zouden deze sprites voor gaan dienen...). De bloemetjes, bijtjes en het doodshoofd plaatjes heb ik wat verkleind zodat ze in proportie blijven met de dots. Je kan dit doen in Paint (windows programmaatje) of in de interne sprite editor van Gamemaker.
Stap 3: Objecten We gaan een groep van 100 jongeren simuleren die elkaar ontmoeten, soms ook sex met elkaar hebben, soms veilig, soms onveilig en waarvan er 1 jongere bij aanvang van de simulatie besmet is met een SOA. Maak een nieuw object aan door met de rechter muisknop op het mapje te drukken. Noem dit object “Mens”. Maak vervolgens een aan door met je rechter muisknop op het mapje te drukken. Geef de room een mooie naam, zoals “proeftuin”, “simulatie kamer”, “E-lab” of iets dergelijks, en geef de room desgewenst nog een mooie achtergrondkleur, anders dan het standaardgrijs. Vaak plaatsen game bouwers hun objecten handmatig in de room, als ze werken met Gamemaker. Om preciezer te zijn, ze plaatsen de instanties (kopieën van objecten), handmatig in de room. Bij onze simulatie hebben we echter te maken met 100 instanties (100 jongeren die gesimuleerd worden) en om dat handmatig te gaan doen, is te veel werk. Vandaar dat we een tweede object in het leven roepen, dat dat voor ons gaat regelen. Maak een nieuw object aan, noem dit object “controler” (of iets dergelijks). Dubbelklik het controler object aan en klik op . Kies het event en kies de spatiebalk <Space>. De bedoeling is, dat als iemand op de spatiebalk drukt, dat er 100 mens – instanties aangemaakt worden en dat de simulatie begint. Er is een actie te vinden rechts, onder tabblad <Main1>, rechtsboven, die meerdere instanties maakt van een object. Maar niet genoeg, slechts maximaal 4 instanties. Wij hebben er 100 nodig. Je zou deze actie 25 maal kunnen herhalen, maar beter is het om hier een klein stukje GML toe te passen. Kies het tabblad, kies voor de linkerknop onder (“execute a piece of script”) met je rechter muisknop en er opent zich een soort tekstverwerker. Zet hier de volgende tekst in: repeat (100) { x = random(room_width) y = random (room_height) instance_create(x,y,mens) }
Wat staat hierboven nu precies? Repeat (100) betekent niets anders dan herhaal 100 maal hetgeen hierna volgt tussen de {haken}. X en y zijn de variabelen voor de positie op het scherm op de x-as en de y-as.
x=random (room_width) wil zeggen dat er een willekeurige x waarde gegenereerd wordt (‘bedacht’ wordt) tussen de 0 en de breedte van het scherm (in ons geval 1024, weet u nog van stap 1). Tenslotte betekent instance_create(x,y,mens) dat er een instantie van het object “mens” gemaakt wordt op de plaats x,y in het scherm. Een x waarde van 0 wil zeggen dat de instantie helemaal links wordt gezet op het scherm, een x waarde van 1024 wil zeggen dat de instantie helemaal rechts geplaatst wordt en alle waarden daartussen, ergens midden op het scherm. Hetzelfde geldt voor y en de hoogte op het scherm. Een vraagje tussendoor zou kunnen zijn: waarom wordt er dan niet in GML het volgende gezet: x= random (1024) Dat zou in onze simulatie op hetzelfde neerkomen. Klopt, alleen het is niet verstandig. Want als we later (en dat kan soms ook jaren later zijn) de simulatie willen veranderen, dan moeten we alle code doorlopen. Stel dat we over 5 jaar allemaal een scherm hebben van minimaal 3000 pixels breed. Je zou dan overal in de code moeten gaan zoeken waar er iets gebeurt met de schermbreedte. Overal waar er 1024 staat moet je dit vervangen door 3000, tenzij als die 1024 niet over de schermbreedte gaat. Slimmer dus om de variabele room_width te gebruiken. Mocht je ooit de simulatie willen updaten, dan hoef je de schermgrootte alleen maar aan te passen in de globale game instellingen, de random waarde voor x en y in dit stukje script passen zich dan automatisch aan. Maar goed, we dwalen af. Sluit het venster waarin je de GML hebt getyped. Klik op om de GML te saven. Vergeet als laatste niet om het controler object in de room te zetten. Dat het controler object geen sprite heeft, is niet erg. Wat hebben we nu? We hebben een controler object dat 100 mens instanties aanmaakt op willekeurige plekken in het scherm, als je op de spatiebalk drukt. Maar we willen geen ongedifferentieerde mensen, we willen mannetjes en vrouwtjes! Dubbelklik het mens object. Klik op het object en kies het event. Laten we het Bijbels aanpakken en het zo maken dat alle ‘mens’ instanties eerst mannetjes zijn. Dit doen we door een variabele in het leven te roepen die we “man” noemen. Klik in het actions veld (in het create event van het object mens) achter het tabblad op de “set a value of a variable” knop (helemaal linksonder in het tabblad). Zet in het vak de tekst “man” (zonder aanhalingstekens) en in het veld zet je “true” (zonder aanhalingstekens). Klik op . Wat hebben we nu gedaan? Als er een mens instantie aangemaakt wordt (de create event), dan wordt er binnen de mens instantie een variabele aangemaakt, die we “man”
noemen. Als “man” op “true” staat, dan is de mens een mannetje. En als we die variabele op “false” zetten, dan is het dus een vrouwtje. Omdat er maar twee mogelijke mens soorten zijn, namelijk de mannelijke of de vrouwelijke, kunnen we dit programmeren met een zogenaamde boolean variabele. Booleans hebben een waarde 0 (false) of 1 (true). Je kan dus hier ook 0 in plaats van “false” in het vak zetten en 1 in plaats van “true”. Nogmaals, in onze simulatie betekent een 1 een mannetje en een 0 een vrouwtje. Maar goed, we hebben nog steeds alleen maar mannetjes. Immers, bij alle nieuwe objecten, staat de variabele man op true. Om ervoor te zorgen dat ongeveer de helft van de instanties vrouwtjes worden, moet in (ongeveer) de helft van de gevallen de variabele man op false gezet worden. Dit kun je op de volgende manier doen: (er zijn meer manieren) Klik wederom op het event in het object mens. We gaan nog wat toevoegen. Zoek in het tablad de dobbelsteen. Die dobbelsteen kun je gebruiken om kansen in je game te introduceren. We willen dat (ongeveer) de helft van de instanties vrouwtjes zijn, dus we kiezen ervoor de dobbelsteen 2 zijdes te laten hebben. In het echt bestaat zo’n dobbelsteen natuurlijk niet, maar het gaat erom dat de kans 1 op 2 is. Denk anders aan een pak kaarten en de kans dat je een rode dan wel een zwarte kaart trekt. Wat moet er gebeuren met 50% kans (1 op 2)? Nou logisch, 50% van de instanties moeten vrouwtjes worden. Zoek een haakje (onder ) op het tablad en open een haakje. Alle acties tussen de haakjes en direct na de dobbelsteen, worden nu met 50% kans uitgevoerd. Allereerst gaan we na het haakje de variabele “man” op “false” of “0” zetten, zodat de computer weet dat het geen man is, dus een vrouw. Vervolgens moet ook het uiterlijk aangepast worden, anders zien we geen verschil tussen de ‘mensen’ op het scherm. Dit doe je met de “Change the sprite” actie onder het tabblad <Main1>. Verander de sprite in “vrouwtje” (de roze dot) en klik op .
Wat blijft er nog staan? Nou de instanties, mannetjes en vrouwtjes moeten elkaar natuurlijk nog ontmoeten, dus zet in de event ook de actie “start moving in a direction”. (linksboven achter het <Move> tabblad). Om de richting random te maken, moet je alle richtingen aanklikken. Kies een snelheid 3. Als je de simulatie nu start, zul je merken dat de instanties het scherm aflopen, dus voeg in het object mens een event toe: onder het event . Kies als actie <Wrap> en kies . Als een instantie nu van het scherm loopt, komt hij netjes aan de andere kant weer terug. Bekijk de file: stap123.gm6 om het resultaat te bekijken (als je bovenstaande niet zelf hebt ingetyped en gemuisd, wat natuurlijk veel beter zou zijn ;-)
Stap 4: Het onderliggende simulatiemodel Hoe werkt ons onderliggend model? Welnu, we hebben 100 jongeren, 50% man en 50% vrouw die elkaar ontmoeten. Het ontmoeten is gemodelleerd door puntjes in een ruimte willekeurig te laten bewegen. Bij een botsing ontstaat er al dan niet sex en is er risico van een SOA besmetting. Bij de start is er 1 jongere besmet. Deze aanname is direct al discutabel. Ik ben geen expert, maar ik weet uit betrouwbare bron (nieuwssites van het internet) dat het aantal besmette HIV mensen in Nederland (gelukkig) veel lager ligt dan 1%. Daartegenover kan gesteld worden dat het aantal besmette jongeren met Chlamydia hoger ligt dan 1%. Overigens kan een ieder dit uitgangspunt in de simulator aanpassen. Hoe dat moet, zal later duidelijk worden. Laten we ervan uitgaan dat deze simulatie vooral als voorlichtingsinstrument gebruikt gaat worden om bijvoorbeeld te laten zien hoe gemakkelijk een SOA zich verspreidt, als jongeren geen safe seks praktiseren. Dat het onderliggende model van de simulatie niet volledig realistisch is, is in dat geval minder van belang (als het maar realistisch genoeg is, zodat er geen discussie kan ontstaan of reacties in de trant van: “ja maar, in het echt is het niet zo gevaarlijk om zonder condoom te vrijen, want....”). Een volgende aanname in de simulatie is dat de besmettingskans 30% is. Ook hierbij kan ik zeggen dat ik uit ‘betrouwbare bron’ (internet) vernomen heb dat de kans op besmetting van een SOA bij onsafe seks lager ligt. Toch is de besmettingskans hier op 30% gezet omdat die kans afhangt van de soort SOA. Verder hangt het af van het feit of de persoon al een andere SOA heeft (de kans op een HIV besmetting is hoger als iemand bijvoorbeeld Syfilis heeft) en het hangt af van het soort seksueel contact (Oraal, Anaal of Vaginaal). Al deze ‘variabelen’ zijn niet uitgewerkt in deze simulator. Er is sprake van slechts één soort SOA en van atypisch seksueel contact. Maar de grondige docent met wat kennis van gamemaker kan ook hier het model later verfijnen en al deze zaken desgewenst toevoegen, zoals verschillende kansen op besmetting. De vraag blijft of zo’n verfijning het doel (“voorlichting aan jongeren”) dient. Het doel hier is niet een wetenschappelijk onderzoek van verspreidingsmodellen van virussen of iets dergelijks maar voorlichting en mogelijk aanzet tot groepsdiscussie. Een laatste punt wat niet realistisch is aan het model is dat je 100 jongeren in een ruimte stopt en dat ze elkaar daarin ontmoeten en mogelijk seks hebben…tenzij het een simulatie is van een wild feest, maar ik geloof niet dat het zo erg is met onze jeugd ;-). Misschien moeten we het een ‘konijnensimulator’ noemen, maar ja die doen weer nooit aan safe sex.
Tijd om weer wat te bouwen. Ga naar het mens object en daarin naar het event. Klik op het knopje om code (script) toe te voegen en type daarin de volgende tekst: besmet = false besmettingskans = 30 sexpauze = false sexsearch = 3 sexdrive = 30 on_safesex = 30
Druk op . Wat hebben we gedaan? We hebben een aantal eigenschappen, ook wel properties van een object genoemd geïntroduceerd. Properties zijn gewoon variabelen die ‘eigenschappen’ van een object beschrijven. Voorbeelden van properties van een ruimteschip (denk aan een spel als Starcraft, Space invaders, Asteroids of welk ruimtespel dan ook) zijn de positie in het scherm (x en y waarde), de sterkte van het ruimteschild, de hoeveelheid brandstof er nog is, de hoeveelheid raketten om af te vuren, de integriteit van het schip (een Trekkie weet wat dat is), het aantal bemanningsleden, enzovoort. In onze simulatie hebben we eigenlijk met de variabele “man” ook al een property geïntroduceerd: een mens kan een man of een vrouw zijn (waarde 1 respectievelijk 0). De andere eigenschappen die we nodig hebben zijn: “besmet”, een boolean die aangeeft of de instantie besmet is (waarde true of 1) of niet (waarde false of 0). Alle instantie zijn in het begin niet besmet. De besmettingskans is een variabele die we een waarde 30 geven. Dat wil zeggen 30 % van de onveilige seksuele contacten leidt tot een besmetting, als de sekspartner besmet is. Sexpauze, is een boolean variabele die aangeeft of een persoon ‘even geen zin heeft in sex’. Elke keer als een instantie (jongere) seks heeft, heeft hij daarna een sekspauze. Dit heeft meer een praktische reden in de simulatie, dan dat het bedoeld is om de realiteit beter weer te geven. Als de instanties namelijk geen sekspauze hebben, na hun sekscontact, is het risico er dat ze voortdurend seks blijven hebben. Elke keer namelijk dat de sprites elkaar raken op het scherm, kunnen ze seks hebben. En als ze seks hebben, raken ze elkaar enzovoort nog steeds, dus hebben ze weer seks (plakken). “Sexsearch” staat voor de energie waarmee de instanties op zoek gaan naar een sekspartner. In onze simulatie wordt die eenvoudigweg gebruikt als snelheid van de sprites. Met andere woorden, hoe hoger de sexsearch, hoe sneller de sprites bewegen. “Sexdrive” is de variabele die de kans aangeeft of instanties seks met elkaar gaan hebben bij een ontmoeting, 30 wil zeggen in 30% van de gevallen. Tenslotte geeft de variabele “on_safesex” aan het percentage onveilige seks dat een instantie heeft.
Stap 5: Een paar details Allereerst passen we de snelheid van de instanties aan. Tot nu toe is dat steeds “3” geweest, maar daarvoor gebruiken we nu de variabele “sexsearch” (let op letterlijk overtypen, let op hoofdletters en kleine letters. Zet “sexsearch” op de plaats waar “3” staat in de <Start moving in a direction> actie in de event in het object “mens”. Waarom deze verandering? Op het scherm is er geen verschil te zien? Het grote voordeel van het gebruik van een variabele (“sexsearch”) in plaats van een vaste waarde (“3”) is dat je de waarde van de variabele kan aanpassen. Als je bijvoorbeeld de snelheid van de simulatie wilt verhogen (om de simulatietijd als het ware te ‘comprimeren’), dan hoef je alleen de waarde van de variabele sexsearch te verhogen. Een tweede klein ding wat we willen verbeteren, is dat als je nu per ongelijk twee keer of meer op de spatiebalk drukt, dat er dan steeds weer 100 instanties bijkomen. Op mijn oude PC wordt het al snel traag. We willen slechts één testgroep van 100 virtuele jongeren op het scherm en niet 200, 300 of meer instanties. Ga naar het “controler” object. Voer bij de event de <Set a variable to> actie in. Kies een variabele naam, ik heb voor de boolean variabele “start” gekozen. Als “start” 1 is, is het programma aan het opstarten. Als de variabele “start” 0 is, dan is het programma klaar met starten. Ga nu naar de <Space> event. Zet voor het script de actie, het blokje met zes hoeken (“if a variable has a value”). Zet in het scherm de variabele start, en de waarde op “1” of op true. Open een haakje, zet dan het script neer en dan de actie (vierkantje) waarin je de waarde van start op “0” of “false” zet. Wat gebeurt er nu? Zodra de simulatie gestart wordt, zet de “controler” instantie de waarde start op 1. Als iemand op de spatiebalk drukt dan kijkt de instantie of de waarde van start op 1 staat. Dan maakt hij 100 mens instanties aan en vervolgens zet hij de waarde van start op 0. Als iemand dan weer de spatiebalk indrukt, dan staat de waarde van start op 0 en zal de software niet weer 100 nieuwe mens instanties aanmaken. Stap 6: Eindelijk seks! De instanties, mannetjes en vrouwtjes bewegen zich vrij door de ruimte maar hebben nog geen interactie (seks). Dat gaan we nu programmeren. Ga naar het mens object en klik op en kies “mens”. Als een mens nu een ander mens ontmoet (‘botst’) dan kan er iets moois ontstaan. Kies in het tabblad. Zet daarin de volgende tekst: (self.man=other.man)
Vink het “NOT” vakje aan. Open een haakje en zet de instantie stil door de “start moving in a direction” actie te kiezen en daarin het middelste vakje aan te klikken. Tijdens seks is het niet handig om door te lopen, beter op je plaats blijven.
Wat staat hier nu: (self.man=other.man)? Hier staat een controle of het geslacht van twee instanties (“self”en “other”) gelijk is, de NOT vink maakt dat we controleren dat de geslachten niet gelijk zijn. Als dat zo is, dan zet de computer de beide instanties stil. De “self” verwijst naar de instantie zelf, de “other” verwijst naar de instantie waartegen gebotst wordt. Als instantie1 dus tegen instantie2 botst, dan is instantie1 “self” en instantie2 “other”. “self.man” is een verwijzing naar de variabele “man” van de “self” instantie (in ons voorbeeld van instantie1 dus). Waar stond de variabele “man” ook alweer voor? Het was een boolean (0 of 1) waarde die aangaf of desbetreffende instantie een mannetje (waarde 1 of true) of een vrouwtje was (waarde 0 of false). We willen niet alleen dat de instanties stil komen te staan, we willen ook dat de seks zichtbaar is op het scherm. Verschillende creatieve invullingen zijn hier mogelijk, maar omdat het toch al zo’n beladen onderwerp is, heb ik ervoor gekozen om traditioneel met bloemetjes en bijtjes te werken (het is immers een simulatie voor voorlichting ;-)). Als de instantie een mannetje is, dan moet de sprite omgezet worden in een bijtje en als het een vrouwtje is, dan moet de sprite een bloemetje worden. Klik in de
bounce event van het mens object de actie aan met zeshoeken. Zet in het vak de variabele “man” en in het “value” vak de waarde “true” of “1”. Vervolgens weer een haakje openen, kies de “change sprite into” actie en selecteer het bijtje. Hetzelfde concept met een bloemetje, na een “Else” actie. Sluit af met twee haakjes.
Test de simulatie. Als het goed is dan stoppen de instanties als ze botsen EN als ze van verschillend geslacht zijn. Mannetjes veranderen in bijtjes en vrouwtjes veranderen in bloemetjes. Wat direct opvalt is dat de instanties niet meer stoppen met hun liefdesdaad en dat er verschillende bloemetjes en bijtjes aanhaken zodat er complete orgies ontstaan. Zover willen we onze simulatie niet laten gaan, dus de volgende stappen om groepsseks te voorkomen en ervoor te zorgen dat de seks niet eeuwig duurt. (Tussen twee haakjes: wat zal ik een hoop traffic naar mijn site krijgen met al deze trefwoorden (orgie, sex, groepsseks...), als ik nu ook nog viagra en vergroting van mannelijke delen opneem in de simulatie, dan gaat mijn site nog plat, wat natuurlijk de natte droom is van elke neurd ;-)
Om te voorkomen dat sex eeuwig duurt en om te voorkomen dat er allemaal anderen gaan meedoen in een orgie, gebruiken we de variabele “sexpauze”, een boolean die op 1 staat als er seks is en op 0 als de instantie geen seks heeft. Zie het plaatje Als de instantie seks heeft, dan staat de variabele sexpauze op 1 (of true). Nu moeten we nog een klokje aanzetten dat na een bepaalde periode de variabele weer terugzet (de seks is weer voorbij). De instanties gaan dan weer hun eigen weg en de plaatjes van een bloemetje en een bijtje worden weer dots. Kies hiervoor “Set an alarmclock” in het tabblad <Timing> en zet dat alarm op 30 (wat overeenkomt met 30 steps, ongeveer een seconde).
Maak in het object mens een nieuw aan, kies het alarm0. Als alarm0 afgaat (1 seconde na het beginnen van seks tussen twee instanties) dan moet de variabele sexpauze weer op 0 (of false) gezet worden, het plaatje moet weer terug naar een roze dot voor een vrouwtje en een blauwe dot voor een mannetje en de beide instanties moeten elk weer hun eigen weg gaan. Zie het plaatje hoe je dat doet:
Nu moeten we nog de code erin zetten dat de instanties geen seks hebben met nieuwe instanties, als ze al ‘bezig’ zijn: zet in de event van het mens object bovenaan de acties, na de bounce against objects actie de volgende “if a variable has a value”. Kies sexpauze en zet de waarde op 0. Open een haakje en sluit dat onderaan weer af (zie plaatje). Nu zal er alleen seks ontstaan als een instantie niet al bezig is (tenminste dat hopen we).
Test de file: hij doet het niet! Het zal blijken dat de sprites nog steeds aan elkaar blijven plakken. Bovendien gaan er sommige bijtjes en bloemetjes bewegen, wat natuurlijk ook niet de bedoeling is. Hoe komt dat? De reden dat dat gebeurt is dat als twee instanties klaar zijn met seks, dat ze dan direct weer een bots event genereren (ze staan nog tegen elkaar aan) en dus weer opnieuw sex hebben. Dit lossen we op door nog een klokje te introduceren, alarm1. Als alarm0 afgaat (klaar met seks), dan worden de sprites teruggezet naar dots en gaan ze hun eigen weg. De variabele “sexpauze” blijft nog even op 1 staan (true). Wel wordt alarm1 aangezet met een tijd van bijvoorbeeld 15 steps. Als alarm1 afgaat, dan wordt “sexpauze” op 0 gezet en staan de instanties weer open voor nieuwe seksuele contacten. Zie de plaatjes. Test de simulatie nog eens, en je zult zien dat hij het nu wel goed doet.
Stap 7: Kans op besmetting Ook de ‘jeugd van tegenwoordig’ heeft niet bij elke ontmoeting met iemand van het andere geslacht direct seks. In ons model is dat nog wel zo en om dat te verbeteren, gebruiken we de variabele “sexdrive”. Deze variabele is al aangemaakt (“gedeclareerd” in programmeurstermen) bij de event van het object “mens” (acher het gloeilampje, in de GML code, in stap 4 weet je nog?). Hoe hoger de sexdrive van de instantie, hoe groter de kans op sex. Dus laten we zeggen een sexdrive van 100 wil zeggen altijd sex en een sexdrive van 0 wil zeggen nooit (zin in) sex. Ga naar het tabblad. Selecteer de actie van het “mens” object. Kies de knop met het dobbelsteentje erop. Vul in bij “sides”: 100/sexdrive Als de sexdrive nu 100 is, dan kiest het object met een kans van 1 op 1 (dus altijd) voor sex. (De waarde van de variabele sexdrive kan je aanpassen in het create event van het object, in het GML script. In stap 4 hebben we die waarde op 30 gezet.). Een vraagje tussendoor: Als de sexdrive 0 is, wat gebeurt er dan?.... (ik heb dit opgelost in de uiteindelijke versie, in deze tutorial laat ik dit verder even buiten beschouwing). De dobbelsteen actie geeft de kans aan op seks. Zet hem dus op de goede plaats en gebruik wederom de haakjes. Test de code, speel hierbij met de waarde van de variabele “sexdrive”. Stel de waarde heel hoog in, op 100 en heel laag, bijvoorbeeld op 1. Als het goed is, hebben de instanties dan meer en minder seks. Ook het risico op een SOA besmetting wordt geprogrammeerd met de dobbelsteen actie. Maar eerst wordt er gekeken of de andere instantie überhaupt besmet is, de variabele “besmet” van de desbetreffende instantie heeft dan de waarde 1 of true. Let goed op dat je het vakje “other” aanklikt, omdat het erom gaat of de instantie waartegen gebotst wordt, besmet is (niet of eigen instantie “self” besmet is).
Let weer op dat je de haken na deze IF .... THEN ....vraag goed gebruikt. Als je geen haken gebruikt, verwijst de THEN alleen naar de eerste actie die er direct na komt. Als de andere instantie besmet is, spelen er twee variabelen een rol bij een eventuele besmetting: de “on_safesex” factor en de “besmettingskans” (zie stap 4). Net zoals bij de kans op seks, wordt ook hier een dobbelsteentje gebruikt. Als een jongere bijvoorbeeld in 50% van de keren dat hij of zij sex heeft geen condoom gebruikt, dan heeft hij een kans van 1 op 2 per sexbeurt op een SOA besmetting. Om het goed te zeggen: dan heeft hij of zij een kans van 1 op 2 op een kans van besmetting. (Kan je het nog volgen?). Het is zeg maar als een prijsvraag waarbij je als prijs een staatslot kan winnen. Let weer goed op het gebruik van de haken, ook bij de dobbelstenen moet je precies zijn, anders doet de software geheid iets wat je niet wilde. Er moeten even veel haakjes open als haakjes sluiten in de code staan. Wat houdt een besmetting in Gamemaker taal in? Simpel, de variabele “besmet” krijgt de waarde 1 (of true). Om te testen of er ook inderdaad besmettingen plaatsvinden, is er voor gekozen om tevens een geluid af te spelen als er een besmetting plaatsvindt. Kies een willekeurig geluidje die met gamemaker worden meegeleverd en zet er een play sound actie bij.
Om de simulatie te kunnen starten, is er een besmette instantie nodig. Dus een instantie waarbij de variabele “besmet” op 1 staat. Ga hiervoor naar het “Controler” object en verander de GML code in het <Space> event in: // maak een mens dat besmet is x = random(room_width) y = random (room_height) instance_create(x,y,mens) mens.besmet =true
// genereert de overige 99 nieuwe mens instanties (onbesmet), op random posities in het scherm repeat (99) { x = random(room_width) y = random (room_height) instance_create(x,y,mens) }
Test de file en kijk of je het geluid hoort. Dit kan een tijdje duren, omdat er maar 1 besmette instantie is en omdat er bij eventueel seksueel contact, steeds een kans op besmetting is. Verander de waarden van de variabelen on_safesex, besmettingskans, sexdrive wat en luister of er meer of minder besmettingen plaatsvinden. Net als in het echte leven is het niet te zien of een instantie besmet is, toch willen we in onze simulatie kunnen zien hoeveel instanties (na verloop van tijd) besmet zijn geraakt. Hiervoor gebruiken we het doodshoofd plaatje (mocht dat te morbide zijn, dan is een willekeurig andere sprite hiervoor ook geschikt. Chlamydia is tenslotte niet dodelijk.) Klik in het “mens” object op . Kies een toets, ik heb de enter toets gekozen om de besmettingen zichtbaar te maken. De actie die volgt op het indrukken van de entertoets is dat als de variabele “besmet” op 1 staat (of true) dan wordt de sprite van de instantie tijdelijk veranderd in het doodshoofd. Met een klokje (alarm2), net zoals bij de “sexpauze”, wordt de sprite weer terug gezet naar een mannetje of vrouwtje.
Hiermee is de kern van de simulatie klaar. De variabelen waarmee gespeeld kan worden in de simulatie zijn: besmettingskans , de kans op een SOA besmetting bij onveilige seks sexdrive, het percentage seksueel contact van alle contacten on_safesex, het percentage onveilige seks van alle sekscontacten Ook kan gespeeld worden met de variabele “sexsearch” maar in deze simulatie geeft die alleen de snelheid van de sprites aan, wat niet een erg zinnige variabele is. In het bestand “SOAsimulator.gml” en de executable heb ik nog twee invoerschermen gemaakt, waarmee gebruikers van de simulator zelf hun waarden voor sexdrive en on_safesex kunnen invoeren. Hoe je dat kan doen, heb ik niet meer in deze tutorial uitgewerkt, maar als je in de code kijkt, wordt het snel duidelijk. De simulatie kan nog veel verder uitgewerkt worden, een paar ideeën: -
De mogelijkheid om een instantie te personificeren: je eigen ‘seksuele gedrag’ invoeren en kijken wat er gebeurt.
-
Toevoegen van homoseksualiteit, relaties (tijdelijk geen seks met anderen), ontrouw (toch seks tijdens je relatie met anderen) De mogelijkheid voor een instantie om zich te laten onderzoeken op SOA, de mogelijkheid om een SOA te genezen, na bezoek aan arts. Onderscheid tussen verschillende SOA’s die zich wel dan niet ook zichtbaar manifesteren Invoeren van een tijdselement (de inverse van de snelheid van de sprites): hoeveel seksuele contacten heeft een instantie (jongere) per jaar
Het allerbelangrijkste van een goede simulatie is het onderliggende model. Bijvoorbeeld: als je in Simcity iets wilt doen aan de criminaliteit in je virtuele stad, dan moet je gewoon om de zoveel centimeter een politiestation bouwen. Er zijn ongetwijfeld lieden die denken dat in de werkelijke wereld het tegengaan van criminaliteit een kwestie is van zoveel mogelijk politiebureaus, maar waarschijnlijk ligt het bestrijden van criminaliteit in de werkelijkheid wel iets complexer. Ook heb ik wel eens geprobeerd een autovrije wijk in Simcity te maken, maar helaas, de computer bleef van me eisen dat er wegen moesten komen omdat er anders geen mensen zouden komen wonen. Nou vinden veel mensen een auto en parkeerplek voor de voordeur erg belangrijk, maar toch is het zo dat autovrije wijken in de werkelijkheid zeer populair (bij een deel van de mensen). Kortom, een computersimulatie schiet snel te kort, vooral als het gaat om het modelleren van menselijk gedrag. Ook deze SOA simulator klopt op een punten niet, zoals al eerder toegegeven in deze tutorial. Het is van belang het educatieve en didactische aspect van een simulatie goed voor ogen te houden: het is prima om simcity te spelen in een klas, als onderdeel van een les over ruimtelijke ordening, economie, maatschappijleer of wat dan ook, maar het is belangrijk de dagelijkse realiteit te onderscheiden van de realiteit van een simulatie! Misschien door te beginnen met het spelen van Simcity en daarna in de klas te bespreken of de bevindingen wel kloppen in de echte wereld. Een dergelijke begeleiding is ook bij deze SOA simulator van belang! Ik hoor graag eventuele vragen, verbetervoorstellen en opmerkingen! www.gamescool.nl
De Creative Commons Attribution-NonCommercial-ShareAlike 2.5 Licentie is van toepassing op dit werk. Ga naar http://creativecommons.org/licenses/by-ncsa/2.5/ of stuur een brief naar Creative Commons, 559 Nathan Abbott Way, Stanford, Californië 94305, VS om deze licentie te bekijken. Kort samengevat komt het hier op neer: De gebruiker mag: • het werk kopiëren, verspreiden, tonen en op- en uitvoeren • afgeleide werken maken Onder de volgende voorwaarden: • Naamsvermelding. De gebruiker dient bij het werk de naam Wouter Baars, http://www.gamescool.nl als oorspronkelijke auteurs aan te geven. • Niet-commercieel. De gebruiker mag het werk niet voor commerciële doeleinden gebruiken • Gelijk delen. Indien de gebruiker het werk bewerkt kan het daaruit ontstane werk uitsluitend krachtens dezelfde licentie als de onderhavige licentie worden verspreid. • Bij hergebruik of verspreiding dient de gebruiker de licentievoorwaarden van dit werk kenbaar te maken aan derden. • De gebruiker mag uitsluitend afstand doen van een of meerdere van deze voorwaarden met voorafgaande toestemming van de rechthebbende