Pare dni temu siedziałem nad detektorem kolizji dla prostej gry 2D. "Coś" nie działało, więc pierwsze podejrzenie na funkcję analizującą, czy 2 prostokąty nachodzą na siebie. Wyglądało to mniej więcej tak:
boolean doesColide(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) { return ( max(ax1, ax2) >= min(bx1, bx2) && min(ax1, ax2) <= max(bx1, bx2) && min(by1, by2) <= max(ay1, ay2) && max(by1, by2) >= min(ay1, ay2) ); }
Pisanie testów? Zdecydowanie nie. Testowanie interaktywne jest szybsze i łatwiej wypatrzeć gdzie algorytm się nie sprawdza. Przeniosłem kod tej metody do Processing ( czyli Javy :P ), obudowałem wizualizacją (jeden kwadrat nieruchomy, drugi porusza się wraz z kursorem). Jeżeli ruchomy jest zielony - brak kolizji. W przeciwnym wypadku - czerwony.
Czas pisania kodu: 2 minuty. Czas testowania: 2 minuty.
boolean doesColide(int ax1, int ay1, int ax2, int ay2, int bx1, int by1, int bx2, int by2) { return ( max(ax1, ax2) >= min(bx1, bx2) && min(ax1, ax2) <= max(bx1, bx2) && min(by1, by2) <= max(ay1, ay2) && max(by1, by2) >= min(ay1, ay2) ); } void setup() { size(400, 400); background(255); } void draw() { background(255); rect(150, 150, 100, 100); if (doesColide(mouseX-50, mouseY-50, mouseX+50, mouseY+50, 150, 150, 250, 250) ) fill(255, 0, 0); else fill(0, 255, 0); rect(mouseX-50, mouseY-50, 100, 100); fill(0); }
Brak komentarzy:
Prześlij komentarz