• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kolizja w platformówce

Object Storage Arubacloud
0 głosów
96 wizyt
pytanie zadane 16 grudnia 2020 w C i C++ przez Xarcane Początkujący (440 p.)

Postanowiłem opisać problem jeszcze raz, ostatnio faktycznie może nie wyglądało to zbyt składnie.

Próbuję stworzyć kolizję z w grze platformowej, używam SFMLa,C++ i Lua. Kolizja którą chcę stworzyć to kolizja obiektów o różnych rozmiarach, obiekty mogą być statyczne albo się poruszać(ruchome kafelki), natomiast zawsze będą prostokątami. 
Obecnie wygląda to tak, 


 

        local cLeft = character:getPositionX()
        local cRight =  character:getPositionX() + character:getBoundingRectWidth() 
        local cTop =  character:getPositionY() 
        local cBottom =  character:getPositionY() + character:getBoundingRectHeight() 

        local tLeft = tile:getPositionX()
        local tRight =  tile:getPositionX() + tile:getBoundingRectWidth()
        local tTop =  tile:getPositionY()
        local tBottom =  tile:getPositionY() + tile:getBoundingRectHeight() 
         
        local deltaX =  tile:getPositionX() - character:getPositionX()
        local deltaY =  tile:getPositionY() - character:getPositionY() 

        local intersectX = math.abs(deltaX) 
                            - (character:getBoundingRectWidth() / 2 - tile:getBoundingRectWidth() / 2)
        local intersectY = math.abs(deltaY) 
                            - (character:getBoundingRectHeight() / 2 - tile:getBoundingRectHeight() / 2)

      
            --bottom collision
            if cTop <  tTop and cBottom < tBottom and cLeft < tRight and cRight > tLeft
            then
                character:setEntityPosition(character:getPositionX(),tTop - character:getBoundingRectHeight())
                character:setVelocityY(0)
                character:setOnGround(true)

            --top collision
            elseif cTop >  tTop and cBottom > tBottom and cLeft < tRight and cRight > tLeft
            then
                character:setEntityPosition(character:getPositionX(),tBottom)
                character:setVelocityY(0)
            end
      
       
      
            --right collision
            if cLeft < tLeft and cRight < tRight and cTop < tBottom and cBottom > tTop
            then
                character:setEntityPosition(tLeft - character:getBoundingRectWidth(),character:getPositionY())
                character:setVelocityX(0)

            --left collision
            elseif cLeft > tLeft and cRight > tRight and cTop < tBottom and cBottom > tTop
            then
                character:setEntityPosition(tRight,character:getPositionY())
                character:setVelocityX(0)
            end

Teoretycznie kolizja działa we wszystkie strony, jednak pojawia się problem kiedy postać nachodzi na róg kalfeka, wtedy sprawdzane są warunki dla osi x i y jednocześnie, i dzieje się takie coś:

I w tym momencie idę w lewo, ale postać nie zatrzymuje się ze względu na kolizję tylko przeskakuje na górę:

Dodałem więc taką modyfikację do kodu:


 

       local intersectX = math.abs(deltaX) 
                            - (character:getBoundingRectWidth() / 2 - tile:getBoundingRectWidth() / 2)
        local intersectY = math.abs(deltaY) 
                            - (character:getBoundingRectHeight() / 2 - tile:getBoundingRectHeight() / 2)

        if(intersectY > intersectX)
        then
            --bottom collision
            if cTop <  tTop and cBottom < tBottom and cLeft < tRight and cRight > tLeft
            then
                character:setEntityPosition(character:getPositionX(),tTop - character:getBoundingRectHeight())
                character:setVelocityY(0)
                character:setOnGround(true)

            --top collision
            elseif cTop >  tTop and cBottom > tBottom and cLeft < tRight and cRight > tLeft
            then
                character:setEntityPosition(character:getPositionX(),tBottom)
                character:setVelocityY(0)
            end
        end

        if(intersectX > intersectY)
        then
            --right collision
            if cLeft < tLeft and cRight < tRight and cTop < tBottom and cBottom > tTop
            then
                character:setEntityPosition(tLeft - character:getBoundingRectWidth(),character:getPositionY())
                character:setVelocityX(0)

            --left collision
            elseif cLeft > tLeft and cRight > tRight and cTop < tBottom and cBottom > tTop
            then
                character:setEntityPosition(tRight,character:getPositionY())
                character:setVelocityX(0)
            end
        end


I faktycznie prawie zadziałało, kolizja działa dla niektórych przypadków ale dla niektórych nie, konkretnie dla 2 przypadków, jak postać od dołu wchodzi na dolny prawy róg oraz jak od prawej strony wchodzi na górny lewy róg. Nie mam pomysłu jak to rozwiązać.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 244 wizyt
pytanie zadane 21 lipca 2018 w C i C++ przez seba1711g Początkujący (350 p.)
0 głosów
0 odpowiedzi 586 wizyt
pytanie zadane 14 listopada 2019 w C i C++ przez Jakub Chomicz 1 Użytkownik (840 p.)
0 głosów
3 odpowiedzi 649 wizyt
pytanie zadane 2 maja 2019 w C i C++ przez Milo Obywatel (1,180 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...