game maker
Gebruikersnaam:
Wachtwoord:
Home Info Forums Help
Welkom, Gast. Alsjeblieft inloggen of registreren.
De activerings e-mail gemist?
+  Forums
|-+  Werken met Game Maker
| |-+  Tutorials en Uitbreidingen (Moderator: Maarten Baert)
| | |-+  Variabelen in GML voor beginners
Pagina's: [1]
« vorige volgende »
Print
Advertenties

Laloeka
Gebruiker


Offline Offline

Berichten: 2551


WWW
« Gepost op: 19 November 2012, 23:51:42 »

Variabelen in GML voor beginners

Versie: nvt.
Niveau: Beginners
Vereiste kennis: Basisvaardigheden GameMaker (objecten aanmaken, etc.)



0. Waarom maak ik deze tutorial?
Ik kwam een vraag tegen die ging over het gebruik van variabelen in GameMaker, dus ik gebruikte de zoekfunctie en kwam bij deze tutorial uit van Erik Leppen. Maar deze tutorial was op D&D gericht, en de vraag werd over variabelen in GML gesteld. Ik kon niet echt een goede tutorial vinden over variabelen in GML, dus vandaar dat ik hem zelf maak. Aangezien variabelen zo ingebakken zitten in de basis van GameMaker (of programmeren in het algemeen) zal ik ook wat omliggende theorie uitleggen zoals rooms, steps, objecten en instanties. Wat ik niet ga behandelen is hoe functies werken, wat events precies inhouden, etc. Daar zijn andere tutorials voor te vinden.



1. Wat is een variabele?
Om die vraag te beantwoorden lijkt me het handig als je een beetje een ideetje krijgt van hoe GameMaker werkt. Allereerst werkt GameMaker met een objectgeoriŽnteerde programmastructuur. Dat is misschien meteen een lastige term, maar wat het inhoudt is eigenlijk best simpel.

Je spel bestaat uit verschillende objecten, die allemaal hun eigen eigenschappen hebben, en hun eigen code uitvoeren. Zo heb je een object voor een karakter die de speler kan besturen. Dit object heeft als eigenschap het aantal levens, maar ook de positie op het scherm, of de snelheid waarmee het bewogen wordt. Het karakter object heeft daarnaast ook eigen code die het uitvoert, bijvoorbeeld een code die er voor zorgt dat het karakter kan bewegen als er op de pijltjestoetsen wordt gedrukt. Een variabele hoeft niet altijd een getal te bevatten, het kan bijvoorbeeld ook een stukje tekst bevatten. Zo'n stukje tekst noemen we een string.

De eigenschappen, zoals het aantal levens, noemen we een variabele. Een variabele is eigenlijk niets meer dan een klein doosje met een naam erop en een waarde erin. Stel een object voor als een kast, waar allemaal doosjes in staan. De doosjes zijn de variabelen van het object, en de code van het object zorgt dat de goede doosjes geopend worden en er de juiste berekeningen met de waarde gemaakt worden. Zo zal de code voor de linker pijltjestoets inhouden dat het het doosje van de horizontale snelheid opent, en er vervolgens een waarde in stopt waardoor een andere code weer kan aflezen aan het doosje dat het object naar links moet bewegen.

GameMaker heeft een aantal variabelen standaard in een object zitten, deze namen zijn dus al in gebruik en kun je niet voor iets anders gebruiken. Deze ingebouwde variabelen krijgen in het GML venstertje (en hier op het forum) een ander kleurtje dan zwart, en de meeste kun je zelf van waarde veranderen.

Een aantal veelgebruikte ingebouwde variabelen staan in onderstaande tabel:

Naam:Beschrijving:
xDe horizontale positie van de instantie*1 in de room*2
yDe verticale positie van de instantie in de room
xpreviousDe horizontale positie van de instantie  van afgelopen step*3
ypreviousDe verticale positie van de instantie  van afgelopen step*3
hspeedDe horizontale snelheid van de instantie
vspeedDe verticale snelheid van de instantie
speedDe resulterende snelheid (verticaal en horizontaal bij elkaar) van de instantie in een bepaalde richting
directionDe richting van de resulterende snelheid 'speed' van de instantie. Werkt in graden (0 tot 360)

Er zijn er veel meer, en die kun je terugvinden in de helpfile (F1 in GameMaker), in deze Nederlandse, online handleiding of op dit forum met behulp van de zoekfunctie, in tutorials of in overige topics. Eventueel maak je hier zelf een topic aan als je het niet kunt vinden.

*1: Een instantie is een soort kopie van het object, welke alle acties uitvoert. Je kunt een object misschien het beste als een blauwdruk zien die uitlegt hoe je instanties moeten werken. Vaak als iemand zegt: Dan doet het object dit, bedoelen ze eigenlijk: Dan staat in het object beschreven wat de bijbehorende instantie moet doen. Je spel bestaat dus uit instanties van objecten die de instructies, die in de objecten beschreven staan, uitvoeren.
*2: Een room is (mits je geen views gebruikt) hetzelfde als het scherm dat je ziet als je je spel test of speelt. Het is het 'speelveld'  waar je spel zich afspeelt.
*3: Een step is een rekenstap voor je spel. Elke instantie gaat dan alle events na die het moet uitvoeren, en voert ze in een bepaalde volgorde uit.



2. Het gebruik van variabelen
Als je een variabele een waarde wilt geven, of met andere woorden, een doosje wilt maken en er een waarde in stoppen, doe je dat met het = teken:
GML:
variabele = waarde

Bijvoorbeeld:
GML:
levens = 10
Nu heeft het object 10 levens.

Dat is leuk, maar stel dat we dood gaan, dan moeten we er een van af halen:
GML:
levens -= 1
Of:
GML:
levens = levens - 1
Beide bovenstaande manieren zijn correct, ze verlagen de waarde van levens allebei met 1. De bovenste manier is kort gezegd een afkorting van de onderste manier, en die kun je zonder problemen gebruiken.

Hetzelfde werkt met optellen:
GML:
levens += 1
// of:
levens = levens + 1

In GameMaker kun je ook keer- en deelsommen  uitvoeren:
GML:
// keer:
levens = levens * 4
// of:
levens *= 4

// delen:
levens = levens / 10
// of:
levens /= 10
Let wel op dat je nooit door nul deelt, want dat is wiskundig onmogelijk en zal in een error resulteren (probeer het maar eens uit, dan weet je hoe je zo'n programmeerfout kunt herkennen als je hem later nog eens tegenkomt).

Het is ook mogelijk om meerdere variabelen door elkaar te gebruiken in dezelfde berekening:
GML:
punten = 100
bonuspunten = 40
totaalpunten = punten + bonuspunten
het variabele 'totaalpunten' zal nu de waarde 140 bevatten.



3. Verschillende soorten variabelen
Er zijn een aantal verschillende soorten variabelen:

Globale variabelen: Deze variabelen zijn overal en altijd in je spel te bereiken, en hebben voor alle instanties dezelfde waarde. Je kunt ze herkennen aan het voorvoegsel 'global.' (inclusief de punt). Er bestaan ook globale variabelen zonder voorvoegsel (onder andere sommige ingebouwde variabelen zoals 'score'). Je kunt ze zelf maken met 'globalvar', maar dit is af te raden omdat het je code erg onduidelijk kan maken. Ik ga hier niet verder op in. Mocht je geÔnteresseerd zijn, zoek het dan op in de helpfile (F1 in GameMaker)

Lokale variabelen: Deze variabelen zijn wat lastiger, omdat je ze niet kunt onderscheiden van tijdelijke variabelen. Het verschil is dat tijdelijke variabelen hun waardes verliezen nadat de code is uitgevoerd, waar lokale variabelen de waarde vasthouden zo lang als de instantie bestaat.

Tijdelijke variabelen: Dit zijn variabelen die je aanmaakt met het var statement. Zie voorbeeld. Tijdelijke variabelen zien er in de code (op de declaratie, het aanmaken van de variabele) precies hetzelfde uit als lokale variabelen. Het enige verschil is dat ze maar bestaan tot het eind van het codeblok of script.

Een globaal variabele geef je zo een waarde:
GML:
global.levens = 10
global.naam = "Hoi"

Een lokaal variabele
GML:
punten = 0
levelnummer = 4

Tijdelijke variabelen
GML:
var a, b;
a = 9
b = 3

De enige manier om tijdelijke variabelen te gebruiken is door het var-statement te gebruiken. Het var-statement zorgt dat tijdelijke variabelen niet als lokale variabelen aangezien worden. Stel je voor dat je een lokaal variabele genaamd 'levens' hebt, met de waarde 4, en je wilt in je code een tijdelijk variabele met dezelfde naam gebruiken, dan doe je dat zo:

GML:
draw_text(4, 4, levens) // tekent 4 op het scherm, het lokale variabele

var levens; // maakt een tijdelijk variabele levens
levens = 10 // stelt het tijdelijke variabele in op 10

draw_text(4, 32, levens) // tekent 10 op het scherm, het tijdelijke variabele

// na deze code is 'levens' weer een lokaal variabele en bevat het de waarde 4



4. Wat is een datatype?
Een datatype is een soort waarde, bijvoorbeeld een getal, of een tekenreeks. In GameMaker maakt het in het gebruik niet veel uit wat voor datatype een variabele heeft, aangezien je dit niet strikt kunt vermelden. Wat belangrijk is om te weten is dat je tekst (ookwel: 'string' genoemd) en getallen (ookwel: 'float', 'real' of 'integer' genoemd) niet zomaar bij elkaar op kunt tellen. Je zult hiervoor een functie moeten gebruiken:

GML:
tekst = "Jouw score is: "
punten = 123
nieuwetekst = tekst + string(punten)

Maar je kunt ook strings omzetten naar reals:

GML:
tekst = "100"
getal = 50
nieuwgetal = real(tekst) + getal

Verder heb je nog een aantal andere datatypen, zoals arrays. Hiervoor staan er op dit forum speciale tutorials. Daarnaast kan een variabele ook een id bevatten voor een object, een sprite, een geluidseffect.. eigenlijk elke resource die je kunt gebruiken in je spel heeft een waarde die je kunt opslaan in een variabele. Hiermee kun je maar beter niet gaan rekenen, want dat slaat nergens op en kan vervelende situaties creŽeren.

GML:
show_message(sprite0 * sound0) // NIET doen dus!



5. Nawoord
Ik hoop dat je iets geleerd hebt van deze tutorial, en dat deze tutorial je geÔnteresseerd heeft gemaakt in het programmeren (met GameMaker). Heb je een vraag of opmerking specifiek over deze tutorial, plaats ze dan gerust in dit topic. Heb je een algemenere vraag over GameMaker, stel die dan in het Beginners of Gevorderden board op dit forum. Er zijn al een aantal opmerkingen over de tutorial geplaatst in de reacties hieronder, het kan nuttig zijn dat je die ook eens doorleest. Of ze altijd gelijk hebben kan ik niet zeggen, maar er aandacht aan besteden kan nooit kwaad.



6. Changelog
15 oktober 2013 - Informatie over tijdelijke variabelen bijgewerkt, voorheen bevatte de tutorial foutieve informatie over tijdelijke variabelen. Tevens extra informatie toegevoegd over globalvar.

« Laatste verandering: 15 Oktober 2013, 00:11:48 door Laloeka »


-------
Naar boven Gelogd

Maarten Baert
Forumbeheerder


Offline Offline

Berichten: 4942

Gelieve quote te gebruiken als je PMs beantwoordt.


WWW
« Antwoord #1 Gepost op: 20 November 2012, 13:17:16 »

Citaat
Tijdelijke variabelen (overige events)
Kan het dat je hier een 'var' vergeten bent?


Naar boven Gelogd

Mohammed-f
Gebruiker

Offline Offline

Berichten: 2402


« Antwoord #2 Gepost op: 20 November 2012, 14:04:15 »

Je hebt globalvar niet uitgelegd. Persoonlijk gebruik ik nooit global. om een globale variable te declareren. Ik gebruik altijd gewoon globalvar naam; naam = "bla";

Verder ook nog handig bij te zeggen dat je een var of globalvar meerdere keren kan declareren, maar ze wel de waarde 0 krijgen als ze voor de declaratie nog niet gedeclareerd waren. Een eenvoudig alternatief voor de gm8.1 functie waarmee je kan controleren of een variable bestaat (die inmiddels obsolete en verwijderd is in GM studio)

Verder nog een weetje: als je een with loop gebruikt kan je een tijdelijke var variable ook meenemen in tegen stelling tot normale variablen.

« Laatste verandering: 20 November 2012, 14:45:50 door Mohammed-f »

Naar boven Gelogd

bennie321
Gebruiker


Offline Offline

Berichten: 2103

En weer bezig met GML en GMS


« Antwoord #3 Gepost op: 20 November 2012, 14:28:18 »

de globalvar miste ik ook al zoals Mohammed-f al had gezegd, voor de rest is het mooi en netjes uitgelegd Gemoedelijk


Gamemakerserver van Size43 (Refferal)
Coming soon: Nog een topdown game Grijns
Naar boven Gelogd

PiJoKra
Gebruiker

Offline Offline

Berichten: 718


« Antwoord #4 Gepost op: 21 November 2012, 18:35:53 »

Ik was dus niet de enige die globalvar miste. Ook vind ik het jammer dat je je hebt beperkt in uitleg over operatoren, er zijn er veel meer en ook degene die je hebt aangehaald hadden uitgebreider gemogen.
Misschien kan je er ook bijzetten dat er functies zijn die de waarde van een variabele veranderen, van bijvoorbeeld integer naar string (String(var_integer)). Wat ook miste, en wat veel mensen in het begin fout doen, is een juist statement neerschrijven, zoals bijvoorbeeld if(var_boolean){}, waarbij je ook variabelen nodig hebt.
Buiten dat heb je ook verschillende type variables:
  • Strings "string"
  • Booleans true|false|1|0 (Eigenlijk zijn dit in GM gewoon integers die een waarde kunnen hebben van 0 en 1
  • Integers en reals
  • Array's datastructuur die, in GM, zowel 1- als 2-demensionaal kan zijn.
  • Kleuren $RRGGBB | integer gaande van 0 tot 256*256*256 met als structuur BBGGRR | c_[kleurnaam]
  • Er was er nog een, maar wat was die ook alweer  Engel
En dan heb je natuurlijk nog de namen van resources (namen van sprites, sounds,...).

:= is ook, binnen GM, een striktere manier om een variabele een waarde toe te laten kennen, en zou ook iets sneller moeten zijn.

« Laatste verandering: 22 November 2012, 15:42:12 door PiJoKra »
Naar boven Gelogd

Laloeka
Gebruiker


Offline Offline

Berichten: 2551


WWW
« Antwoord #5 Gepost op: 21 November 2012, 23:20:18 »

Ik heb var toegevoegd, was ik inderdaad vergeten. Gelijk een klein hoofdstukje over datatypen geschreven. Globalvar niet, evenals de := operator en de puntkomma.

De reden hiertoe is dat ik globalvar nooit gemist heb als beginner in GameMaker. De := operator gebruik heb ik zelfs nu nog nooit gebruikt in GameMaker. Misschien kun je een paar argumenten geven waarom je die wel zou moeten gebruiken, zodat ik er ook het nut van inzie dit aan een beginner te leren.

Over de puntkomma bestaat een hele discussie, en het zou, afhankelijk van je standpunt, beter kunnen zijn de puntkomma meteen als een gewoonte aan te leren aan de beginner, maar ik probeer het nu zo simpel mogelijk te houden. Deze tutorial is aan beginners gericht.

Maar bedankt voor de reacties. Ik sluit niet uit dat ik de tutorial later niet nog eens aanpas. Ik heb in het nawoord nog een verwijzing naar deze reacties toegevoegd, zodat - zelfs als ik het niet toevoeg - het nog tussen de reacties gevonden kan worden Gemoedelijk



-------
Naar boven Gelogd

Flumble
Gebruiker


Offline Offline

Berichten: 2018


« Antwoord #6 Gepost op: 21 November 2012, 23:53:03 »

De reden hiertoe is dat ik globalvar nooit gemist heb als beginner in GameMaker. De := operator gebruik heb ik zelfs nu nog nooit gebruikt in GameMaker. Misschien kun je een paar argumenten geven waarom je die wel zou moeten gebruiken, zodat ik er ook het nut van inzie dit aan een beginner te leren.
Ik heb globalvar juist erg gemist bij andermans code als beginnend GML-gebruiker, omdat het altijd extra typewerk opleverde (vooral in niet-code, waar automatisch aanvullen niet gebeurt) en de code minder leesbaar maakte.

Wat ik lange tijd zelf heb gemist, is de sturing om global niet te gebruiken. Globals (specifiek variabelen met globalvar aangemaakt) zouden eigenlijk alleen gebruikt moeten worden om instanties aan te koppelen. Deze instanties zijn dan categorieŽn waar variabelen in staan die bij zo'n categorie horen.
Neem bijvoorbeeld globalvar player;. player wordt ingesteld op de instantie van de speler en vervolgens heeft elke instantie toegang tot player.x, player.y, player.damage, player.color et cetera.
globalvar texture; is handig als je een 3D-spel maakt en je niet telkens _get_texture() wil uitvoeren, maar het gewoon kan ophalen via texture.gras. Ook kan je bij het textureobject code toevoegen die de texturen weer herlaadt als je schermbeveiliging laadt. (met dat laatste hebben veel mensen nog wel eens last)


Natuurlijk, in den beginne is het makkelijker om een aantal losse globals te hebben, zoals health en gravity, maar uiteindelijk zorgt het ervoor dat gamemaker een brak geheel vormt dat niet kan beslissen wat de globale scope moet doen, dus is mijn betoog om het alleen te gebruiken voor instanties slechts een betoog. Maar ik hoop mensen te kunnen overtuigen met dit betoog. Tong

Naar boven Gelogd

Advertenties
« vorige volgende »
Pagina's: [1]
Print


Topic Informatie
0 geregistreerde leden en 1 gast bekijken dit topic.

Ga naar:  

Powered by SMF 1.1.21 | SMF © 2006-2007, Simple Machines
www.game-maker.nl © 2003-2020 Nederlandse Game Maker Community