Greenfoot Tutorial Version 1.0 for Greenfoot Version 1.0
Michael Kölling
Vertaald en aangepast vanaf paragraaf 4 door Thijs Dorssers Fontys
This tutorial is an introduction to the Greenfoot Object World. Greenfoot is a software tool designed to let beginners get experience with object-oriented programming. It supports development of graphical applications in the Java™ Programming Language. Greenfoot was designed and implemented at the University of Kent, England, and Deakin University, Melbourne, Australia. More information about Greenfoot is available at www.greenfoot.org. This tutorial is intended for people who want to familiarise themselves with Greenfoot. It aims at being brief, rather than complete, and focuses on functionality of the Greenfoot environment. It does not attempt to teach Java. It assumes that the reader knows some Java already, or is getting some support while working through the second half of this tutorial. All of the activities described here assume working with an existing scenario, and discuss how to use and make modification to that scenario. Users who want to built their own scenarios, or make major changes to existing scenarios, should also read The Greenfoot Programmer’s Manual. The Greenfoot system and this tutorial are available 'as is', free of charge to anyone for use and non-commercial re-distribution. Disassembly of the system is prohibited. No part of the Greenfoot system or its documentation may be sold for profit or included in a package that is sold for profit without written authorisation of the authors. The copyright © for Greenfoot is held by Poul Henriksen and Michael Kölling. In het software-lab bij Fontys Hogeschool Techniek en Bedrijfsmanagement is voor de workshop Greenfoot de software ervoor al geinstalleerd. Na het inloggen duurt het even maar uiteindelijk verschijnt op het bureaublad een start-icoon "Greenfoot", dubbelklik hierop en kies in het menu dat dan verschijnt de onderste optie "continue without scenario". Omdat in het lab de Greenfoot software anders is geinstalleerd dan normaal, moet je ook nog de volgende file scenarios downloaden en opslaan in "My Documents" en daar ook uitpakken. In greenfoot kies je dan het menu "scenarios" en daarvan de optie "open", vervolgens ga je binnen het venster dat dan opkomt opzoek naar de map "scenarios" in "My Documents", deze heb je net uitgepakt. Hier kun je dan het gewenste scenario selecteren. Lees nog even de paragraaf met het wombats scenario. En ga daarna verder met paragraaf Aan de gang Voorwaarden Je moet Java 5 (ook wel JDK 1.5 geheten) of hoger op je computer geinstalleerd hebben om Greenfoot te kunnen gebruiken. In het algemeen wordt aanbevolen de laatste stabiele (non-beta) Java release te installeren. Als je de JDK nog niet geinstalleerd hebt, download deze dan van Sun’s web site op http://java.sun.com/j2se/ . Let op, download niet de versie met de naam “JRE” (Java Runtime Environment) – de JRE is niet voldoende. Je hebt de versie nodig met de naam JDK. On MacOS X, a recent J2SE version is pre-installed - you do not need to install it yourself. Voor Microsoft Windows systems, download je de Windows versie van de installer. Double-click op de installer file, en volg de instructies. De installatie volgt een standard installatie proces. For Mac OS X, download the Mac OS version of the software. The download file is a zip file. Your browser may unpack that file automatically for you. If not, double-click the zip file to unpack it. The resulting folder contains the Greenfoot application and sample scenarios. Both can be placed anywhere you like. One common arrangement is to place the Greenfoot application into the Applications folder and the ‘scenarios’ into the Documents folder. The Installer for all other systems is an executable jar file. You can run the installer by opening a command line, and typing
java -jar greenfoot-installer-XX.jar (where XX is the version number of your install file). On some systems, double-clicking the jar file may also work. (Note that this command assumes that the ‘java’ command is in your command path. If not, install and set up java first.) Deze tutorial gebruikt twee scenarios, deze heten ‘wombats’ en ‘wombats2’ . Ze zijn geleverd samen met het Greenfoot programma. Elk scenario kun je vinden als een map in je bestandssysteem, je kunt een scenario openen door op menu-optie Scenario te klikken en daarna op Open.. (samengevat: scenario -> Open..)
Figure 1: Het Wombat scenario in Greenfoot
Het kan zijn dat je deze tutorial geopend hebt vanuit de het Greenfoot programma. Dat is prima. Zo nee, dan moet je nu eerst Greenfoot starten. Het installatie proces heeft een programma met de name ‘greenfoot’ geinstalleerd. Start dit programma. (On Linux and Unix systems, ‘greenfoot’ is an executable shell script.) Als Greenfoot opgestart is, en als the Wombats scenario niet automatically opent, kies ‘Open...’ van het ‘Project’ menu en selecteer het ‘wombats’ scenario van de Greenfoor voorbeeld scenarios. Je moet dan iets zien op het scherm zien zoals figure 1 (behalve dat je geen bladeren of wombats zult zien in de wereld). Het grote rooster dat het merendeel van het window beslaat wordt “ de wereld ” genoemd. Omdat we hier een scenario hebben dat te maken heeft met wombats (zie Voetnoot 1), zien we een wombat wereld. Meer aan de rechterkant van het window is het class display . Hier kun je alle java klassen zien die betrokken zijn bij dit project. De klassen “World” and “Actor” zullen je hier altijd zien – deze zijn deel van het greenfoot systeem. De andere klassen behoren tot het wombat scenario, en zullen anders zijn als je andere scenarios gebruikt. Onder de wereld vind je de de start-, stop- en pause-knoppen (het gebied met ‘Act’ en ‘Run’ knoppen de schuiver). Meer in de richting van de rechter bovenhoek van het window is een knop met opdruk “Project Information”. De meeste scenarios zullen, als je op deze knop klikt, informatie tonen met betrekking tot het scenario. Deze informatie vertelt je normaal gesproken wat het doel van het scenario is, hoe je het moet runnen, wat je ermee kunt doen, en misschien vind je er suggesties hoe je dit scenario zelf nog zou kunnen aanpassen. We gaan nu enkele dingen (objecten) in de wereld plaatsen. Rechter muisklik (on Mac: Control-click) op de Wombat klasse in het “class display”. Je krijgt dan een pop-up menu te zien. Kies ‘New Wombat()’. Daarna klik (linker muisklik) je ergens in de wereld. Je hebt nu een wombat aangemaakt (in Java termen: een object) en in de wereld geplaatst. Wombats eten bladeren, dus laten we ook enkele bladeren in de wereld leggen. Rechter muisklik op de Leaf klasse en plaats dit blad in de wereld. Er is een snellere manier om meerdere objecten in de wereld te plaatsen: shift-clicking in de world. Maar zorg er wel eerst voor dat de Leaf klasse is geselecteerd, hou vervolgens de Shift toets ingedruk en klik verschillend keren in de wereld. Bij elke klik plaats je zo een object van de geselecteerde klasse in de wereld. Klik op de ‘Act’ knop. Elk object gaat nu aan de gang – dat wil zeggen: elk object gaat doen wat het object wil gaan doen. Wat objecten willen gaan doen hangt af van hoe deze zijn gedefinieerd – Wij komen hier later op terug. In ons voorbeeld, zijn bladeren gedefinieerd om niks te doen, terwijl wombats voorwaarts bewegen. Als je dit nog niet gedaan hebt plaats je nu twee wombats in de wereld en klik je weer op de Act knop. Beide wombats zullen bewegen. Wombats lusten ook graag bladeren. Als ze een blad tegenkomen op hun weg, dan zullen ze dit blad opeten. Klik op de ‘Run’ knop. Dit levert hetzelfde op als steeds weer en wel heel snel achter elkaar op de Act knop klikken. Het zal je opvallen dat de Run knop verandert in een ‘Pause’ knop. Als je op de Pause knop klikt stopt de hele. De schuiver naast de Act en Run knop stelt de snelheid in. Klik Run en verschuif de schuiver en je zult merken wat bedoeld is.
Inplaats van het hele scenario te runnen, kun je ook een enkele methode aanroepen. Een methode is een enkele actie die een object kan uitvoeren. Zorg ervoor dat je een wombat in de wereld hebt, en dat het scenario niet loopt. Klik nu met de rechter muis op de wombat, en je zult zien dat objecten in de world ook een pop-up menu hebben (Figure 2). Figure 2: Een object popup menu
Je kunt elk van de methoden, die getoond worden, selecteren om de wombat te vragen iets te doen. Probeer bijvoorbeeld turnLeft(). Als je deze menu-optie selecteert, vertel je de wombat linksom te draaien. Probeer move(). Sommige methoden geven een antwoord terug. getLeavesEaten() bijvoorbeeld zal je vertellen hoeveel bladeren deze wombat gegeten heeft. Probeer het maar eens. Je hebt misschien ook al gezien dat er een methode is met de naam ‘act()’. Deze mehtode wordt elke keer uitgevoerd, als op de Act knop geklikt wordt. Als je wilt dat maar een object iets doet (act) in plaats van alle objecten, kun je dat dus doen door van dit ene object de act methode direct via het pop-up menu aan te roepen. Als je veel objecten in de world hebt, die je niet meer hebben wilt, en als je helemaal opnieuw wilt beginnen, dan is er een eenvoudige optie: gooi de wereld weg en maak een nieuwe wereld aan. Dit doe je door met de rechter muis op de WombatWorld klasse te klikken en ‘new WombatWorld()’ te selecteren. Je krijgt dan een nieuwe lege world. De oude world is daarmee verdwenen samen met al zijn objecten. – je kunt maar een world tegelijker tijd hebben. We hebben gezien dat objecten in de wereld methoden hebben, die je kunt aanroepen middels een pop-up menu. De wereld zelf is ook een object met met methoden die je kunt aanroepen. In de vorige paragraaf hebben we gezien hoe je nieuwe worlds kunt aanmaken. Nu willen we een methode van het world object aanroepen. Boven het world display is een titel dat de naam van de wereld toont – “WombatWorld” in ons geval. Klik met de rechter muis op deze titel, en je zult het world pop-up menu zien. Een van de methoden in dit menu is ‘populate()’. Probeer deze eens uit. Het is een methode die verschillend leaves en wombats aanmaakt en deze in de wereld plaatst. Probeer daarna het scenario weer eens te runnen. Een andere methode is ‘randomLeaves(int howMany)’. Deze methode plaatst een aantal leaves in de world op willekeurige (Eng. random) plaatsen. Wat opvalt is, dat deze methode enkele woorden tussen haakjes achter zijn naam heeft: int howMany . Dit noemen we een ‘parameter’. Het betekent dat je nog wat extra gegevens moet invoeren als je deze methode aanroept. De term ‘int’ vertelt je dat er een geheel getal verwacht wordt, en ‘howMany’ suggereert dat je zou moeten invullen hoeveel bladeren je hebben wilt. Roep deze method aan. Een dialoogvenster zal verschijnen, dat je de mogelijkheid geeft een waarde voor deze parameter in te voeren. Voer het getal – zeg: 12 – in en klik op ok. (Het is je misschien opgevallen dat, als je ze telt, er soms minder bladeren verschijnen dan het aantal dat je ingevoerd hebt. Dit komt doordat er bladeren kunnen zijn die op de zelfde plaats in de wereld terecht komen (de bladeren liggen dan op elkaar). Okay, misschien heb je nu wel genoeg wombats eindloos rondjes in de wereld zien maken – laten we nu met echte werk beginnen: het programmeren van spannender gedrag voor je eigen wombats!
In de rest van deze tutorial gaan we ervan uit dat de lezer bekend is met enkele beginselen van het programmeren, zoals het begrip variabele, while-do,for to do, en functie dan wel methoden aanroepen bij voorkeur in Java of Visual Basic. Het is mogelijk je eigen objecten te programmeren – wombats, of wat je ook maar wilt – door zelf Java code voor de klasse te schrijven. En dat is precies watwenu gaan doen. do now. Dubbel-klik op de Wombat class in het class display. Een text editor wordt geopend en wat je daarin ziet is de Java bron code van de Wombat class. Het eerste wat we willen doen is, verander het gedrag van wombat zo dat, als het niet meer voorwaarts kan, het een willekeurige andere kant op gaat in plaats van steeds maar linksom draaienso. Om dit te bereiken voegen we eerst een ‘turnRandom()’ methode toe. Opmerking: Op de regels die beginnen met // of die tussen /* en */ staan staan opmerkingen die niet tot de java code behoren, dus tellen in feite niet mee. Verder zie je in onderstaande methode ‘public void’ staan, hier komen we later op terug. De naam van deze methode is ‘turnRandom’, aan de haakjes kun je zien dat het een om een methode gaat, in Visual Basic praten ze dan over een functie. /** * Turn in a random direction. */ public void turnRandom() { // get a random number between 0 and 3... int turns = Greenfoot.getRandomNumber(4);
// ...an turn left that many times. for(int i=0; i<turns; i++) { turnLeft(); } } Voeg de bovenstaande methode toe aan de Wombat klasse, doe dit bijvoorbeeld direct na de reeds bestaande code
public Wombat() { setDirection(EAST); leavesEaten = 0; } Daarna verander je de methode ‘act()’ om ook echt gebruik te maken van onze nieuwe methode ‘turnRandom’. De act() methode ziet er nu nog als volgt uit:
public void act() { if(foundLeaf()) { eatLeaf(); } else if(canMove()) { move(); } else { turnLeft(); } } Vervang de aanroep van ‘turnLeft()’ aan het einde door een aanroep van ‘turnRandom()’ vergeet de haakjes niet het gaat immers om een methode-aanroep. Okay, we zijn klaar. Nu maar eens uit proberen. Klik op de ‘Compile’ knop in de editor (linksboven). Als er fouten gemeld worden (onderaan in het editor venster), controleer dan eerst of je alles zoals het voorgeschreven is hebt gedaan, en verbeter de gevonden fouten. Herhaal dit tot de klasse zonder fouten compileert. Dan pas kun je de editor sluiten en verder gaan met testen. Voordat je het gewijzigde project kunt uitvoeren (=runnen) moet je het project eerst compileren. Je kunt dit in de editor doen, of in Greenfoot’s hoofd window (rechtsonder ‘Compile all’). Eenmaal succesvol gecompileerd, kun je objecten aanmaken. Bij het compileren wordt (indien dit met succes gebeurde) automatisch een world object aangemaakt. Er zijn twee manieren om het plaatje(=image) van een object te veranderen: Je kunt het plaatje van de klasse veranderen, in dat geval veranderen we het default plaatje voor alle objecten van die klasse. Of een object zou programmatisch zijn plaatje kunnen veranderen, in dat geval verandert alleen het individuele object. Elk object kan zijn plaatje veranderen zo vaak als het wil. Om een ander klasse plaatje in te stellen, kies je ‘Set Image...’ van pop-up menu van de klasse. Probeer dit maar eens bij de Leaf class uit – verander het plaatje (Eng. image) in, laten we zeggen, een banaan, en de wombat zal dan bananen eten. (Dit is waarschijnlijk niet iets wat de dierentuindirecteur zal aanbevelen, maar dit is ook maar een simulatie ....). Greenfoot heeft een bibliotheek van plaatjes ingebouwd, die je naar believe kunt gebruiken, of je zou eigen plaatjes in de ‘images’ map van de scenario map (‘wombats’) kunnen plaatsen en dan deze gebruiken, bijvoorbeeld een foto van je informatica leraar. De tweede mogelijkheid is om een object zijn eigen image te laten veranderen als onderdeel van de geprogrammeerde actie. Een object kan dit heel gemakkelijk doen door de methode ‘setImage’ die het geerfd heeft van Actor. Er zijn twee versies van ‘setImage’: een verwacht een parameter van het type GreenfootImage, de andere gebruikt de naam van een bestand (en leest dit bestand dan onzichtbaar voor ons in, in plaatst het resultaat in een object van het type GreenfootImage) We zullen de tweede variant, die een bestand inleest, gaan gebruiken. Wat we willen bereiken is dat wombats niet meer op de kop naar links lopen. Het ‘wombats’ project bevat al een bestand met de naam ‘wombat-left.gif’ in zijn ‘images’ sub-map. Dit is een bestand met een plaatje in GIF formaat, dat een gespiegeld plaatje laat zien van de wombat, die we tot nu toe gezien hebben: een wombat die naar links kijkt. We kunnen het plaatje van de wombat veranderen door de naar-links-kijk versie te gebruiken en te schrijven:
setImage("wombat-left.gif"); We zullen deze methode aanroepen als de wombat van richting veranderd. Om dit voor elkaar te krijgen moeten we de Wombat’s ‘setDirection(int Direction)’ methode aanpassen. Zoek deze methode in de Wombat bron code. We zullen hier een paar regels toevoegen om het juiste plaatje in te stellen met de juiste draaing en wel afhankelijk van de richting waarin de wombat van plan is te gaan lopen. We zullen het ‘wombat-left’ plaatje gebruiken als in richtingen westen and noorden gelopen wordt, en het originele ‘wombat’ plaatje als naar het oosten en zuiden gelopen wordt. Merk op dat het ‘wombat-left’ plaatje al naar het westen kijkt – het hooeft daarom ook niet geroteerd te worden als we naar het westen gaan, vandaar de
setRotation(0); Hier is de nieuwe versie van ‘setDirection’:
/** * Sets the direction we're facing. */ public void setDirection(int direction) { this.direction = direction; switch(direction) { case SOUTH : setImage("wombat.gif"); setRotation(90); break; case EAST : setImage("wombat.gif"); setRotation(0); break; case NORTH : setImage("wombat-left.gif"); setRotation(90); break; case WEST : setImage("wombat-left.gif"); setRotation(0); break; default : break; } } Dit werkt op zich goed genoeg. Als we dit wat beter hadden willen doen, zouden we de plaatjes maar een keer moeten laden (in the constructor Wombat()) en de plaatjes objecten in variabelen van het type GreenfootImage moeten opslaan. In dat geval kunnen we variabelen met de plaatjes objecten kunnen gebruiken om steeds te wisselen. Misschien is het nu een goed idee om ook nog twee plaatjes toe te voegen voor de op en neer beweging van de wombat – we laten echter dit over aan de liefhebbers. Om veranderingen aan te brengen aan het object gedrag, is het vaak nodig om enkele standard Greenfoot klassen te gebruiken. Greenfoot voorziet in 4 belangrijke klassen die je moet kennen: World, Actor, GreenfootImage en Greenfoot. De eerste twee zijn zichtbaar in het Greenfoot scherm, en vormen de zogenaamde superklassen van de scenario’s world en object klassen. GreenfootImage wordt gebruikt om met plaatjes te werken, en Greenfoot voorziet in toegang tot het zogenaamde Greenfoot framework zelf. Een manier om meer van deze klassen te weten te komen is te kijken in Greenfoot’s online documentatie. Deze je vind je op: http://www.greenfoot.org/doc/javadoc/ Op die pagina kom je bij de online versie van de Greenfoot klassenbeschrijvingen (genaamd de “Greenfoot API”), en je kunt de beschrijving als een enkel, te printen document, downloaden. Roep de ‘Inspect’ functie aan vanuit het pop-up menu (rechter muisklik) van een of andere wombat in de world (Opm: je moet het window dat dan verschijnt noch wat breder maken tot dat getallen zichtbaar worden). Dit geeft je de mogelijkheid in het binnenste van een object te kijken, en de waarden van de variabelen (ook wel velden genoemd) te zien veranderen. Dit kan van nut zijn bij het testen terwijl je bezig bent iets nieuws te maken in de klasse. Je zult merken dat enkele velden gedefinieerd zijn in de Wombat klasse (zoals ‘leavesEaten’) en andere velden niet gedefinieerd zijn in Wombat. Deze extra velden (zoals x, y en rotation) zijn geerfd van Actor en zijn aanwezig in alle Greenfoot objecten. Als een waarde getoond wordt met een pijlsymbool, dan bevat het betreffende veld een verwijzing naar een ander object, dat op zijn beurt ook weer geinspecteerd kan worden (door dit te selecteren en vervolgens op ‘Inspect’ te klikken). Het wordt tijd om het leven van onze wombats wat meer uitdagender te maken, door enkele obstakels toe te voegen: rocks. (Wij gaan de rocks zo groot maken dat de wombats er niet overen kunnen klimmen.) Om dit te doen, maken we een nieuwe actor klasse. Kies ‘New subclass’ van het the pop-up menu van Actor. Dit zal een nieuwe klasse als sub-klasse van Actor aanmaken. Als om een klassenaam gevraagd wordt, type dan ‘Rock’ in. Je wordt ook gevraagd een image voor deze klasse te selecteren. Natuurlijk kun je opzoek gaan naar een plaatje (Google is your friend!) of er zelf een maken (met een of ander tekenprogramma), en dit plaatje in de ‘images’ map plaatsen voor je de nieuwe klasse gaat aanmaken. Dan kun je ook dat plaatje hier in deze dialoog selecteren. In dit geval, hebben we het rots-plaatje al in de map geplaatst met de naam ‘rock.gif’, dat schiet wat beter op hier. Selecteer het plaatje, klik op Ok, en de nieuwe klasse met de naam Rock is aangemaakt. Open nu de editor voor die klasse. Je zult merken dat er al automatisch een broncode skelet gegenereerd is. Feitelijk hoeven we op dit moment zelf geen code te schrijven. (Rocks heeft wel nog geen enkel gedrag, maar dat komt later wel.) Sluit de editor, compileer en test (maak een object aan). Voil� – daar zijn je rocks! Bevolk nu het scenario en test the wombats. (Hiervoor zou je de world’s ‘populate’ en ‘randomLeaves’ methoden kunnen gebruiken, en met de hand enkele rocks toevoegen) Je zult merken dat je rocks hebt, maar dat de wombats zich daar niks van aantrekken en er gewoon doorheen lopen. Nou ja, hier moet nog wat gebeuren. Grote aanpassingen of compleet nieuwe scenarios maken, behandelen we in deze tutorial niet. Wil je dat toch doen, dan heb je twee opties: Je zou bestaande scenarios kunnen bestuderen, of je zou de Greenfoot Programmer’s Manual kunnen lezen. Merk op: De Programmer’s Manual is in ontwikkeling, er ontbreken noch enkele hoofdstukken, en is hij in het Engels geschreven. Natuurlijk is er ook de Greenfoot klass documentatie (the Greenfoot API), zoals eerder verteld, en deze is ook in het Engels. Omdat deze documentatie redelijk beknopt is, is hij goed te begrijpen. Het laatste dat we hier doen, om je toch een korte indruk te geven, is nog een aanpassing te maken zodat de wombats niet meer door de rotsen lopen. Open de editor voor klasse Wombat en zoek de ‘canMove’ methode. Op dit moment controleert deze methode of we tegen de rand van de world aanlopen. We moeten deze methode zover krijgen dat hij ook false teruggeeft in het geval er een voor hem een rock opdaagt. Vervang de laatste return statement, die er nu uitziet als:
return true; door het volgende stuk code:
List rocks = myWorld.getObjectsAt(x, y, Rock.class); if(rocks.isEmpty()) { return true; } else { return false; }
Dit stukje code krijgt een lijst van alle rocks van de cell voor ons. Als deze lijst leeg is, kunnen we vooruit gaan, anders niet. Het project ‘wombats2’, dat onderdeel is van de greenfoot download, bevat alle hier besproken veranderingen. Opgave: Breid het wombat scenario uit met een super wombat, die in staat is om wombats te eten i.p.v. bladeren. Tip: Maak een "New subclass" van Wombat aan en noem deze nieuwe classe SuperWombat. In SuperWombat verwijder je de methode ant() in zijn geheel. Test deze SuperWombat uit, je ziet dat hij nu precies hetzelfde kan als de gewone wombat. In the Wombat class verander je de naam van de methode eatLeaf() in eat() en foundLeaf() in found(). Overal waar eatLeaf() aangeroepen wordt, verander je deze aanroep dan natuurlijk in eat(). Overal waar foundLeaf() aangeroepen wordt, verander je deze aanroep dan natuurlijk in found(). In de SuperWombat code voeg je nu ook de methodes found() en eat() toe, maar hier ga je nu i.p.v. op leaves testen op wombats testen en i.p.v. de leaves, de wombats opeten. Hiermee zou het moeten werken. In tutorial2 ga je het ant scenario verder uitwerken. In dit scenario laten we een mier in zijn mierenwereld lopen, deze mier gaat een reukspoor achter zich aan trekken. Het reukspoor heeft een bepaalde levensduur, dat wil zeggen dat na een bepaalde tijd het spoor verdwenen is. Je gaat er een geurvreter ontwikkelen die je met pijltjestoetsen kunt besturen en waarvan je de score gaat bijhouden. Let op: Verwissel het ant scenario niet met het ants scenario dat met greenfoot meegeleverd wordt. Het ant scenario kun je in tutorial2 downloaden. Open enkele andere scenarios die mee geinstalleerd zijn met de greenfoot software. Kijk welke je interesseren, en zoek uit hoe ze werken. Ga naar de Greenfoot web site, hier vind je nog veel meer scenarios. Maar het belangrijkste van allemaal, "do this at home" en praat er met je klasgenoten over. Er zijn twee manieren om meer over greenfoot te weten te komen, en in contact te komen met de Greenfoot community:
De mailing lijst vind je hier: http://www.greenfoot.org/about/mailing.html Veel plezier! 1 Een wombat is een Australisch dier. Wil je er meer over weten, kijk dan op Wikipedia: http://en.wikipedia.org/wiki/Wombat . |