Semestr zbliża się ku końcowi, nic nie piszę na blogu – czyli mamy stan normalny. Na szczęście dwa z czterech projektów już są oddane, ale pozostały dwa najcięższe.
Projekt z grafiki (przypominam – kolejny klon Dooma) jest już powoli na ukończeniu i obecnie pozostało wgryzienie się w shadery i różne małe rzeczy, które sprawią, że będzie się grało przyjemniej. Jako że modele mamy z tej strony, broń z tej, a dźwięki nie wiem, bo kolega ściągał, zatem nie wiem, czy będzie można projekt umieścić w sieci. Chciałem jednak napisać o pewnej rzeczy, z którą – jak pewnie pamiętacie – zawsze miałem osobiście problem, a mianowicie z kolizjami. Nie wiem, jak to się dzieje, że większość programistów przechodzi koło tego tematu całkiem spokojnie i nie ma żadnych problemów – u nas kłopot przejawiał się niejako w dwojaki sposób. Najpierw, przy odpowiednim poruszaniu się, można było wyjść poza planszę, co zdecydowanie nie sprzyjało grywalności projektu. Zwłaszcza, że ciężko było wrócić na planszę. Z drugiej strony, po zastosowaniu wielu różnych dziwnych sztuczek (odbijanie w przeciwną stronę z określonym współczynnikiem, blokowanie, zliczanie ostatnio poprawnych pozycji i inne cuda na kiju) okazało się, że postać jest w stanie zablokować się i za żadne skarby nie chce się ruszyć z całym majdanem od ściany. Testerzy (pozdrawiam) byli bliscy płaczu, kolega z duetu (pozdrawiam) był bliski gniewu, a ja byłem bliski stwierdzenia, że chyba zajmę się hodowaniem truskawek pod wiatr.
Rozwiązanie, które nam pomogło było tak proste, że aż jestem zły, a zostało zaproponowane przez innego kolegę z roku (pozdrawiam). Otóż, mając całą geometrię ścian i kolizje zaimplementowane w całości na kostkach AABB, należało sprawić, aby postać, która chce wyjść poza ścianę, odbiła się od niej. O tym już wspomniałem, ale sposób, w jaki to odbicie następuje jest wręcz za prosty – jest to po prostu wykorzystanie wektora normalnego. Żadne liczenie współczynników, pełno instrukcji warunkowych, które przyprawiały nas o ból głowy. Po prostu wektory normalne, które i tak mieliśmy dostępne dla każdej ściany. Teraz zatem wygląda to tak:
- Gracz wykonuje ruch w kierunku jakiejkolwiek ściany (zawsze wykona w kierunku jakiejkolwiek).
- Jeżeli kostki AABB gracza oraz ściany nie przetną się, kolizji nie ma i wykonywany jest normalny ruch.
- Jeśli jednak kolizja została wykryta, sprawdzamy wektor normalny ściany, z którą kolidujemy – będzie on o zwrocie przeciwnym do naszego ruchu. Normalizujemy go, mnożymy go razy odpowiedni współczynnik (u nas testowo jest to 0.1) i o taką pozycję przesuwamy naszego herosa.
Proste i skuteczne. Nie dość, że bardzo proste do zaimplementowania (o ile mamy dostęp do wektorów normalnych i indeksu kolizyjnej ściany, ale na 90% mamy), to jeszcze przy okazji rozwiązało nam inny problem – potwory wreszcie “szukają” drogi do gracza i potrafią unikać narożników korytarzy. Co prawda, koledze już raz udało się przez przypadek wyjść poza planszę, ale na razie tylko jemu – miejmy nadzieję, że to odosobniony przypadek.
Drugi projekt, który nadal czeka w kolejce to jest oczywiście robot z mikrokontrolerem i tutaj jest nieco większy kłopot, gdyż większość grup (w tym my) została wysłana w delegację do szkół średnich w Gorzowie Wlkp., aby dumnie chwalić nasz wydział (teraz już nazywający się Wydział Informatyki) i przy okazji prezentować, co studenci informatyki potrafią zrobić z kawałkiem aluminium, elektroniką i starymi komputerami złożonymi w całość w robota. Cóż, nie ukrywam, że nie jest to może wymarzona podróż (za szybko ogłoszona i generalnie w ogóle nie lubię podróżować), ale przynajmniej jest to jakieś doświadczenie. Jak to wyszło – pewnie poinformuję.
Pozdrawiam i dziękuję – SceNtriC.
0 komentarze:
Prześlij komentarz