niedziela, 29 czerwca 2008

Dokańczamy projekt

No więc tak jak obiecałem dokończymy poprzedni projekt. Do zrobienia został jeszcze tylko ruch przeciwnika oraz wykrywanie kolizji.

Zrobimy to wszystko w jednej funkcji, oczywiście ładniej wyglądałby kod gdybyśmy rozdzielili to na 2 funkcje, ale jako, że jestem leniwy zrobiłem wszystko w jednym. Dodatkowo po wykryciu kolizji z graczem odbijamy przeciwnika i w pionie i w poziomie (to też z lenistwa :P ). Po odbiciu od krawędzi bocznych zmieniamy tylko wartość Y na przeciwną, a po odbiciu od krawędzi dolnej oraz górnej zmieniamy tylko wartość X na przeciwną.

Ok, kod odpowiadający za zarządzanie ruchem przeciwnika oraz obsługę kolizji wygląda następująco:


private void ruchPrzeciwnika() {
boolean kolizjaZGraczem, kolizjaPionowa, kolizjaPozioma; // kolizjaPionowa = kolizja z gorna lub dolna krawedzia ekranu; kolizjaPionowa = kolizja ze sciana

kolizjaZGraczem = this.przeciwnik.collidesWith(gracz, true);

kolizjaPionowa = (this.przeciwnik.getY() < 0 || this.przeciwnik.getY() + this.przeciwnik.getHeight() > this.getHeight());
kolizjaPozioma = (this.przeciwnik.getX() < 0 || this.przeciwnik.getX() + this.przeciwnik.getWidth() > this.getWidth());


if (kolizjaZGraczem || kolizjaPionowa || kolizjaPozioma) { // jesli nastapila jakakolwiek kolizja musimy zmienic kierunek
if (kolizjaZGraczem) { // przy kolizji z graczem dla ulatwienia odbijamy kwadrat w te strone z ktorej przyszedl ^^
switch (kierunek) {
case 3:
kierunek = 7;
break;
case 1:
kierunek = 9;
break;
case 7:
kierunek = 3;
break;
case 9:
kierunek = 1;
break;
default:
kierunek = 7;
}
} else if (kolizjaPionowa) {
switch (kierunek) {
case 3:
kierunek = 9;
break;
case 1:
kierunek = 7;
break;
case 7:
kierunek = 1;
break;
case 9:
kierunek = 3;
break;
default:
kierunek = 7;
}
} else if (kolizjaPozioma) {
switch (kierunek) {
case 3:
kierunek = 1;
break;
case 1:
kierunek = 3;
break;
case 7:
kierunek = 9;
break;
case 9:
kierunek = 7;
break;
default:
kierunek = 7;
}
}
}
if (kierunek == 1) {
eX -= 2;
eY += 2;
} else if (kierunek == 3) {
eX += 2;
eY += 2;
} else if (kierunek == 7) {
eX -= 2;
eY -= 2;
} else if (kierunek == 9) {
eX += 2;
eY -= 2;
}
}


Teraz wystarczy tylko wywołać napisaną właśnie funkcję w funkcji run() naszej klasy clsCanvas (gdzieś przed lm.paint()).

Aha... zapomniałem, do naszej klasy dodałem jeszcze jedną zmienną typu int o nazwie "kierunek" z wartością domyślną "3".

private int kierunek = 3;

Będzie ona odpowiedzialna właśnie za kierunek poruszania się naszego "przeciwnika". Wartość tej zmiennej odpowiada układowi klawiatury numerycznej. Czyli domyślna wartość "3" oznacza, że ruch będzie wykonywany w kierunku prawego dolnego rogu itd.

Jeszcze jedna uwaga, dobrze jest od czasu do czasu używać skrótu klawiszowego ALT + SHIFT + F, aby kod w edytorze był czytelniejszy.

Albo i jeszcze jedna uwaga, kod, który zaprezentowałem nie jest bezbłędny. Zawiera on również kilka ułatwień zmniejszających realistyczność ruchu. A wszystko to z lenistwa. Chodziło tylko o zaprezentowanie kilku podstawowych pojęć dotyczących programowania gier, więc nie musi on być idealny.:P

1 komentarz:

Anonimowy pisze...

Mógłbyś dokończyć całego bloga? Bardzo fajne tutoriale, proste do zrozumienia :)