game maker
Gebruikersnaam:
Wachtwoord:
Home Info Forums Help
Welkom, Gast. Alsjeblieft inloggen of registreren.
+  Forums
|-+  Werken met Game Maker
| |-+  Tutorials en Uitbreidingen (Moderator: Maarten Baert)
| | |-+  [Tut] Arrays
Pagina's: [1] 2
« vorige volgende »
Print
Advertenties

kaasje
Globale moderator


Offline Offline

Berichten: 2301


« Gepost op: 14 April 2009, 11:47:31 »

Arrays
1D en 2D, for-loop met arrays.

Hey,

Ik was al een tijdje van plan om een tutorial over arrays te schrijven. Na wat onderzoek en vragen aan een vriend, heb ik besloten dan eindelijk eens die tutorial te maken. We gaan het hebben over 1D en 2D arrays, hoe je snel array aan kan maken doormiddel van een for-loop en uiteraard behandelen we wat je er nu eigenlijk mee kan.


Versie van GM: Game Maker 6, Game Maker 7 (misschien  Game Maker 5).
Moeilijkheidsgraad: Gemiddeld
Registratie vereist: Ja

Inhoudsopgave
- Wat is een array?
- Waarom is een array zo handig?
- 1D arrays.
- 2D arrays.
- Snel arrays aanmaken met een for-loop.



Wat is een array?
Een array is een variable. Arrays worden in 1 variable gezet, en dat bespaart weer een hoop andere variables. Laten we een voorbeeld nemen met wapens. Je kan natuurlijk dit doen:
GML:
global.ak47 = false
global.bazooka = false
global.mes = false
Maar het is handiger met een array:
GML:
global.wapen[1] = false
global.wapen[2] = false
global.wapen[3] = false
Waarom dit handiger is vertel ik in het volgende hoofdstuk.
Een array maak je dus aan door middel van een getal (de array index) tussen vierkante haakjes ([]). Een array index moet aan de volgende voorwaarden voldoen:

  • De array index is groter of gelijk aan 0 en kleiner dan 32000;
  • De array index is een heel getal (dus niet 1.2 of 6.523);
  • De array index kan geen string zijn.

Een array is in game-maker dus beperkt. In andere programmeertalen kunnen arrays vaak groter zijn dan 32000, maar in GM dus niet.

Waarom is een array zo handig?
Met een array kan je heel snel variables oproepen. Kijk maar eens mee naar het volgende voorbeeld:
GML:
//Definiër alle arrays
global.lvl[1] = false
global.lvl[2] = false
global.lvl[3] = false
global.currentlvl = 1
Stel, dat de variables in het bovenstaande stukje code om levels te unlocken zijn. In de room staat een object die checkt welk level het is en geeft dat door aan global.currentlvl. Dus als het level 2 is, bedraagt global.currentlvl dus het getal 2.
Aan het einde van de room wil je dat het level geünlockt is door de variable op true te zetten. Wat je dan gewoon kan doen is dit:
GML:
global.lvl[global.currentlvl] = true
De variable global.currentlvl bedraagt 2, dus hier staat eigenlijk:
GML:
global.lvl[2] = true
Zo kan je ook informatie uit een array halen:
GML:
if global.lvl[global.currentlvl] = true
     {
           show_message("Je hebt dit level al geünlockt!")
     }
Je kan dus met andere variables de array oproepen en er informatie uit halen. Een array kan je zowel in global variables als local en tijdelijke variables gebruiken. Arrays kunnen ook strings bevatten (maar geen strings gebruiken als index!).


1D arrays
In Game-maker heb je 'slechts' 2 soorten arrays: 1D arrays en 2D arrays. In andere programmeertalen heb je vaak ook 3D of zelfs onbeperkte arrays.
Een 1D array is een array zoals we hierboven hebben behandeld. Gewoon met één getal tussen de vierkante haakjes:
GML:
global.array[1]
Het handige is, is dat je zo'n beetje alles kan doen met een array. Laten we een voorbeeld over de munitie van een wapen nemen:
GML:
global.ammo[1] = 50
global.ammo[2] = 100
global.ammo[3] = 10
global.weapon = 1
De variable global.ammo geeft aan hoeveel munitie het wapen 1, 2 en 3 heeft. Global.weapon geeft aan welk wapen de speler heeft. Stel, de speler heeft wapen 1 en schiet een keer. Dan doe je dus dit:
GML:
global.ammo[global.weapon] -= 1
Als de speler wapen 2 heeft, dan staat er dus weer gewoon dit:
GML:
global.ammo[2] -= 1
Je kan alle wiskundige functies toepassen op de array (als de array een integer is):
GML:
global.ammo[global.weapon] = sqr(global.ammo[global.weapon+1]
Als global.weapon 1 is, staat er dus dit:
GML:
global.ammo[1] = sqr(global.ammo[2])
Ik denk dat ik nu wel genoeg verteld heb over 1D arrays. We gaan het dus nu hebben over de 2D arrays.


2D arrays
2D arrays moet je eigenlijk zien als een raster of tabel. Eerst zal ik laten zien hoe een 2D array eruit ziet.
GML:
global.voorbeeld[1,1]
Dit is een voorbeeld van een 2D array. Laten we er een tabelletje bij pakken:

In dit geval is:
GML:
global.voorbeeld[1,1]
Dus 5.
De eerste waarde in de 2D array is de x-waarde. Dat wil zeggen, de horizontale waarde. De tweede waarde is de y-waarde. Als je dus hebt:
GML:
global.voorbeeld[3,1]
Komt daar 40 uit en niet 15.
Zo kan je heel goed gegevens opslaan van gebruikers. Een voorbeeld:
Laten we zeggen dat de verticale rij van de tabel de gegevens naam, leeftijd en woonplaats opslaan. De horizontale rij geeft aan welke gebruiker het is:

We gaan in het game start event vragen welke gebruiker er speelt:
GML:
user = get_integer("Welke gebruiker wil jij zijn?",0)
Stel, de gebruiker geeft aan dat hij gebruiker 1 wil zijn. Dan vragen we om de naam van de speler:
GML:
naam = get_string("Hoe heet je?,"")
Nu weet game-maker de naam van de speler, dus die kan hij invullen in de tabel:
GML:
global.info[user,1] = naam //Horizontale rij 1, verticale rij 1, dus de naam.
Zo gaan we door tot we alles hebben gehad:
GML:
leeftijd = get_integer("Hoe oud ben je?",0)
global.info[user,2] = leeftijd //Nu de leeftijd, verticale rij 2, dus leeftijd
woonplaats = get_string("In welke plaats woon je?","")
global.info[user,3] = woonplaats //Kolom 3, dus woonplaats
Als de speler alles heeft ingevuld staat er dus dit in de tabel:

Nu weet game-maker de gegevens van de gebruiker. Zo kan je ook een wachtwoord opslaan. Laten we zeggen dat kolom 4 het wachtwoord wordt.
GML:
wachtwoord = get_string("Vul een wachtwoord in","")
global.info[user,4] = wachtwoord
De volgende keer als de user het spel opstart hoeft game-maker alleen te vragen om de user en het wachtwoord, zo kan hij alle persoonlijke gegevens weer ophalen (Let er wel op dat de data niet zomaar opgeslagen wordt, je moet dus wel game_save of iets dergelijks gebruiken). Dat kan je dan zo doen:
GML:
user = get_string("Welke user ben je?",0)
wachtwoord = get_string("Wat is je wachtwoord?","")
if global.info[user,4] = wachtwoord //Als kolom 4 (het wachtwoord) gelijk is aan het ingevulde wachtwoord...
     {
          show_message("Welkom, "+global.info[user,1]) //Message laten zien met de naam van de gebruiker.
     }
Zoals je ziet kan je veel dingen doen met 2D arrays. Je kan natuurlijk ook 2 variables invullen in plaats van 1:
GML:
data = get_integer("Welke informatie wil je zien?#1 = naam, 2 = leeftijd, 3 = woonplaats, 4 = wachtwoord",0)
//User is reeds ingevuld
show_message("De data is: "+string(global.info[user,data]))


Snel arrays aanmaken met een for-loop
Soms heb je veel arrays nodig. Laten we het voorbeeld van het level unlocken weer nemen. Stel, je hebt 100 levels, dan kan je natuurlijk dit doen:
GML:
global.lvl[1] = false
global.lvl[2] = false
global.lvl[3] = false
//...........
global.lvl[100] = false
Dit is immens veel typewerk en het kan veel makkelijker. Namelijk met een for-loop.

Om een for-loop te kunnen gebruiken moet je eerst weten hoe hij werkt. Een voorbeeld van een for-loop is dit:
GML:
for(i = 0; i <= 3; i += 1)
Zoals je ziet heeft de for-loop 3 'argumenten'. Het eerste argument is een statement. Hij zet een variable en met die variable gaat de for-loop verder. Het tweede argument is een expression. De for-loop zal door blijven gaan totdat deze expression (i <= 3) niet meer waar is. Het derde argument is weer een statement, die verteld wat er met i moet gebeuren als het tweede argument nog niet waar is. We maken het voorbeeld even af:
GML:
for(i = 0; i <= 3; i += 1)
     {
          instance_create(i,0,object0)
     }
Er worden nu 3 objecten gemaakt op de positie (i,0). Hetzelfde kan je doen met arrays. Je kan arrays aanmaken met een for-loop op deze manier:
GML:
//We hebben 100 levels, dus er zijn 100 arrays nodig
for(i = 1; i <= 100; i += 1)
     {
           global.lvl[i] = false
     }
De code wordt 100 keer herhaald met een andere waarde van 1.
Zo kan je het ook met bijvoorbeeld de tafel van 4 doen:
GML:
for(i = 0; i <= 10; i += 1)
     {
           array[i] = i*4
     }
Zo krijg je dus:
array[0] = 0
array[1] = 4
array[2] = 8
enzovoorts.
Meer informatie over for-loops kan je hier of via de zoekfunctie vinden.


Dit was de tutorial over arrays. Ik hoop dat het nu duidelijk is waarvoor arrays dienen, en wat je eraan hebt. Als je nog vragen of opmerkingen hebt, zeg het gerust.

Groeten,
Kaasje

« Laatste verandering: 17 Maart 2012, 16:26:40 door kaasje »

ECCE QUAM SIT...
Naar boven Gelogd

debeste95
Gebruiker


Offline Offline

Berichten: 1049

Berichten: 3


« Antwoord #1 Gepost op: 16 April 2009, 16:09:58 »

superbedankt, kaasmans!
ik heb wel vaker over arrays gehoord enzo...
nooit gebruikt omdat ik nou niet precies wist wat het waren en hoe je ze gebruikt!
ga ze nu zeker vaker gebruiken, want ik gebruik altijd teveel verschillende variables!
superbedankt!!!!

debeste95  Cool


Debeste95 is weer terug! (: Feestje? Gratis koekjes bij mij thuis! ;D
Naar boven Gelogd

Bjarno
Jurylid


Offline Offline

Berichten: 5083

Vragen over GM niet via PM.


WWW
« Antwoord #2 Gepost op: 16 April 2009, 19:41:23 »

Zeer goede en uitgebreide tutorial over Arrays. Nu ben ik al heel wat meer te wetengekomen.Misschien wel handig om er bij te vermelden is wat er gebeurt als je de variabele bekijkt in je debug window. (Heb op dit moment geen GM bij de hand)


Naar boven Gelogd

Maarten Baert
Forumbeheerder


Offline Offline

Berichten: 4942

Gelieve quote te gebruiken als je PMs beantwoordt.


WWW
« Antwoord #3 Gepost op: 16 April 2009, 20:57:44 »

Misschien moet je er nog even bij zetten dat, als je een variable uitleest die een array is, je standaard de waarde van het eerste element krijgt. Dus 'view_xview' is hetzelfde als 'view_xview[0]'. Dat werkt trouwens bij alle arrays.


Naar boven Gelogd

Erik Leppen
Forumbeheerder


Offline Offline

Berichten: 9655


WWW
« Antwoord #4 Gepost op: 17 April 2009, 13:05:23 »

Laten we een voorbeeld nemen met wapens. Je kan natuurlijk dit doen:
GML:
global.ak47 = false
global.bazooka = false
global.mes = false
Maar het is handiger met een array:
GML:
global.wapen[1] = false
global.wapen[2] = false
global.wapen[3] = false
Nog handiger is om ook constantes te maken met waarden 1, 2 en 3 en namen als wAk47, wBazooka en wMes, en dan te zeggen
GML:
global.wapen[wAk47] = false
global.wapen[wBazooka] = false
global.wapen[wMes] = false
omdat je dan aan de code kan zien op welk wapen iets slaat zonder je als programmeur druk te hoeven maken over nummertjes. Dezelfde truc werkt ook op jouw voorbeeld voor 2D-arrays. Maak constantes voor de soorten informatie, met waarden 1, 2 en 3 en met namen als iNaam, iLeeftijd en iWoonplaats en gebruik
GML:
naam = get_string("Hoe heet je?", "")
leeftijd = get_integer("Hoe oud ben je?", 0)
woonplaats = get_string("In welke plaats woon je?", "")
global.info[user, iNaam] = naam
global.info[user, iLeeftijd] = leeftijd
global.info[user, iWoonplaats] = woonplaats
De reden is wederom adt je niet hoeft te onthouden welk nummertje ook al weer de woonplaats is. Dit valt misschien met maar drie items nog wel mee, maar als je een spel gaat maken met 14 soorten vijanden en per vijand wil je graag allerlei verschillende data onthouden dan is enemy_type_info(eZombie, iSpeed) meteen duidelijk terwijl als je enemy_type_info(5, 3) ziet, je eerst moet opzoeken wat dat ook al weer is en dat gaat je op den duur geheid tegenstaan. Daarnaast kun je in een klap de hele array hernummeren door je constantes van waarden te verwisselen, en dat kun je in je voordeel gebruiken om de zaak zo in te richten dat de hoge nummers die zijn die je niet altijd nodig hebt, wat misschien een beetje geheugen bespaart (alhoewel dat effect verwaarloosbaar zal zijn).



Citaat
De code wordt 100 keer herhaald met een andere waarde van 1.
Met een andere waarde van i, uiteraard Knipoog


Ook nuttig om op te merken is dat als je de code uitvoert:
GML:
a[100] = 0
Dat dan a[0] tot en met a[99] ook worden gereserveerd en geheugen innemen. Kies je indices dus zo laag mogelijk. Nu is dat met 100 nog niet zo'n vreselijk groot probleem misschien, maar met 20000 waarschijnlijk wel, omdat GM dan 20.000 geheugenplaatsen reserveert voor je array.
Merk op dat je dit ook in je voordeel kunt gebruiken door
GML:
for(i = 1; i <= 100; i += 1)
     {
           global.lvl[i] = false
     }
te vervangen door
GML:
global.lvl[100] = false
Dit werkt omdat false toevallig nul is. Let op, dit werkt alleen voor de waarde nul!


Naar boven Gelogd

Maarten Baert
Forumbeheerder


Offline Offline

Berichten: 4942

Gelieve quote te gebruiken als je PMs beantwoordt.


WWW
« Antwoord #5 Gepost op: 17 April 2009, 20:28:28 »

Merk op dat je dit ook in je voordeel kunt gebruiken door
GML:
for(i = 1; i <= 100; i += 1)
     {
           global.lvl[i] = false
     }
te vervangen door
GML:
global.lvl[100] = false
Dit werkt omdat false toevallig nul is. Let op, dit werkt alleen voor de waarde nul!

Dat dacht ik eerst ook, maar blijkbaar mag dat toch niet. Er wordt wel geheugen gereserveerd, maar de variables worden toch niet echt aangemaakt dacht ik. Uit tests blijkt namelijk dat:
GML:
array[100] = 1234; // dit duurt redelijk lang
array[100] = 1234; // dit gaat snel
array[100] = 1234; // dit gaat snel
// ...
array[5] = 1234; // dit duurt redelijk lang
array[5] = 1234; // dit gaat snel
array[5] = 1234; // dit gaat snel
// ...
Je kan duidelijk zien dat de eerste keer dat je de variable gebruikt het langer duurt, ook als dat een array was en het geheugen eigenlijk al gereserveerd was.


Naar boven Gelogd

kaasje
Globale moderator


Offline Offline

Berichten: 2301


« Antwoord #6 Gepost op: 17 April 2009, 21:43:43 »

Hey,

@ Matrebatre: Ik zet het er morgen allemaal bij. Bedankt voor de tips Gemoedelijk

@ Erik Leppen: Ik was al van plan om er constants bij te doen. Het schoot eigenlijk pas in mijn hoofd toen ik op 'verzenden' had geklikt. Ik zal er nog een hoofdstukje bijdoen over contants. Ook jij bedankt voor de tips.

Groeten,
Kaasje


ECCE QUAM SIT...
Naar boven Gelogd

TriLobyte
Gebruiker


Offline Offline

Berichten: 882

HBO Game Design '13-'17


WWW
« Antwoord #7 Gepost op: 17 November 2009, 15:21:48 »

sorry voor de bump  Emotieloos

maar ik heb een vraagje over array's
ik heb een race game met auto's en natuurlijk ben ik opzoek naar de beste manier van array's gebruiken voor de auto's;

ik heb [nu nog, binnen kort 25] 5 auto's.
ze hebben verschillende eigenschappen nl een max snelheid, global.maxspeed en room_speed gebruik ik daar voor...
ze hebben een kost prijs
ze hebben een draw text piece met informatie over de auto, naam, max snelheid, prijs

kan ik dan een 2d array maken met global.car[0-5] ?
en dan global.car[1] = global.maxspeed=75?
en dan global.car[1] = global.cost = 133000?
of word het dan
global.car[1] =
{
global.maxspeed = 75
global.cost = 133000
}

graag een beetje informatie hoe ik dit het beste kan regelen...

mvg

Bart

[ps: was het beter geweest om een nieuw topic aan te maken?]



niet BINNENKORT V2.0! - That's the world of Golennium
Naar boven Gelogd

Beginnertje
Gebruiker


Offline Offline

Berichten: 853

Pi = Geweldig


« Antwoord #8 Gepost op: 29 November 2009, 12:35:07 »

erg goeie leerzame tut, veeeeeeeeeeeeeeeeeeeeeel beter dan de gm info!  Blij

Naar boven Gelogd

lucb1e
Gebruiker


Offline Offline

Berichten: 4556


WWW
« Antwoord #9 Gepost op: 30 November 2009, 10:22:42 »

Gamemaker geeft ook niet echt uitleg over hoe arrays zelf precies werken Knipoog Meer alleen hoe je ze in gamemaker gebruikt, voor als je arrays al kent.


Naar boven Gelogd

Stijnio
Gebruiker

Offline Offline

Berichten: 159


« Antwoord #10 Gepost op: 22 December 2009, 16:22:21 »

Super!
Echt bedankt Kaasje, hier heb ik zeker wat aan.

Gr Blij


Evade, Avoid, Survive! - Kun jij alles overleven en het einde bereiken?

Laser Evasion - Hoe lang overleef jij de lasers?
Naar boven Gelogd

tycho
Gebruiker


Offline Offline

Berichten: 599

<PersoonlijkeText/>


« Antwoord #11 Gepost op: 22 December 2009, 17:41:26 »

een vraagje wat is dan
GML:
variablenaam.1=true
?

« Laatste verandering: 23 December 2009, 09:00:10 door tycho »

Naar boven Gelogd

Hfan
Gebruiker


Offline Offline

Berichten: 1780

Superman is back, and here to stay.


« Antwoord #12 Gepost op: 23 December 2009, 12:35:54 »

Fout.

Naar boven Gelogd

tycho
Gebruiker


Offline Offline

Berichten: 599

<PersoonlijkeText/>


« Antwoord #13 Gepost op: 23 December 2009, 14:59:14 »

Fout.
maar het werkt wel
en ook als ik dit doe
GML:
obj_player.x=270


Naar boven Gelogd

Stijnio
Gebruiker

Offline Offline

Berichten: 159


« Antwoord #14 Gepost op: 24 December 2009, 10:43:07 »

Nu verander je gewoon de x-positie van obj_player.
Dit heeft verder niks met arrays te maken. Knipoog

Gr Blij


Evade, Avoid, Survive! - Kun jij alles overleven en het einde bereiken?

Laser Evasion - Hoe lang overleef jij de lasers?
Naar boven Gelogd

Advertenties
« vorige volgende »
Pagina's: [1] 2
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-2021 Nederlandse Game Maker Community