Mam stworzoną i wczytaną mapę kafelkową z kolizją. Mapa jest wczytywana poprawnie i wszystko w niej działa. Mam też obiekt (kwadrat), dla którego mam funkcję, która sprawdza czy któryś z wierzchołków tego obiektu znajduje się na kafelku z numerem 1, czyli z kolizją. Stworzyłem również zmienne bool (kolizja_left, kolizja_right, kolizja_down, kolizja_up), które jeżeli mają wartość true to blokują poruszanie odpowiednio w górę, w dół, w lewo i w prawo. Problem tkwi w tym, że jeżeli np. lewy górny wierzchołek jest na kafelku kolizji to blokowane jest poruszanie i w lewo i do góry dla wszystkich sytuacji przedstawionych na tym obrazie:
Coś zrobiłeś źle, musisz naprawić swój kod, w miejscu w którym ustalasz wartości zmiennych: kolizja_left, kolizja_right, kolizja_down, kolizja_up.
Ogólnikowe pytanie daje ogólnikową odpowiedź.
Ale jak ja mam to naprawić. Podaj przykład ja ty byś to zrobił.
Nie wiem czy dobrze kminie, ale sprawdzaj czy oba wierzcholki jednego boku dotykaja kolizji i dopiero ustawiaj dana kolizje na true. Z Twojego opisu wynika ze tak nie robisz.
Nie potrzebujesz tych wszystkich zmiennych bool sprawdzających kolizję dla każdego klocka.
Stwórz sobie 4 funkcje które będą spradzały czy nastąpiło zderzenie.
Sprawdzasz zatem czy wierzchołek małego kwadratu mieści się w przedziale od (wierzchołek_dużego_kwadratu - dł_małego_kwadratu; dłgość_dużego kwadratu) jeżeli tak, to sprawdzasz czy współrzędna y wierzchołka małego kwadratu znajduje się już w dużym kwadracie (od dołu) jeżeli tak, to nastąpiło zderzenie.
Przykładowe sprawdzenie
bool Sprawdz_PN(...)
{
const float granica błędu = 0.0001f;
if( ( sm.x > big.x - sm.len ) && ( sm.x < big.x + big.len ) )
if( (sm.y >= big.y - big.len ) && ( sm.y < big.y - big.len + granica_błędu ) )
{
krok.y = -krok.y;
return true;
}
return false; // Nie ma kolizji
}
Aby przyspieszyć program stosuje się większe obszary sprawdzania, bez sensu sprawdzać kolizję dla każdego rysowanego kwadratu, dlatego wszystkie obiekty zamieszcza się (w 3D) w sferach lub prostopadłościanach lub (w 2D) w prostokątach lub okręgach. Jeżeli nasz obiekt nie znajduje się w dużym prostokącie, to nie ma sensu sprawdzać kolizji dla mniejszych które znajdują się w nim, co znaczenie przyspiesza program przy dużych projektach.
Sam teraz siedzę nad jedną grą, dlatego musiałem się takimi rzeczami zainteresować ;-)