Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 3.0] Prosta kolizja 2D

Ostatnio zmodyfikowano dzisiaj: 11h » 12 min
Autor Wiadomość
wojownik266
Temat założony przez niniejszego użytkownika
[SFML 3.0] Prosta kolizja 2D
» 2025-09-26 10:35:15
Parę dni temu znalazłem w swoich zbiorach z niedokonczonymi programami, program napisany jeszcze w sfml 1.6 i postanowiłem go przekonwertować na sfml 3.0. Z większością kodu jakoś sobie poradziłem ale za nic na świecie nie mogę napisać prostej kolizji 2d kwadratu z kwadratem. Po prostu nie rozumiem tego. W związku z tym mam taką prośbę czy ktoś mógłby mi napisać taką prostą kolizję dwuch kwadratów (chat gpt odpada) w celach dydaktycznych albo jeszcze lepiej wytłumaczył mi o co w tym chodzi?
P-183041
DejaVu
» 2025-09-26 10:55:07
ChatGPT 5 po naprowadzeniu go jak ma Ci wytłumaczyć zagadnienie:
1. Rysunek i oznaczenia

Najpierw narysuj sobie na kartce dwa prostokąty w kolizji.

Wierzchołki pierwszego oznacz jako a1, a2, a3, a4,

Wierzchołki drugiego jako b1, b2, b3, b4.

Każdy prostokąt ma:

dwie pionowe linie (lewą i prawą),

dwie poziome linie (górną i dolną).

Dla prostokąta A oznaczamy:

AL = lewa krawędź (ang. A Left)

AR = prawa krawędź (A Right)

AT = górna krawędź (A Top)

AB = dolna krawędź (A Bottom)

Analogicznie dla B: BL, BR, BT, BB.

Podsumowanie:
Mamy dwa prostokąty, każdy ma lewą, prawą, górną i dolną krawędź. Musimy sprawdzić, czy się „nachodzą”.

2. Sprawdzenie kolizji na osi X (poziomej)

Chcemy sprawdzić, czy prostokąty minęły się w poziomie, czy jednak ich przedziały na osi X się nachodzą.

Na osi X mamy dwa przedziały:

A: od AL do AR

B: od BL do BR

Żeby się nachodziły, muszą być spełnione dwa warunki:

Prawa krawędź A jest na prawo od lewej krawędzi B:
AR > BL
Inaczej A leży całkiem po lewej i nie dotyka B.

Prawa krawędź B jest na prawo od lewej krawędzi A:
BR > AL
Inaczej B leży całkiem po lewej i nie dotyka A.

Dopiero jeśli oba są prawdziwe → przedziały na osi X nachodzą na siebie.

Podsumowanie:
Na osi X sprawdzamy, czy przedziały się nie minęły. Dwa warunki są potrzebne, żeby upewnić się, że nie leżą po dwóch stronach bez styku.

3. Sprawdzenie kolizji na osi Y (pionowej)

Robimy to samo, tylko teraz na osi Y:

A: od AT (góra) do AB (dół)

B: od BT do BB

Warunki są podobne:

Dół A jest niżej niż góra B: AB > BT

Dół B jest niżej niż góra A: BB > AT

Jeśli oba są prawdziwe → przedziały na osi Y nachodzą na siebie.

Podsumowanie:
Dokładnie ta sama logika, ale pionowo: przedziały nie mogą się „minąć” w górę lub w dół.

4. Warunek końcowy

Kolizja zachodzi tylko wtedy, gdy oba warunki są spełnione:

(AR > BL && BR > AL)   // poziom
&&
(AB > BT && BB > AT)   // pion


Jeśli choć jeden z warunków jest fałszywy → prostokąty się nie stykają.

Podsumowanie:
Kolizja = nachodzenie w poziomie i w pionie jednocześnie.

5. Uproszczenie dla początkujących

Całą logikę można streścić jednym zdaniem:

Dwa prostokąty kolidują, jeśli na osi X i na osi Y ich przedziały się nachodzą.

Na każdej osi są dwa warunki, żeby upewnić się, że przedziały się nie „minęły” całkowicie.

Jeśli oba warunki są spełnione na obu osiach → kolizja jest.
P-183042
wojownik266
Temat założony przez niniejszego użytkownika
» 2025-09-26 17:17:40
Na chwilę obecną nie mam zbyt wiele czasu... Jak by co to się jeszcze odezwę. Dziękuję za odpowiedź...!
P-183043
wojownik266
Temat założony przez niniejszego użytkownika
» 2025-10-01 12:08:21
Wydaje mi się że najlepszym rozwiązaniem mojego problemu będzie podanie prostego kodu (cpp) kolizji... Rozwiązanie to miałoby dwa pozytywne aspekty. Po pierwsze przyspieszyło by prace nad moją pierwszą grą w SFML 3.2.0 a po drugie posłużyło by jako dobry przykład pisania kolizji 2D. Z chat gpd już kożystałem i z ogromnym bólem serca muszę powiedzieć że się zawiodłem... Tak że czekam na lawinę kodów z kolizją od was. Miłego dnia!
P-183065
skovv
» 2025-10-01 21:36:31
Stary, chyba żartujesz :D Prosisz o wytłumaczenie jak to zrobić a jak kolega napisał jak to zrobić to stwierdziłeś że nie masz czasu jednak więc olać. Teraz jednak masz czas ale ktoś ma to zrobić za Ciebie. Nie wróżę Ci dużej kariery z takim podejściem
P-183066
tBane
» 2025-10-02 04:09:44
Od SFML 3.0  funkcja intersects nie istnieje w takiej formie, jak w wcześniejszych wersjach, zamiast tego używa się metody findIntersection.
https://www.sfml-dev.org/documentation/3.0.2/classsf_1_1Rect.html

C/C++
constexpr std::optional < Rect < T > > findIntersection( const Rect < T > & rectangle ) const
Check the intersection between two rectangles.

Przykład użycia:
C/C++
// Define a rectangle, located at (0, 0) with a size of 20x5
sf::IntRect r1( { 0, 0 }, { 20, 5 } );

// Define another rectangle, located at (4, 2) with a size of 18x10
sf::Vector2i position( 4, 2 );
sf::Vector2i size( 18, 10 );
sf::IntRect r2( position, size );

// Test the intersection between r1 and r2
std::optional < sf::IntRect > result = r1.findIntersection( r2 );
// result.has_value() == true
// result.value() == sf::IntRect({4, 2}, {16, 3})

P-183067
wojownik266
Temat założony przez niniejszego użytkownika
» 2025-10-02 07:58:37
Nie będę się rozpisywał dlaczego zachowałem sie tak jak się zachowałem, tylko powiem: Panie Piotrze bardzo ale to bardzo pana PRZEPRASZAM.... I pana też, tBane... Miłego dnia!!!
P-183068
DejaVu
» 2025-10-02 09:05:40
Mnie nie trzeba przepraszać ;) Sam decydujesz na co masz czas, a na co nie. Ogólnie AI to potężne narzędzie. Jeżeli nie masz płatnej subskrypcji ChatGPT, to możesz zawsze skorzystać z darmowego Qwen3, a ich modele obecnie moim zdaniem są bardzo mocne i to będzie przyszły lider rynku AI/LLM. ChatGPT zapewnia lepszą prywatność, ale jeżeli rozmawiamy o samej nauce, to moim zdaniem Qwen3 umożliwi Ci efektywną naukę, development itd.
P-183069
« 1 » 2
  Strona 1 z 2 Następna strona