Samochód z licznikiem kilometrów
2017-03-17 / Krzysztof Kozłowski

W tym odcinku zobaczymy, jak do naszego samochodu można dodać licznik, który będzie zliczał przebytą drogę.

Sterowanie samochodem

Zacznijmy od sterowania naszym samochodem. W jaki sposób kierować nim przy użyciu klawiszy kursora. Greenfoot ma kilka przydatnych do tego funkcji. Ich użycie sprowadza się tylko do sprawdzenia, który klawisz na klawiaturze został naciśnięty i albo przesunięcie samochodu do przodu ale obrócenie go w lewą lub prawą stronę.

W tym celu w metodzie act() (która została automatycznie utworzona przez Greenfoot w klasie Samochod) dodajemy poniższy kod:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void act() 
{
if (Greenfoot.isKeyDown("up")) {
move(10);
}

if (Greenfoot.isKeyDown("left")) {
turn(-5);
}

if (Greenfoot.isKeyDown("right")) {
turn(5);
}
}

Dla przypomnienia: co robią komendy move() i turn():

  • move() – przemieszcza nasz samochód do przodu o zadaną liczbę kilometrów
  • turn() – skręca samochód o zadaną liczbę stopni – jeśli podamy wartość dodatnią, to samochód skręci w prawo (zgodnie z ruchem wskazówek zegara), a jeśli ujemną, to w lewo.

Jak widać trzy instrukcje, które dodaliśmy w metodzie act() sprawdzają tylko, który z klawiszy naciśnięto i reagują na to albo przesunięciem samochodu albo jego skrętem.

Ruch samochodu można spowolnić lub przyspieszyć suwakiem na dole programu.

Licznik

Aby można było zapamiętać przejechany dystans musimy wyposażyć nasz samochód w licznik kilometrów. Można to zrobić bardzo prostu. W klasie Samochod dodamy pole typu int (bo przechowywać będziemy w nim liczbę kilometrów) o nazwie licznik. Oczywiście, by możliwe było pobranie obecnego stanu licznika oraz ustawienie nowego, musimy dodać odpowiednie metody get i set.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Samochod extends Actor
{
private int licznik;

public Samochod() {
this.licznik = 0;
}

public int getLicznik() {
return licznik;
}

public void setLicznik(int licznik) {
this.licznik = licznik;
}
...

Mamy pole, przechowujące przebyty dystans, teraz więc musimy tylko pole uaktualniać podczas przemieszczania się samochodu. W tym celu utworzymy nową metodę o nazwie skrec(), która oprócz przesunięcia samochodu do przodu doda do obecnego stanu licznika drogę przebytą ostatnio:

1
2
3
4
public void jedz(int ile) {
move(ile);
licznik = licznik + ile;
}

Metoda ta wewnętrznie wykonuje komendę move(). Metoda niczego nie zwraca, dlatego przed jej nazwą nie ma nazwy typu tylko słówko void.

Po zmianach klasa Samochod powinna wyglądać tak:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class Samochod extends Actor
{
private int licznik;

public Samochod() {
this.licznik = 0;
}

public int getLicznik() {
return licznik;
}

public void setLicznik(int licznik) {
this.licznik = licznik;
}

public void jedz(int ile) {
move(ile);
licznik = licznik + ile;
}

public void act()
{
if (Greenfoot.isKeyDown("up")) {
jedz(10);
}

if (Greenfoot.isKeyDown("left")) {
turn(-5);
}

if (Greenfoot.isKeyDown("right")) {
turn(5);
}
}

}

Zamiast korzystania z metody move() korzystamy teraz z metody jedz(). Robi to samo, ale teraz oprócz samej jazdy modyfikuje pole licznik.

Dodatki

Klasę Samochod można uzupełnić o dwie przydatne funkcje.

Pierwsza z nich to wykrywanie, czy samochód nie dojechał już przypadkiem do brzegu świata, w którym się porusza. Wykorzystamy do tego wbudowaną funkcję Greenfoot-a o nazwie isAtEdge()

1
2
3
if (isAtEdge()) {
turn(180);
}

Jeśli samochód dojedzie do któregoś z brzegów, kierunek jazdy zmieni się o 180 stopni i pojedzie w przeciwnym kierunku.

Druga przydatna rzecz, to wyświetlenie stanu licznika na ekranie tak, by było widać jak się zmienia podczas jazdy. W tym celu musimy z poziomu naszego programu dostać się do naszego świata (metodą getWorld()), a następnie wykorzystać metodę showText() do wyświetlenia jakiegoś tekstu na ekranie.

Metoda showText() ma następującą składnię:

1
showText("Napis do wyświetlenia", x, y);

Jak widać powyżej w metodzie setText() musimy podać trzy rzeczy, aby napis znalazł się na ekranie. Te trzy rzeczy nazywamy parametrami funkcji lub metody. Pierwszy parametr to po prostu napis, który chcemy wyświetlić na ekranie. Parametr drugi i trzeci to współrzędne czyli miejsce na ekranie, gdzie napis ma być wyświetlony.

Lewy górny róg ekranu ma współrzędne (0, 0). Zwiększając pierwszą współrzędną będziemy zmieniać miejsce wyświetlenia w kierunku prawej krawędzie ekranu, a zwiększając drugą współrzędną w kierunku dolnej krawędzi. Zwiększając obie wartości przemieszczać będziemy się więc i w dół i w prawo, a więc w kierunku dolnego prawego rogu.

Dodajemy:

1
getWorld().showText(licznik + " km", 60, 10);

Pierwszy parametr – napis do wyświetlenia ma u nas postać:

1
licznik + " km"

To znaczy, że najpierw pobrana zostana wartość pola licznik i do tej wartości zostanie dodany napis ”* km*”, dzięki czemu otrzymamy ładnie wygladający stan licznika. Tu może się nasuwać pytanie, jak to możliwe, że do liczby (bo pole licznik jest przecież typu int) dodajemy napis. Jest to możliwe, bo Java za nas najpierw przekształca wartość liczbową na napis, a dopiero potem dodaje do niego drugi napis ”* km*”. W efekcie dodawania powstaje jeden napis, np. „60 km”.

Poniżej w załącznikach znajduje się plik ZIP z projektem, który można otworzyć w środowisku Greenfoot i uruchomić.

Załączniki

Auto z licznikiem 13KB
PermaLink: https://java.kozlowski.photos/2017/03/samochod-z-licznikiem-kilometrow/