Problem z kolizją obiektów - mapa kafelkowa

0

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:

user image

0

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ź.

0

Ale jak ja mam to naprawić. Podaj przykład ja ty byś to zrobił.

0

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.

0

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ć ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1