Okazało się, że napisanie tego to nie taka prosta sprawa, bo postanowiłem do przetestowania CO od razu zrobic - wspomnianą - mapę + kolizje. Niestety, na jaw wyszedł straszny problem, który opiszę;
Otóż pomyślałem, że fajnie by było wiedzieć, z której strony zaszła kolizja. Mozna zrobić to dzięki analizowaniu prędkości - jeśli poruszamy sie w osi X to
na pewno kolidujemy prawym lub lewym bokiem, analogicznie oś Y. Wydawałoby się, że problem rozwiązany, ale nie!
Bo co nie wziałem pod uwagi następujących sytuacji:
1) jedno ciało porusza sie w osi X a drugie w osi Y przez co wywnioskowanie z której strony zaszła kolizja nie jest już takie proste. Nadal jest możliwe, ale niestety zasobochłonne ;(
2) oba ciała poruszają się np. tylko w osi X i tu wydaje się, że nie ma problemu, po zderzeniu zatrzymujemy oba ciała. Nic bardziej mylnego. Analogią będą tu samochody na jezdni:
a)Jeśli kierunek poruszania się jest w przypadku obu obiektów taki sam (czyli jedziemy prawym pasem, przed nami jedzie inne auto) i zajdzie kolizja, to
obiekt który "wpakował się" w obiekt przed nim wytraca prędkość.
Tylko on (jeśli wjedziemy w tył auta jadącego przed nami, to my wyhamujemy).
b) wektory prędkości obiektów mają przeciwne zwroty - auta jadą na siebie i zderzają się czołowo - oba hamują.
Tu mała dygresja, ja przypominam, że to będzie całkiem sporo ifów i porównywania i może to odbić sie na wydajności
3) I coś, przy czym już kompletnie wymiękam. Wyobraźcie sobie taką sytuacje: gracz wchodzi w jeża. Tak, jeża. Jeż oczywiście jak to ma w zwyczaju, kłuje go i (tylko ten, gwoli ścisłości)odrzuca gracza od siebie (to taki specjalny jeż). Jednak gracz ma na sobie zbroje, która pacyfikuje jeże po kontakcie z nimi. A więc wygląda na to, że jeż kłujnie gracza, a ten "zniknie" go? Nie.
Bo sprawdzanie kolizji odbywa się w następujący sposób: wybieramy jeden obiekt i dobieramy mu sąsiadów, z którymi fizycznie jest (ze wzgledu na odległość) w stanie kolidować. Takich sąsiadów sprawdzamy dla danego obiektu.
Załóżmy, że pierwsze sprawdzane są kolizje dla jeża. Jeż znajduje gracza jako sąsiada, zadaje obrażenia i
odrzuca go.
Teraz gracz sprawdza kolizje. No, jeż jest blisko więc nawet może być sąsiadem, ale po chwili okazuje się, że jest za daleko. Nie ma kolizji. Dlaczego? No bo gracz został odrzucony. Jego zbroja okazała się więc zbędna.
No to może sprawdzać kolizje raz, i wykonywać obie operacje (gracza na jeżu i jeża na graczu)?
if( jez.sprawdz_kolizje( gracz ) )
{
jez.koliduj( gracz );
gracz.koliduj( jez );
}
Nie, ponieważ jak pisałem, program sprawdza kolizje dla gracza a potem dla jeża (lub na odwrót), więc wyglądałoby to tak:
if( jez.sprawdz_kolizje( gracz ) )
{
jez.koliduj( gracz );
gracz.koliduj( jez );
}
Dla jeża, a zaraz to samo wywołałoby się dla gracza.
No i powiedzcie, co ja mam zrobić...
ps. wybaczcie za tego jeża, miałem wcześniej lepszy przykład, ale wypadł mi z głowy