Greenfoot este un IDE (integrated development enviroment) ce folosește limbajul de programare Java, creat pentru a ajuta elevii să învețe să programeze într-un mod plăcut și distractiv. În acest program, un utilizator poate să creeze un joculeț 2D interactiv, folosindu-se de programarea orientată pe obiecte.
Istoric
Michael Kölling, un mare programator german și profesor universitar, a venit în anul 2003 cu ideea unui program cu rol educațional prin intermediul căruia sudenții universității în care el preda să învețe limbajul de programare Java mai ușor. Astfel a luat inițiativă proiectul Greenfoot, a cărei primă versiune a fost creată de studentul Poul Henriksen sub supravegherea profesorului în 2004. Prima versiune completă, Greenfoot versiunea 1.0, a fost publicată la 31 mai 2006.
În mai 2007, proiectul Greenfoot a fost premiat cu „Duke’s Choice Award” în categoria „Java Technology in Education”. În martie 2009, proiectul Greenfoot a devenit software gratuit și open source.
Despre jocurile create în Greenfoot
Orice joc are la bază, întotdeauna, o lume/un loc specific(ă) unde se desfășoară toată acțiunea și o serie de personaje care se ocupă de desfășurarea acțiunii. În Greenfoot, acestea se numesc clase și sunt denumite World și Actor. Acestea sunt clasele de bază, din care vor porni alte instanțe ale clasei, care vor fi folosite în joc. Clasa World are o subclasă MyWorld care va fi lumea de start a jocului.
Aceasta este interfața Greenfoot, de unde se vor accesa toate particularitățile programului: actori, lumi, setări etc.
Din această interfață se poate rula jocul și se poate ajusta viteza animației acestuia. În partea de sus se găsește un meniu ce conține setările scenariului în curs, shortcut-uri și secțiunea Help.
Cum se realizează un joc?
Pentru a realiza un joculeț în acest program, este nevoie ,în primul rând, de un scenariu bine gândit și idei de implementare a acesteia într-un mod interesant și captivant.
Să luăm pas cu pas fiecare aspect al unui posibil joc simplu.
În primul rând, trebuie să punem bazele: cel puțin doi actori care participă la acțiune și o lume. Pentru a schimba imaginea de fundal, click-dreapta pe MyWorld, apoi se selectează Set Image… . Din Library Images se alege imaginea dorită sau se alege o imagine aparținând unei surse externe.
De notat, este posibil ca unele imagini să nu aibă dimensiunile corespunzătoare lumii, deci dimensiunile lumii trebuie modificate. Pentru a face acest lucru, dublu click pe MyWorld. Se va deschide o fereastră ce servește scrierii codului. Acolo se află metoda super având parametrii de tip int 600, 400, 1, cu explicația comentată mai sus. O metodă reprezintă o funcție care, de fiecare dată când este apelată, activează o serie de linii de cod scrise separat care realizează o comandă. Metoda super se ocupă cu dimensiunile lumii curente. Pentru a ajusta lumea în așa fel încât să se potrivească imaginea, valorile trebuie modificate.
Acum, este nevoie de doi actori. În general, este recomandat să se creeze o subclasă a clasei Actor din care se fie extinse clasele actorilor participanți la acțiune. O caracteristică a limbajului Java este că metodele și variabilele se moștenesc de la clasă la subclasă, deci se pot scrie metodele într-o clasă MyActor, iar subclasele acesteia vor beneficia de ele.
După ce au fost creați actorii participanți (cam același procedeu ca înainte), trebuie să se înceapă scrierea liniilor de cod. Toate metodele de bază sunt scrise și explicate în documentațiile claselor World și Actor. Dacă sunt necesare alte metode pentru o anumită parte a jocului, atunci acelea trebuie create, cum am zis mai înainte, separat.
Când se deschide Editorul unui actor, se întâlnește metoda act(). Rolul acesteia este să relizeze acțiunile clasei respective cât timp actorul se află în lume. Spre exemplu, dacă se vrea ca actorul să meargă la dreapta până când întâlnește un alt actor, iar după coliziune să meargă la stânga, codul va arăta astfel:
În această bucată de cod se află doi actori participanți, Turtle și Snake. S-a inițializat o variabilă speedx de tipul int cu 5, aceasta reprezentând viteza lui Turtle. În act() s-a folosit metoda setLocation(int,int) pentru a se realiza mișcarea. Metodele getX() și getY() returnează coordonatele curente ale lui Turtle după sistemul de axe XOY. Metoda isTouching(class) verifică dacă Turtle atinge orice instanță a clasei Snake și returnează în urma acestei verificări true sau false, depinzând de caz. Dacă este true, atunci viteza ia valoare negativă, iar Turtle va merge în sens invers, iar dacă este false, își va continua drumul inițial.
Dacă se dorește un mic joc interactiv interactiv, atunci este nevoie de un actor principal care să poată avea posibilitatea de a se mișca în funcție de jucător și de un altul care îl influențează într-un fel. Un alt exemplu, jucătorul controlează un actor principal, iar dacă acesta atinge un anumit actor, atunci iese de sub control. Codul arată astfel:
Și în acest caz, actorii participanți sunt Turtle și Snake. S-a inițializat o variabilă speed de tipul int reprezentând viteza lui Turtle și una de tip boolean denumită sem. Aceasta joacă rolul de semafor în alternanța „control” / „fără control”. Cât timp sem este egală cu false, metoda movement creată separat va fi apelată. Când Turtle atinge o instanță din clasa Snake, sem devinde true, iar metoda movement nu mai este apelată, ci are loc o secvență care îl va face pe Turtle să meargă pe diagonala unui pătrat, controlul asupra lui fiind pierdut. Mai jos este definită metoda movement. Fiecare if() conține o condiție Greenfoot.isKeyDown(), care este de tip boolean și verifică dacă tasta respectivă este apăsată.
Despre metoda Greenfoot.isKeyDown()
S-a folosit mai înainte metoda Greenfoot.isKeyDown() pentru a verifica dacă o anumită tastă este apăsată. Metoda nu va funcționa cu toatele tastele.
Lista tastelor pe care Greenfoot le poate detecta:
- „a”, „b”, „c”, „d”, „e”, „f”, „g”, „h”, „i”, „j”, „k”, „l”, „m”, „n”, „o”, „p”, „q”, „r”, „s”, „t”, „u”, „v”, „w”, „x”, „y”, „z”;
- „up”, „down”, „left”, „right”;
- „1”, „2”, „3”, „4”, „5”, „6”, „7”, „8”, „9”, „0”;
- „F1”, „F2”, „F3”, „F4”, „F5”, „F6”, „F7”, „F8”, „F9”, „F11”, „F12” (Fără F10!);
- (” – „) , (” = „) , (” ” „) , (” ; „) , (” ‘ „) , (” , „) , (” . „) , (” / „) (au fost puse paranteze pentru a se vedea clar fiecare tastă în parte);
- „escape”;
- „enter”, „space”, „backspace”;
Cum se declanșează un event cu ajutorul mouse-ului
Metoda anterioară nu funcționează și în cazul mouse-ului. De aceea, este necesară o metodă separată.
Drept exemplu, avem ideea: Când player-ul dă click, imaginea de fundal se schimbă. Codul arată astfel:
S-a declarat variabila button de tipul public int. În act() se află metoda checkMouse(), metodă care a fost creată separat. În aceasta mai declarăm o variabilă mouse de tipul MouseInfo care va verifica la fiecare pas dacă se realizează o mișcare cu mouse-ul. Pentru aceasta s-a folosit metoda Greenfoot.getMouseInfo(). Dacă mouse este diferit de null, adică dacă a fost făcută o mișcare cu mouse-ul, atunci variabila button va primi cu exactitate un număr, depinzând dacă a fost dat click prin mouse.getButton(). Dacă button are o valoare diferită de 0(dacă a fost dat click) și dacă a fost dat click o singură dată (Greenfoot.mouseClicked(null)), atunci imaginea de fundal a lumii se va schimba, fiind utilizat aici setBackground().
Răspunsuri la întrebări frecvente
De ce mai este nevoie să învăț Greenfoot, când pot învăța direct Java? Nu cred că este chiar atât de greu.
Într-adevăr, nu ești obligat să înveți Greenfoot înainte sau în timpul lecțiilor de Java, dar dacă stai să privești și dintr-o altă perspectivă, Greenfoot îți oferă o anumită experiență pe care o dobândești într-un mod interesant și distractiv. Te ajută să înțelegi principiile Java mult mai ușor.
Am încercat să scriu un cod mai complex pentru jocul meu; când apăs Compile, nu-mi evidențiază nicio eroare, iar jocul este salvat. Totuși, când vreau să-l rulez, nu funcționează. De ce?
Când dai Compile, este bine să te asiguri că în partea de jos îți apare și mesajul „Class Compiled – no syntax errors”. Mereu trebuie să fii sigur că toate metodele sunt declarate corect, că actorii participanți extind clasele corespunzătoare dacă este cazul, că nu s-au folosit metodele incorecte (cum ar fi intersects() în loc de isTouching() sau invers), că tot codul respectă planul de idei al scenariului la care te-ai gândit, etc. Când o problemă ca aceasta are loc, verifică toate clasele. Este posibil ca o anumită clasă să fie hașurată, ceea ce înseamnă că în codul acesteia este o problemă și astfel știi unde să verifici mai exact.
Cum adaug imagini în Greenfoot din surse externe?
După ce ai găsit imaginea dorită, deschide folder-ul proiectului Greenfoot respectiv. Copiază/Decupează imaginea respectivă și lipește-o în folder-ul images. La fel procedezi și în cazul fișierelor audio, numai că ele trebuie lipite în folder-ul audio.
Ce se întâmplă dacă într-o lume adaug mai multe instanțe ale unei clase?
Nu se va întâmpla nimic special în particular, doar că toate instanțele vor acționa în același fel. Dacă vrei ca fiecare instanță să acționeze într-un mod diferit, trebuie să creezi mai multe subclase.