Pająk łapie muchy
Wprowadzenie
Stworzymy aplikację, w której nasz bohater – pająk - będzie łapał muchy. Sterowanie pająkiem będzie odbywać się przy pomocy klawiszy strzałek. Muchy będą się tworzyć w losowej ilości w losowych miejscach, mało tego, stworzymy prostą symulację muchy – będzie się poruszała sama, a gdy „wyczuje” pająka, spróbuje od niego uciec. Poniżej zrzut, jak aplikacja docelowo będzie wyglądać:
Czego się nauczymy:
- generowania większej niż 1 ilości obiektów danej klasy naraz,
- poruszania obiektem przy pomocy klawiszy strzałek,
- sprawdzania, czy obiekt pewnej klasy nie jest w pobliżu.
Tworzenie pola gry Potrzebujemy stworzyć podklasę Świata, a także aktorów, którzy będą po naszym świecie (a konkretniej – ścianie) chodzić. Pytanie, czy w kwestii much będziemy potrzebować stworzyć 'n' różnych aktorów, żeby ich dodać? Zobaczymy, jak można kwestię „mnożenia” obiektów rozwiązać, tworzymy więc tylko jednego aktora klasy Mucha, jednego Pająka, oraz - jako Świat – Ścianę, dodając im odpowiednie grafiki. (jeśli chodzi o ścianę, polecamy tę białą – przy czerwonej czasem pająk się może zlać z tłem). Kompilujemy, powinniśmy otrzymać następujący widok:
Pająk
Mamy zatem stworzone pole gry, z prawej strony widać też listę aktorów, możemy się zatem zająć programowaniem naszego głównego antybohatera. Dodajmy go najpierw do Świata. Wchodzimy więc do edytora klasy Sciana, usuwamy na tę chwilę wszystkie komentarze. W metodzie konstruktora Sciany pod wywołaniem metody rodzica (dla przypomnienia – super(600,400,1)) tworzymy nowy obiekt:
Pajak pajaczek = new Pajak();
Oprócz tego potrzebujemy też dodać go do naszego świata na sam środek planszy, poprzez znaną nam instrukcję:
addObject(pajaczek, 300, 200);
Kompilujemy i sprawdzamy, czy mamy pająka na ścianie (tej wirtualnej, rzecz jasna). Nasz pająk może i jest już dodany do świata, ale nie rusza się...co jest dobrą oznaką, bo musimy go nauczyć chodzić! Edytujemy zatem klasę Pajak (komentarze usuwamy). Teraz zagadka: gdzie powinniśmy dodać kod odpowiedzialny za chodzenie? Mamy taką specjalną metodę act(), która wykonuje się przez cały czas trwania programu – może ją moglibyśmy wykorzystać? Nawet nie 'moglibyśmy', co 'powinniśmy'! Zagadka kolejna - jak można nauczyć pająka chodzić? Pomyślmy: mamy ograniczone pole manewru, jeśli chodzi o klawiszologię – nasz antyheros potrafi się poruszać tylko w 2 wymiarach, możemy skorzystać zatem ze starego dobrego warunku 'if' – jeżeli. Co będziemy sprawdzać w naszym warunku? Potrzebujemy metody, która jest mostem między programem komputerowym a klawiaturą, możemy zatem spróbować przejrzeć dostępne metody dla samego Greenfoota! Wpisujemy więc w metodę act() następujący kod:
if(Greenfoot.)
Ustawiamy kursor edytora po kropce i wciskamy kombinację ctrl+spacja – dostaniemy listę metod:
Wśród nich jest metoda isKeyDown(String), w opisie tej metody, widzimy, że faktycznie, to może być strzał w dziesiątkę - „Sprawdza, czy konkretny klawisz jest naciśnięty”. Dodajemy po kropce isKeyDown(). Jako parametr tej metody potrzebujemy nazwę klawisza, którą będziemy sprawdzać. Nazwy są angielskie, skoro będziemy używać strzałek, to mają one następujące nazwy: górna - "up”, dolna - "down”, lewa - "left” oraz prawa - "right”. Wstawiamy "up” do miejsca parametru i powinniśmy mieć następujący kod:
if(Greenfoot.isKeyDown("up")
Co ma się stać, jeśli użytkownik wciśnie klawisz strzałka w górę? Nasz pajęczak powinien się poruszyć w górę – musimy pamiętać, jak grafika jest rysowana w Javie (i C++ i wielu innych językach) – lewy górny róg jest początkiem naszego układu, ma więc współrzędne (0, 0). Prawy dolny – (600, 400). Można zatem zauważyć, że idąc w dół, nasze 'Y' będzie rosło, idąc w górę – malało! Wiemy więc, jak musimy zmieniać X i Y naszego aktora, teraz zastanówmy się, czego musimy użyć, żeby to położenie zmienić (słowo-klucz: ustawić). Będziemy mu ustawiać położenie, możemy zatem poszukać, jakie metody związane są z ustawianiem. Pod naszym warunkiem wpisujemy set, wciskamy ctrl+spacja i widzimy, że jest metoda setLocation(x,y), która potrzebuje dwóch liczb. Jeśli chcemy, żeby nasz pająk szedł do góry, nasza współrzędna X powinna się nie zmieniać, co innego współrzędna Y. Tę zmniejszymy o 5. Potrzebujemy jeszcze obecną lokację – od tego są metody pobierające – getX() oraz getY(). Wykorzystamy je zatem do naszych celów i koniec końców powinniśmy dostać następujący kod dla klawisza ”up”:
if(Greenfoot.isKeyDown("up"))
setLocation(getX(), getY()-5);
Tłumacząc na język polski: jeśli klawisz „strzałka w górę” został naciśnięty, to ustaw lokację na ObecneX oraz ObecneY, ale pomniejszone o 5. Kompilujemy i testujemy. Działa! Działanie reszty klawiszy ustawiamy analogicznie. Cały kod metody act() pająka wygląda zatem następująco:
Kompilujemy i sprawdzamy, czy faktycznie nasz pająk goni we wszystkich kierunkach. Błędy mogą wynikać z literówek w nazwach klawiszy lub nieprawidłowych modyfikacjach współrzędnych.
[[Pytanie: Jeśli nie chcielibyśmy korzystać z metody setLocation(), to czy da się w inny sposób nauczyć pająka chodzić? Pająk w tym momencie robi „moonwalking”. Odpowiedź: Da się. Potrzebowalibyśmy nieco “roztyć” nasz kod, ale kwestię wymyślenia jak to zrobić, pozostawiamy Wam, drodzy nauczyciele, oraz Waszym uczniom. Podpowiedź: wykorzystamy ten drugi sposób w ruchu much.]]