1. Wat is Greenfoot
Greenfoot is een manier om te leren programmeren in Java. Van programmeren krijg je meer (ICT)vaardigheden bij. Programmeren is veelal een kwestie van puzzels en (complexe) problemen oplossen. Het oplossen van problemen met behulp van computertechniek noemen we ook wel Computatinal Thinking. Hierbij zijn o.a. vaardigheden zoals:
- een probleem ontleden en opknippen in kleine stukjes (decomposition);
- patronen herkennen (wat lijkt op elkaar en heb ik dat probleem al eerder opgelost?);
- informatie filteren (waar gaat het echt om?);
- het kunnen maken van een algoritme. Een algoritme staat voor een aantal programeerregels die een bepaald problemen oplossen.
Programmeren is niet eenvoudig. Hierbij is "try and error" een heel belangrijke manier om programmeren te leren. Door een game te ontwikkelen in Greenfoot leer je alles over Java zoals objecten, klassen, overervering en noem maar op. Het is hierbij wel belangrijk dat je plezier hebt in het programmeren. Met name het creatieve proces is belangrijk. Concreet: je eindigt deze lessen met het maken van een eigen game.
Je kunt al heel aardig games ontwikkelen na ongeveer 8 tot 10 weken, uitgaande van 2 tot 3 lesuren per week. Als je goed doorwerkt kun je de lessen op school doornemen en hoef je geen huiswerk te maken. Bij het ontwikkelen van een zelfgemaakte game zul je merken dat dit veel tijd zal gaan nemen, vergelijkbaar met het ontwikkelen van een website. Daar ontkom je er niet aan om ook buiten de lessen eraan te werken.
In deze cursus zullen we Roodkapje allerlei avonturen laten beleven. Je gaat de Roodkapje-game ontwikkelen dus de cursus is heel praktisch van opzet. Succes met programmeren!
2. Starten met Roodkapje
We zullen nu een start gaan maken met Roodkapje. Download eerst het lege spel. Pak de game uit en als Greenfoot goed staat geinstalleerd kun je de game openen door op te klikken op project.greenfoot.
Als dat niet zo is dan staat Greenfoot niet (goed) geïnstalleerd. Je kunt binnen Greenfoot ook rechtstreeks een game openen. Sluit evt. de al ingeladen game met close en open de nieuwe game met Open.
3. Classes en objecten
Als we de game van Roodkapje hebben geopend dan zien we het volgende:
Dit is de editor van Greenfoot. Hierin kun je de game maken. We zullen nu een voor een de onderdelen doornemen:
- Je ziet in de afbeelding wat een class is. Er zijn binnen Greenfoot twee soorten classes: World classes en Actor classes, rood omlijnd. Je ziet bij de class LittleRedCap dat deze verwijst naar de class BaseClass en dat de class BaseClass weer verwijst naar Actor. Dat noemen we overerving. Alle eigenschappen van Actor zitten ook in de baseClass en uiteindelijk zit in LittleRedCap alles van Actor en Baseclass. Later hierover meer.
- Je ziet ook het object LittleRedCap, blauw omlijnd. Een object is een object in de game. Dat is iets heel anders dan een class. Zie het zo: als een auto moet worden gemaakt dan bestaat daarvan een technische tekening. De tekening is vergelijkbaar met de class. De class is de technische tekening van het object. Van een class bestaat daarom altijd maar één versie terwijl uit die class wel 100 objecten kunnen ontstaan. Vanuit een technische tekening kun je ook wel 1000 of 10.000 auto's maken. Een class is dus een blauwdruk van een object.
Met het knopje run kun je de game werkend maken. Dit is paars omlijnd. Met de pijltjesknoppen kun je Roodkapje besturen (alleen klopt daar nog niet veel van - dat kom in het volgend lesonderdeel aan de orde). Zoals hierboven ook al is gesteld kun je van een Class zoveel objecten maken als je wilt. Dit kun je doen door met de rechtermuisknop te klikken op klikken op new LittleRedCap() en dan Roodkapje te verslepen naar de game.
4. Werken in een methode
In de opdracht van het vorige lesonderdeel heb je, als het goed is, het volgende opgemerkt:
- Roodkapje is bestuurbaar maar van de toetsen klopt nog niet veel. Daar gaan we in dit lesonderdeel iets aan doen.
- Roodkapje gaat vrij langzaam. Daar gaan we ook iets aan doen.
- Je hebt gemerkt dat als je 10 Roodkapjes in de game brengt ze alle 10 op dezelfde manier reageren. Dit is ook het bewijs dat een class de blauwdruk is voor een object in een game.
We zullen nu eens in de code van Roodkapje gaan kijken. Roodkapje zullen we Roodkapje blijven noemen. De class en de code is echter Engels.
Waarom Engels?
De voertaal van het programmeren is internationaal en Engels. Stel dat je op een forum een vraag zou willen stellen. Er zijn Nederlandse forums maar de beste antwoorden krijg je op internationale forums. Ze zullen daar wel snappen wat RedCap betekent maar Roodkapje wordt natuurlijk moeilijk. Het internationale karakter van het programmeren maakt dat het meeste in het Engels is. We zullen ons daaraan zoveel mogelijk houden. Roodkapje blijven we echter Roodkapje noemen.
Roodkapje aanpassen
Als je dubbel klikt op Roodkapje kom je terecht in de achterliggende code van Roodkapje. Je ziet de public void keys().
We noemen dit de method (Engelse benaming) keys() of methode (Nederlandse benaming)keys. Het woordje public betekent dat deze methode ook buiten de class gebruikt mag worden en het woordje void betekent dat er uit de class niets wordt teruggegeven. Void betekent leeg. Soms is het nodig om wel iets terug te geven, bijvoorbeeld om te testen of iets waar of niet waar is. In dat geval staat er bijvoorbeeld return true of return false en wordt de benaming van de methode public boolean keys(). Boolean staat voor waar of niet waar. Als er iets anders staat dan void dan moet de methode iets teruggeven.
Een methode is binnen Greenfoot aangeduid met een geel vlak. Een methode is altijd onderdeel van de class. De class is aangeduid met een groen vlak. Code binnen een methode wordt weer aangeduid met een wit of paars vlak. Hieronder zie je de dat nog eens in een andere (voorbeeld) class.
De syntax van een methode is zoals getoond in de afbeelding. Een methode heeft dus altijd haakjes. Binnen deze haakjes kunnen we ook argumenten meegeven maar daarover later meer. Verder wordt het begin en het einde met een accolade (Engels: brace) aangegeven.
Binnen Greenfoot is de methode public void act() een speciale. De act is de "where the action is". In de act worden alle overige methoden aangeroepen.
5. de API
In bovenstaande lesonderdelen is al een beetje uitgelegd wat overerving is. De class LittleRedCap erft alle eigenschappen van Baseclass en Baseclass erft de hoofdclass Actor. In Greenfoot erven classes meestal - niet altijd - van elkaar. In de Application Programming Interface (API) is dit terug te vinden.
In Java is van iedere class de documentatie te vinden. De meeste editors, zoals Netbeans, kunnen dit automatisch. De Greenfoot editor kan het ook. Klik hiervoor dubbel op de class LittleRedCap en zet de klas op documentation.
Wat je hierna ziet is de documentatie van de class, de API. We zullen de onderdelen globaal doornemen. Allereerst zie je bovenaan van welke bovenliggende classes de class LittleRedCap erft.
Merk op dat er boven Actor nog een class actief is namelijk de class Object. Dit is in Greenfoot niet te zien. Dat komt omdat in Greenfoot alles wat simpeler wordt voorgesteld zodat het gemakkelijker wordt om in Java te kunnen programmeren.
Je ziet ook het commentaar. Dat zijn de regels die tussen /* en */ boven de class staan.
In deze regels kun je meer dingen plaatsen zoals de auteur.
Vervolgens kom je in de Constructor en Method Summary Deze samenvatting geeft informatie over welke methoden er in de class zitten. Dit is de methode act() en keys().
Volgens de API is er ook een constructor. In de code zie je daar niet veel van terug. Het is er echter wel. Onthou dit ervan: de constructor is het startpunt om het object te maken.
De methode act() is in Greenfoot de startmethode. Java heeft altijd een startmethode nodig. Hierin worden de andere methoden aangeroepen. Overigens mag iedere methode een andere methode aanroepen. In de opdrachten bij dit lesonderdeel zal dat wat duidelijker worden.
In het volgende onderdeel kun je zien welke methoden er worden geërfd en van welke classes. Het zijn er heel wat.
We zullen deze methoden in het ontwikkelen van de game volop gaan gebruiken.
In het laatste deel vind je ook beschrijvingen van methoden. Omdat er in onze class nog weinig beschrijvingen staan, is hier weinig informatie te vinden. In een van de opdrachten ga je deze beschrijving zelf maken en daarmee de documentatie aanpassen.
6. Een nieuwe class maken
We zullen nu de Wereld van Roodkapje wat complexer maken. Roodkapje moet naar het huisje maar moet daarvoor eerst bloempjes plukken. Minimaal 10. Deze bloempjes en het huisje zullen we eerst gaan toevoegen door de class, de blauwdruk, te maken.
Klik hiervoor op New Class in het witte vlak van de Actor Classes.
Vul vervolgens de naam van de class in. De naam van een Java class begint altijd met een hoofdletter!!
De class komt nu ergens onderaan te staan. Dit is niet de bedoeling. We willen de class laten erven van Actor. Klik dubbel op de class en voeg de volgende code en commentaar toe:
Merk op dat we voor de versie de datum gebruiken. Je kunt ook een systeem maken met versie 1.0, 2.0 etc. Verder schrijf je je naam als auteur boven de class en geef je de class een beschrijving.
Je ziet nu ook een rode streep onder Actor staan. Dat is een error. Als je er met je muis overheen gaat kun je de reden van de error zien.
Het oplossen van errors is vaak een kwestie van ervaring. In dit geval moet de Java class ook de de Greenfoot library importeren. Dat gebeurt met het codewoord import. We schrijven de code bovenaan de class en zien meteen dat de error dan wordt opgelost.
De * staat voor alle java classes in de package greenfoot.
We hebben nu nog één probleem. De class heeft ook nog een plaatje nodig namelijk een huisje. Dit kunnen we eenvoudig doen door met de rechtermuisknop op de class te klikken en dan te kiezen voor Set Image.
Kies vervolgens het huisje en klik op ok.
Waar staan deze afbeeldingen?
We zullen meteen wat uitleg geven over waar je deze afbeeldingen kunt vinden. In het mapje van het scenario vind je een mapje images. Daarbinnen bevinden zich de afbeeldingen. Greenfoot heeft ook standaard afbeeldingen. Deze kun eventueel ook gebruiken. Bedenk daarbij echter wel dat je dan niet meer zo origineel bent.
7. De wereld van Level1 uitbreiden
We zullen nu de wereld van Roodkapje wat complexer maken. De game van Level1 is als volgt:
Roodkapje moet naar het huisje maar moet daarvoor eerst bloempjes plukken zonder een giftig bloempje te plukken. Het aantal bloempjes wat ze moet plukken is 10. Pas als ze alle bloempjes heeft geplukt zonder een giftig bloempje te plukken kan ze het huisje in waar Level2 begint. De bloempjes en het huisje zullen we eerst gaan toevoegen in de wereld van Level1. In deel 2 van deze cursus zullen we alle overige zaken uit gaan werken.
Klik dubbel op Level1 class en voer de volgende code in:
De code die rood is omlijnd noemen we de constructor. Dit is de startcode om een object te maken van Level1. Hierover enige uitleg:
De code laad constructor van de bovenliggende class met de in java ingebakken methode super()
. In de API vinden we over de constructor van de bovenliggende class World de volgende informatie:
Je kunt in de API dus precies lezen wat de argumenten van de constructor inhouden.
skip command
Alle coderegels worden afgerond met ;
. Dit noemen we het skip-commando. We sluiten hiermee de coderegel af.
Vervolgens wordt ook de methode prepare()
aangeroepen waarin alle objecten worden neergezet. In bovenstaande code is dat gebeurd met het huisje. Het eerste argument is new House()
. In de API is over de methode addObject()
het volgende te lezen.
Het aan te maken object moet zijn van het type Actor (of een subclass daarvan d.m.v. overerving) en de x- en y-coördinaten moeten als 2e en 3e argument worden meegegeven.
Deze code is ook min of meer automatisch aan te maken met de rechtermuisknop Save the World. Voor alle opdrachten geldt echter dat de wereld alleen maar gemaakt mag worden zoals in de eerst getoonde afbeelding van Level1. Zoals in onderstaande afbeelding mag het dus niet.