leer hoe je een eenvoudig spel maakt met Python!
Dit is een bericht van Tutorial teamlid Julian Meyer, een 13-jarige Python Ontwikkelaar. Je kunt hem vinden op Google+ en Twitter.
heeft u zich ooit afgevraagd hoe videospellen worden gemaakt? Het is niet zo ingewikkeld als je zou denken!
in deze handleiding maak je een eenvoudig spel genaamd Bunnies and Dassen, waarbij de held, het konijn, een kasteel moet verdedigen tegen een aanvallende horde dassen., : O
om dit spel te schrijven, gebruik je Python. Nee, Ik heb het niet over een grote slang! :]
Python is een computerprogrammeertaal. We kozen Python voor deze tutorial omdat het een eenvoudige taal is om mee te beginnen en leuk en gemakkelijk te leren is.
als Python nieuw voor je is, check dan voordat je begint dit boek: Think Python: How To Think Like a Computer Scientist. Dat moet je op de hoogte brengen.
duik dan terug en maak je klaar – er komt een oorlog aan tussen de konijntjes en de dassen. Blijf lezen om in de strijd te springen!,
aan de slag: Python installeren
Als u deze tutorial op een Windows PC wilt proberen, moet u Python installeren. Zorg ervoor dat u de 2.7.3 versie te grijpen en niet de 3.3.0 versie! Na het uitvoeren van het installatieprogramma, moet u inactief in uw map Alle programma ‘ s in uw menu start. Start inactief om te beginnen.
als je op een Mac zit, heb je Python al geïnstalleerd! Open gewoon Terminal (/Applications / Utilities / Terminal.app), typ python in en druk op Enter.
opmerking: als je Python installeert vanuit python.,org (en misschien moet als je PyGame aan het werk wilt krijgen), dan heb je ook toegang tot IDLE op de Mac ook. Het zou in de map “/Applications/Python 2.7” moeten staan.
Als je het goed gebruikt, moet u iets ziet zoals dit:
Opmerking: Als u weg wilt van de Python prompt (de drievoudige haken, >>>), kunt u ofwel typt u exit() bij de Python-prompt en druk op enter of druk op Control+D.,
Als u zich achter de Python-prompt bevindt, typt u print 1+1 in om te testen of Python correct werkt en drukt u op Enter/Return. Het moet afdrukken 2. Je hebt net je eerste Python programma geschreven!
Nu u weet dat Python correct werkt, moet u PyGame installeren om een spel met Python te schrijven.
PyGame is een Python bibliotheek die het schrijven van games een stuk makkelijker maakt! Het biedt functionaliteit zoals beeldverwerking en geluidsweergave die u gemakkelijk in uw spel kunt opnemen.,
ga hier en download de PyGame installer die geschikt is voor uw systeem. Zorg ervoor dat je een Python 2.7 versie downloadt.
Opmerking: Het PyGame-installatieprogramma van de bovenstaande link werkt niet met de standaard Python van Apple die op een Mac is geïnstalleerd. Je moet Python downloaden van python.org en installeer het om PyGame te gebruiken. Of u kunt zowel Python Als PyGame installeren via MacPorts.
om te controleren of u PyGame correct hebt geïnstalleerd, opent u IDLE of voert u Python uit via de Terminal en typt u pygame importeren op de Python-prompt., Als dit niet resulteert in een output, Dan ben je goed.
als aan de andere kant een fout wordt uitgevoerd zoals hieronder wordt getoond, dan is PyGame niet geïnstalleerd.
als je een fout als deze krijgt, post dan op de forums en Ik zal je helpen om het aan de praat te krijgen.
het uitvoeren van Python-Code uit bestand
terwijl u korte stukjes Python-code kunt draaien op de Python-prompt, wilt u waarschijnlijk uw code opslaan in een bestand zodat u het niet steeds opnieuw hoeft in te typen.
er zijn verschillende manieren om een Python programma als een bestand uit te voeren., Een manier is om een platte teksteditor te gebruiken zoals Notepad (Windows), of TextEdit (Mac). Open een nieuw tekstbestand, typ je Python code in (zoals print 1+1). Sla het dan op als XXX.py (de XXX kan elke beschrijvende bestandsnaam zijn).
dubbelklik vervolgens op Windows op dit bestand om het uit te voeren. Open Terminal op Mac en typ python, sleep het bestand dat u hebt opgeslagen naar het terminalvenster en druk op Enter.
de andere manier is om uw code in te typen met behulp van de inactieve editor, Wat is wat je gaat doen in deze tutorial. Als u inactief wilt uitvoeren, typt u inactief vanuit Terminal., Kies vervolgens Bestand\Nieuw venster uit het menu inactief en je moet een tekstverwerker venster hebben waar je Python code kunt typen. U kunt uw code Wijzigingen opslaan via File \ Save en zelfs uitvoeren van de code via Run \ Run Module (F5).
merk op dat het menu Uitvoeren alleen beschikbaar is als u een bestand in een editorvenster hebt geopend.
het toevoegen van de spelbronnen
u bent bijna klaar om uw spel aan te maken. Maar wat is een spel zonder een aantal geweldige graphics en geluidseffecten? Ik heb alle graphics en geluidseffecten die je nodig hebt voor je spel samengebracht in een ZIP-archief. U kunt het hier downloaden.,
zodra u het bestand hebt gedownload, maakt u een map voor uw spel op uw harde schijf en extraheert u de map resources in die map zodat uw spelmap een submap heeft met de naam resources, met de verschillende resources gegroepeerd in extra mappen erin, zoals dit:
u bent nu klaar om te beginnen met het maken van konijntjes en dassen. :]
Stap 1: Hallo Bunny
voer inactief uit en open een nieuw teksteditorvenster, zoals vermeld in de vorige sectie., Typ de volgende code in het editor venster:
sla het bestand op in je spelmap (degene waar de resources submap zich bevindt) en geef het een naam game.py.
laten we de code sectie-voor-sectie doorlopen:
- importeer de pygame bibliotheek. Hiermee kunt u functies uit de bibliotheek gebruiken in uw programma.
- Initialiseer PyGame en stel het venster in.
- Laad de afbeelding die u wilt gebruiken voor het konijn.
- blijf over de volgende ingesprongen code lopen.,
Opmerking: waar andere talen zoals Objective-C, Java of PHP accolades gebruiken om een blok code te tonen dat moet worden uitgevoerd binnen een while lus of een if statement, gebruikt Python inspringen om codeblokken te identificeren. Dus de juiste inspringing is erg belangrijk in Python-houd dat in gedachten. :]
- vul het scherm met zwart voordat u iets tekent.
- voeg de afbeelding van het konijntje toe die u op het scherm hebt geladen met x = 100 en y = 100.
- het scherm bijwerken.
- Controleer op nieuwe gebeurtenissen en als er een is, en het is een quit Commando, verlaat het programma.,
opmerking: volgens de pygame-documentatie hoeft u pygame niet aan te roepen.quit () omdat de interpreter het automatisch zal aanroepen wanneer de interpreter uitschakelt. Echter, in ieder geval op Mac OS, het spel zou hangen op exit tenzij pygame.quit () werd genoemd.
Als u de code nu uitvoert (via de module Run\Run in het menu Idle), zou u een scherm moeten zien dat vergelijkbaar is met het onderstaande:
w00t het konijntje is in de scene, en klaar voor actie!
maar het spel ziet er eng en eenzaam uit met het konijn dat daar op een zwarte achtergrond staat., Tijd om de dingen wat mooier te maken. :]
Stap 2: Scenery toevoegen
laten we beginnen met het toevoegen van een achtergrond aan de spelscène. Dit kan worden gedaan met een paar meer scherm.blit () roept.
aan het einde van sectie #3, Voeg na het laden van de player image de volgende code toe:
grass = pygame.image.load("resources/images/grass.png")castle = pygame.image.load("resources/images/castle.png")
Dit laadt de images en plaatst ze in specifieke variabelen. Nu moeten ze op het scherm getekend worden. Maar als u de grasafbeelding controleert, zult u merken dat het niet het hele schermgebied dekt, dat is 640 x 480., Dit betekent dat je moet tegel het gras over het scherm gebied om het volledig te dekken.
voeg de volgende code toe aan game.py aan het begin van Sectie # 6 (voordat de speler op het scherm getekend wordt):
zoals je kunt zien, loopt De for statement eerst door x. Dan, binnen die voor lus, het loops door y en tekent het gras op de x en y waarden gegenereerd door de voor lussen. De volgende paar lijnen tekenen gewoon de kastelen op het scherm.
als je het programma nu uitvoert, krijg je iets als dit:
veel beter – dit begint er goed uit te zien!, :]
Stap 3: Laat Het Konijntje bewegen
vervolgens moet je een aantal echte gameplay-elementen toevoegen, zoals het konijn laten reageren op toetsaanslagen.
om dat te doen, implementeer je eerst een goede methode om bij te houden welke toetsen op een gegeven moment worden ingedrukt. U kunt dit gewoon doen door het maken van een array van sleutel toestanden die de status van elke sleutel die u wilt gebruiken voor het spel bevat.
voeg de volgende code toe aan game.py aan het einde van Sectie # 2 (nadat u de schermhoogte en-breedte hebt ingesteld):
keys = playerpos=
deze code spreekt voor zich., De keys array houdt bij welke toetsen in de volgende volgorde worden ingedrukt: WASD. Elk item in de array komt overeen met één toets – de eerste naar W, de tweede naar A enzovoort.
De playerpos variabele is waar het programma de speler trekt. Aangezien het spel de speler naar verschillende posities zal verplaatsen, is het makkelijker om een variabele te hebben die de positie van de speler bevat en dan gewoon de speler op die positie te tekenen.
nu moet u de bestaande code voor het tekenen van de speler wijzigen om de nieuwe playerpos variabele te gebruiken., Wijzig de volgende regel in Sectie # 6:
screen.blit(player, (100,100))
naar:
screen.blit(player, playerpos)
volgende werk de Keys array bij op basis waarvan toetsen worden ingedrukt. PyGame maakt het detecteren van toetsaanslagen eenvoudig door event toe te voegen.sleutelfunctie.
aan het einde van Sectie #8, direct na de blokkeercontrole op gebeurtenis.type = = pygame.QUIT, zet deze code (op hetzelfde inspringniveau als de pygame.Afsluiten als blok):
Wow! Dat zijn veel regels code. Als je het opgesplitst in de if statements al, het is niet zo ingewikkeld.,
eerst controleer je of er een toets ingedrukt of vrijgegeven wordt. Vervolgens controleer je welke toets wordt ingedrukt of vrijgegeven, en als de toets die wordt ingedrukt of vrijgegeven een van de toetsen is die je gebruikt, werk je de Keys variabele dienovereenkomstig bij.
ten slotte moet u de playerpos variabele bijwerken als reactie op de toetsaanslagen. Dit is eigenlijk heel eenvoudig.
voeg de volgende code toe aan het einde van het spel.,py (met één inspringniveau, waardoor het op hetzelfde niveau komt als De for-lus):
# 9 - Move player if keys: playerpos-=5 elif keys: playerpos+=5 if keys: playerpos-=5 elif keys: playerpos+=5
deze code controleert eenvoudig welke toetsen worden ingedrukt en voegt toe of af van de x-of y-positie van de speler (afhankelijk van de ingedrukte toets) om de speler te verplaatsen.
voer het spel uit en je zou een speler moeten krijgen net als voorheen. Druk op WASD. Yay! Het werkt.,
Stap 4: Het Konijntje draaien
Ja, je konijntje beweegt nu als je op de toetsen drukt, maar zou het niet nog cooler zijn als je met je muis het konijntje kon draaien naar een richting die je kiest, zodat hij niet altijd dezelfde kant op kijkt? Het is eenvoudig genoeg om te implementeren met behulp van trigonometrie.,
Kijk naar de volgende afbeelding:
in de bovenstaande afbeelding, als (5,3) de positie van het konijn is en (2,4) de huidige positie van de muis, kunt u de rotatiehoek (z) vinden door de atan2 trigonometrische functie toe te passen op het verschil in afstanden tussen de twee punten. Natuurlijk, als je eenmaal de draaihoek weet, kun je het konijn gewoon dienovereenkomstig draaien. :]
Als u een beetje in de war bent over dit deel, maak u geen zorgen – u kunt toch doorgaan. Maar dit is waarom je moet opletten in wiskunde klas!, :] Je zult dit spul de hele tijd gebruiken in het programmeren van games.
nu moet je dit concept toepassen op je spel. Om dit te doen, kunt u gebruik maken van de Pygame oppervlak.roteer (graden) functie. Houd er overigens rekening mee dat de Z-waarde in radialen ligt. : Hoe zit het met het laten van het konijn schieten vijanden met behulp van pijlen? Dit is geen zachtaardig konijn!
deze stap is wat ingewikkelder omdat je alle pijlen moet bijhouden, bijwerken, draaien en verwijderen wanneer ze uit het scherm gaan.,
voeg eerst de benodigde variabelen toe aan het einde van de initialisatie sectie, sectie #2:
acc=arrows=
De eerste variabele houdt de nauwkeurigheid van de speler bij en de tweede array volgt alle pijlen. De nauwkeurigheid variabele is in wezen een lijst van het aantal schoten afgevuurd en het aantal dassen geraakt. Later zullen we deze informatie gebruiken om een nauwkeurigheidspercentage te berekenen.
laadt vervolgens de pijlafbeelding aan het einde van sectie #3:
arrow = pygame.image.load("resources/images/bullet.png")
wanneer een gebruiker op de muis klikt, moet een pijl worden afgevuurd., Voeg het volgende toe aan het einde van Sectie #8 als een nieuwe event handler:
deze code controleert of er op de muis is geklikt en als dat zo was, krijgt het de muispositie en berekent de rotatie van de pijl op basis van de geroteerde spelerspositie en de cursorpositie. Deze rotatiewaarde wordt opgeslagen in de array arrows.
vervolgens moet u de pijlen op het scherm tekenen. Voeg direct na paragraaf 6.1 De volgende code toe:
De vely-en velx-waarden worden berekend met behulp van basistrigonometrie. 10 is de snelheid van de pijlen., Het if statement controleert gewoon of de kogel buiten de grenzen is en als dat zo is, verwijdert het de pijl. De tweede voor statement lus door de pijlen en tekent ze met de juiste rotatie.
probeer het programma uit te voeren. Je moet een konijn dat schiet pijlen wanneer u op de muis! : D
Stap 6: wapens opnemen! Dassen!
OK, je hebt een kasteel en je hebt een held die kan bewegen en schieten. Wat ontbreekt er? Vijanden die het kasteel aanvallen waar de held op kan schieten!,
In deze stap maakt u willekeurig gegenereerde dassen die op het kasteel draaien. Er zullen meer en meer dassen als het spel vordert. Dus, laten we een lijst maken van wat je nodig hebt om het te doen.
- voeg slechteriken toe aan een lijst een array.
- werk de bad guy array elk frame bij en controleer of ze buiten het scherm staan.
- laat de slechteriken zien.
Easy, right?, :]
voeg eerst de volgende code toe aan het einde van Sectie #2:
badtimer=100badtimer1=0badguys=]healthvalue=194
het bovenstaande stelt een timer in (evenals een paar andere waarden) zodat het spel na enige tijd een nieuwe das toevoegt. Je verkleint de badtimer elk frame tot het nul is en dan maak je een nieuwe das.
Voeg nu het volgende toe aan het einde van sectie #3:
badguyimg1 = pygame.image.load("resources/images/badguy.png")badguyimg=badguyimg1
de eerste regel hierboven is vergelijkbaar met alle vorige code voor het laden van afbeeldingen. De tweede regel stelt een kopie van de afbeelding in, zodat je de slechterik veel gemakkelijker kunt animeren.,
vervolgens moet je de slechteriken bijwerken en tonen. Voeg deze code toe direct na paragraaf # 6.2:
veel code om over te gaan. :] De eerste regel controleert of badtimer nul is en als dat zo is, creëert een badger en zet badtimer weer op basis van hoe vaak badtimer tot nu toe heeft uitgevoerd. De eerste voor lus werkt de x positie van de das bij, controleert of de das van het scherm is, en verwijdert de das als deze offscreen is. De tweede voor lus trekt alle dassen.
om de willekeurige functie in de bovenstaande code te gebruiken, moet u ook de willekeurige bibliotheek importeren., Dus voeg het volgende toe aan het einde van Sectie #1:
import random
tot slot voeg je deze regel direct na het while statement (sectie #4) toe om de waarde van badtimer voor elk frame te verlagen:
badtimer-=1
probeer al deze code uit door het spel uit te voeren. Nu moet je beginnen met het zien van een aantal echte gameplay-Je kunt schieten, bewegen, draaien, en dassen proberen te rennen op je.
maar wacht! Waarom blazen de dassen het kasteel niet op? Laten we dat snel toevoegen…
voeg deze code toe vlak voor de index+ = 1 op de eerste lus in Sectie # 6.,3:
deze code is vrij eenvoudig. Als de x-waarde van de das minder dan 64 aan de rechterkant is, verwijder dan die slechterik en verlaag de gezondheidswaarde van het spel met een willekeurige waarde tussen 5 en 20. (Later wordt de huidige gezondheidswaarde op het scherm weergegeven.)
als je het programma bouwt en uitvoert, zou je een stel aanvallende dassen moeten krijgen die verdwijnen wanneer ze het kasteel raken. Hoewel je het niet kunt zien, de dassen zijn eigenlijk het verlagen van uw gezondheid.,
Stap 7: botsingen met dassen en pijlen
de dassen vallen uw kasteel aan, maar uw pijlen hebben geen effect op hen! Hoe moet een konijn zijn huis verdedigen?
tijd om de pijlen te zetten om de dassen te doden, zodat je je kasteel kunt beschermen en het spel kunt winnen! In principe moet je alle slechteriken doorlopen en in elk van die lussen moet je alle pijlen doorlopen en controleren of ze botsen. Als ze dat doen, verwijder dan de das, verwijder de pijl en voeg er een toe aan uw nauwkeurigheidsverhouding.
direct na sectie # 6.3.,1, Voeg dit toe:
Er is maar één belangrijk ding om op te merken in deze code. Het if statement is een ingebouwde PyGame functie die controleert of twee rechthoeken elkaar snijden. De andere paar regels doen gewoon wat ik hierboven heb uitgelegd.
als je het programma draait, zou je eindelijk in staat moeten zijn om de dassen te schieten en te doden.
Stap 8: Voeg een HUD toe met gezondheidsmeter en klok
het spel vordert vrij goed. Je hebt je aanvallers en je hebt je verdediger. Nu heb je alleen nog een manier nodig om de score bij te houden en te laten zien hoe goed het konijn het doet.,
De makkelijkste manier om dit te doen is door een HUD (Heads Up Display) toe te voegen die het huidige gezondheidsniveau van het kasteel toont. U kunt ook een klok toevoegen om aan te geven hoe lang het kasteel heeft overleefd.
voeg eerst de klok toe. Voeg de volgende code toe vlak voor het begin van Sectie # 7:
bovenstaande code maakt eenvoudig een nieuw lettertype aan met behulp van het standaard pygame-lettertype dat is ingesteld op grootte 24. Dan wordt dat lettertype gebruikt om de tekst van de tijd weer te geven op een oppervlak. Daarna wordt de tekst op het scherm gepositioneerd en getekend.
voeg vervolgens de statusbalk toe., Maar voordat u de gezondheidsbalk tekent, moet u de afbeeldingen voor de balk Laden. Voeg de volgende code toe aan het einde van sectie #3:
healthbar = pygame.image.load("resources/images/healthbar.png")health = pygame.image.load("resources/images/health.png")
de eerste is de rode afbeelding die wordt gebruikt voor de volledige statusbalk. De tweede is de groene afbeelding die wordt gebruikt om het huidige gezondheidsniveau weer te geven.
Voeg nu de volgende code toe direct na Paragraaf #6.4 (die u zojuist hebt toegevoegd) om de statusbalk op het scherm te tekenen:
# 6.5 - Draw health bar screen.blit(healthbar, (5,5)) for health1 in range(healthvalue): screen.blit(health, (health1+8,8))
de code tekent eerst de all-red statusbalk. Dan trekt het een bepaalde hoeveelheid groen over de bar, afhankelijk van hoeveel leven het kasteel nog over heeft.,
als u het programma bouwt en uitvoert, moet u een timer en een statusbalk hebben.
stap 9: winnen of verliezen
maar wat is dit? Als je lang genoeg speelt, zelfs als je gezondheid naar nul gaat, gaat het spel nog steeds door! Niet alleen dat, je kunt ook op de dassen blijven schieten. Dat gaat niet werken, hè? Je hebt een soort van een win/lose scenario nodig om het spel de moeite waard te maken.
dus laten we de Win en lose conditie toevoegen, evenals het win of lose scherm. :] Je doet dit door uit de hoofdlus te stappen en in een win/lose-lus te gaan., In de win / lose lus, je moet erachter te komen of de gebruiker gewonnen of verloren en het scherm dienovereenkomstig weer te geven.
Hier is een eenvoudige schets van de winnen/verliezen scenario ‘ s:
Als de tijd op is (90000 ms of 90 seconden) dan:
- Stoppen met het uitvoeren van het spel
- Set uitkomst van het spel 1 of win
Als het kasteel wordt vernietigd dan:
- Stoppen spel
- Set uitkomst van het spel 1 of win
het Berekenen van de nauwkeurigheid van beide manier.
Opmerking: De acc*1.0 is gewoon het converteren van acc naar een float., Als je dit niet doet, zal de delingsoperand een geheel getal zoals 1 of 2 retourneren in plaats van een float zoals 1.5
voeg deze regels toe aan het einde van game.py:
Dit is het langste stukje code tot nu toe! Maar het is niet zo ingewikkeld.
het eerste if statement controleert of de tijd om is. De tweede controleert of het kasteel vernietigd is. De derde berekent je nauwkeurigheidsratio. Daarna, een snelle if statement controleert of u gewonnen of verloren en geeft de juiste afbeelding.
natuurlijk, als je afbeeldingen wilt weergeven voor de Win en lose schermen, dan moeten die Afbeeldingen eerst worden geladen., Dus voeg de volgende code toe aan het einde van sectie #3:
gameover = pygame.image.load("resources/images/gameover.png")youwin = pygame.image.load("resources/images/youwin.png")
nog een snel ding. Wijzig sectie # 4 van:
# 4 - keep looping throughwhile 1: badtimer-=1
naar:
# 4 - keep looping throughrunning = 1exitcode = 0while running: badtimer-=1
De draaiende variabele houdt bij of het spel voorbij is en de exit code variabele houdt bij of de speler gewonnen of verloren heeft.
voer het spel opnieuw uit en nu kun je triumph of sterven terwijl je het probeert! Koel. :]
stap 10: Gratis Muziek en geluidseffecten!
het spel ziet er goed uit, maar hoe klinkt het? Het is een beetje stil, is het niet?, Het toevoegen van een aantal geluidseffecten kan het hele gevoel van een spel te veranderen.
PyGame maakt het laden en afspelen van geluiden super eenvoudig. Eerst moet je de mixer initialiseren door dit toe te voegen aan het einde van Sectie #2:
pygame.mixer.init()
vervolgens de geluiden te laden en het volume in te stellen aan het einde van sectie #3:
De meeste van de bovenstaande code is gewoon het laden van de audiobestanden en het configureren van de audio volumeniveaus. Maar let op de pygame.mixer.muziek.load line-die regel laadt de achtergrondmuziek voor het spel en de volgende regel stelt de achtergrondmuziek voor altijd te herhalen.,
die zorgt voor de audio-configuratie. :] Nu alles wat je hoeft te doen is om de verschillende geluidseffecten af te spelen als dat nodig is. Doe dat volgens de aanwijzingen in de commentaren voor de onderstaande code:
voer het spel nog een keer uit en je zult merken dat je nu achtergrondmuziek en geluidseffecten hebt voor Botsingen en opnamen. Het spel voelt zo veel meer levend! :]
waar moet ik nu naartoe?
je moet trots zijn op jezelf: je bent net klaar met het maken van een leuk spel vol met muziek, geluidseffecten, een killer rabbit, kamikaze dassen en meer. Ik zei toch dat je het kon!, :]
u kunt de uiteindelijke broncode van het spel hier downloaden.
Op dit punt, voel je vrij om dit spel uit te breiden naar je eigen creatie! Misschien proberen het vervangen van de kunst met je eigen tekeningen, of het toevoegen van verschillende wapens of soorten monsters in het spel!
heeft u vragen of opmerkingen over wat u in deze tutorial hebt gedaan? Als dat zo is, doe dan mee aan de discussie in de forums! Ik zou graag van je horen.
Dit is een bericht van Tutorial teamlid Julian Meyer, een 13-jarige python Ontwikkelaar.
raywenderlich.,com wekelijks
De raywenderlich.com nieuwsbrief is de makkelijkste manier om op de hoogte te blijven van alles wat u als mobiele ontwikkelaar moet weten.
ontvang een wekelijkse samenvatting van onze tutorials en cursussen, en ontvang een gratis uitgebreide e-mail cursus als bonus!
gemiddelde waardering
4.1/5
voeg een waardering toe voor deze inhoud
Meld u aan om een waardering toe te voegen