Wykrywanie kolizji

Wykrywanie kolizji w Greenfoot (z ang. collision detection) to po prostu sprawdzanie, czy dwa obiekty na ekranie nie zderzyły się ze sobą czyli czy na siebie w pewnym momencie nie najechały. Wykrywanie kolizji jest istotne w nawet najprostszych grach, dzięki temu gra wygląda realistycznie.

Wstęp

Z poprzednich odcinków wiesz już, jak w programie utworzyć nowy obiekt klasy Samochod i co zrobić, by dało się nim sterować przy pomocy klawiszy kursora:

Klasa Bomba

Skoro mamy już poruszający się samochód i skoro chcemy nauczyć się wykrywać kolizje, to potrzebować będziemy drugiej klasy dla obiektu, o który będzie rozbijał się samochód. W tym celu utworzymy nową klasę o nazwie Bomba. Na ekranie obiekt tej klasy będzie wyglądał jak… bomba, po najechaniu na którą samochód zniknie.

Nową klasę tworzymy podobnie jak poprzednio klasę Samochod. Na bloku symbolizującym klasę Actor klikamy prawym klawiszem myszy i wybieramy opcję New subclass…

Jako nazwę klasy wpisujemy Bomba, a jako obrazek symbolizujący obiekty nowej klasy wybieramy obrazek bomb.png (znajduje się w kategorii objects).

Po kliknięciu klawisza OK powinniśmy pod klasą Actor zobaczyć obie utworzone przez nas klasy: klasę Samochod i klasę Bomba.

Uzbrojenie bomby

Nowa klasa jest gotowa. Przy pomocy konstruktora klasy – czyli klikając na klasie Bomba prawym klawiszem myszy i wybierając opcję new Bomba() – utworzymy nowy obiekt. Ale co zrobić, by w sytuacji, kiedy najedzie na nią samochód, wyzwolić jakąś akcję, np. zniknięcie obiektu?

W klasie Bomba w metodzie act() musimy dodać fragment kodu, w którym użyjemy nowej funkcji aktora, metody getOneIntersectingObject(). Jest to metoda zdefiniowana w klasie Actor, której opis znajdziemy pod adresem https://www.greenfoot.org/files/javadoc/greenfoot/Actor.html.

Dokumentacja klas

Przy okazji warto zapamiętać adres https://www.greenfoot.org/files/javadoc, który prowadzi do strony głównej dokumentacji opisującej klasy stworzone przez twórców Greenfoot-a. Wśród nich jest klasa Actor. Dokumentacja to bogate źródło wiedzy, z której można się dowiedzieć o wielu różnych ciekawych metodach. Dokumentacja – jak większość dokumentacji – jest niestety w języku angielskim, ale do tego trzeba w porgramowaniu się przyzwyczaić i równolegle z programowaniem szlifować znajmość języka angielskiego, przynajmniej na takim poziomie, by możliwe było właśnie zrozumienie różnych dokumentacji.

Wracając do naszej klasy: poniżej kompletny kod klasy Bomba:

import greenfoot.*;

public class Bomba extends Actor
{
    public void act() 
    {
        Actor a = this.getOneIntersectingObject(Samochod.class);
        if (a != null)
        {
            getWorld().removeObject(a);
        }
    } 
}

Zwróćcie uwagę, że jako argument w metodzie getOneIntersectingObject() podano Samochod.class czyli klasę, której obiekty będą monitorowane na wypadek kolizji. Działa to tak, że jeśli obiekt klasy Bomba spotka się z obiektem klasy Samochod, to zmienna a (typu Actor) będzie miała jakąś wartość (nie będzie nullem). Wartością zmiennej a będzie obiekt, który najechał na bombę. Wiedząc, który to obiekt, łatwo go usunąć korzystając w tym celu z metody removeObject() (jest to metoda klasy World).

Jak to działa?

Na koniec dwa filmy pokazujące, jak to działa w praktyce oraz poniżej – w sekcji Załączniki – plik ZIP z programem.

 

Załączniki

  • zip auto
    Auto z bombą
    Rozmiar pliku: 10 KB Pobrania: 87