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

kolizje w sfml

Object Storage Arubacloud
0 głosów
486 wizyt
pytanie zadane 25 stycznia 2016 w C i C++ przez Avernis Nałogowiec (27,400 p.)
jak w sfml zrobić kolizję że jak 2 obiekty się z sobą "stykną" to nie mogą przez siebie przejść? Jeśli ktoś nie rozumie o co chodzi to można to przedstawić tak: jak zrobić podłogę jako RectangleShape?

2 odpowiedzi

0 głosów
odpowiedź 25 stycznia 2016 przez niezalogowany
Zależy dość mocno od obiektów, typów kolizji jest multum, 2 przypadku gier 2D najczęściej obiekty upraszcza się do box'ów (prostokątów), okręgów oraz punktów (rzadziej stosuje się wielokąty). Wykrycie kolizji to nic innego jak wykrycie że 2 obiekty nachodzą na siebie, czyli mają punkty wspólne.http://szymonsiarkiewicz.pl/category/poradniki/goto/kolizje/

W przypadku, gdy gracz nie może dostać się do podłogi "od dołu", to znowu: lepiej zastosować jeszcze większe uproszczenie i na podłodze ustawić jako collider prostą (czy raczej odcinek)
komentarz 25 stycznia 2016 przez Avernis Nałogowiec (27,400 p.)
Mi chodziło o to że jak się zetkną to nie mogą na siebie wejść, bo tak jest często z rectanglami, że jak mają podążać do gracza jako przeciwnicy to wchodzą na siebie, i zlewają się w 1 obiekt, a ja właśnie czegoś takiego chcę uniknąć
komentarz 25 stycznia 2016 przez niezalogowany

Gdy wykryjesz kolizję to po prostu zablokuj obiektom możliwość poruszania się, możesz tutaj przewidzieć ruch i jeżeli nie wykryjesz kolizji na pozycji, którą by osiągnął ruch to go na nią przenosisz. Np

.... <- jakiś kod, metoda update czy coś

Vector2 offset = player.position + player.velocity*Time.deltaTime;

if (!isCollision(&offset, &player, &environment)
{
  player.move(offset);
}

....



// wnętrze isCollsion(...)
...
// przewidujemy ruch, pobieramy aktualną pozycję i "przesuwamy" ją o wcześniej wyliczony wektor
FloatRect nextPos.pos = player.position + Vector2(offset.x,offset.y); 

// naiwne sprawdzanie kolizji ze wszystkimi obiektami na scenie
foreach (const FloatRect& obj in environment)
{
  if( nextPos.isCollision( &obj) )
   return true;
}
return false;

Sorry za mało eleganckie rozwiązanie, ale nie wiem jak u ciebie wygląda struktura kodu, chodzi o samą ideę:

  1. uznajesz czysto matematycznie, że obiekt się poruszył,
  2. następnie sprawdzasz czy kolizja by zaszła
  3. jeżeli tak, to nie zmieniasz prawdziwej pozycji obiektu
  4. jeżeli nie, to ustawiasz pozycję obiektu na tą wcześniej wyliczoną
–1 głos
odpowiedź 25 stycznia 2016 przez Madzik Nowicjusz (140 p.)
bool nazwa_struktury_albo_klasy::kolizje(int x, int y ,int x2, int y2 )
{
   if( x2 <= x + 20 && x2 > x && y2 >= y && y2 <= y + 20 ) return true; else
    if( x2 <= x + 20 && x2 > x && y2 + 20 >= y && y2 + 20 <= y + 20 ) return true; else
    if( x2 + 20 <= x +20 && x2 + 20 > x && y2 >= y && y2 <= y + 20 ) return true; else
    if( x2 + 20 <= x +20 && x2 + 20 > x && y2 + 20 >= y && y2 + 20 <= y + 20) return true;
    else return false;   
    

}

Podobne pytania

0 głosów
1 odpowiedź 211 wizyt
pytanie zadane 25 września 2015 w C i C++ przez patryk16 Obywatel (1,080 p.)
0 głosów
0 odpowiedzi 247 wizyt
pytanie zadane 19 czerwca 2022 w C i C++ przez hicodyn Początkujący (420 p.)
0 głosów
0 odpowiedzi 109 wizyt
pytanie zadane 6 września 2020 w C i C++ przez NieMaJuzNazw Użytkownik (890 p.)

92,551 zapytań

141,393 odpowiedzi

319,522 komentarzy

61,936 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!

...