Figury wklęsłe SFML

0

Witam, mam problem z generowaniem figur wklęsłych w SFMLU.

Otóż, Chce generować kształt typu ConvexShape, mam współrzędne punktów, lecz z tego co wyczytałem Convex Shape nie wspiera figur wklęsłych...

przykład:


ksztalt.setPointCount(6);
		ksztalt.setPoint(0, sf::Vector2f(60, 60));
		ksztalt.setPoint(1, sf::Vector2f(120, 60));
		ksztalt.setPoint(2, sf::Vector2f(120, 120));
		ksztalt.setPoint(3, sf::Vector2f(200, 120));
		ksztalt.setPoint(4, sf::Vector2f(200, 150));
		ksztalt.setPoint(5, sf::Vector2f(60, 150));
		
		
		//ksztalt.setPosition(50, 50);
		ksztalt.setOutlineThickness(1);
		ksztalt.setFillColor(Color::Red);
		ksztalt.setOutlineColor(Color::Black);

wynik:

10b6f87c8e.png

TEraz mam problem, bo moja gra musi generować proste figury wklęsłe na bazie prostokątów...

Jak sie za to wziąć? generowanie osobno każdej częsci figury? a co w wypadku, gdy chciałbym narysować schody mające 20 stopni?

1

Zamieniasz złożoną figurę na trójkąty za pomocą triangulacji Delaunay i renderujesz, innej metody afair nie ma.

Btw, ciężko aby convex shape wspierało figury wklęsłe...

0

Jak sie za to wziąć? generowanie osobno każdej częsci figury? a co w wypadku, gdy chciałbym narysować schody mające 20 stopni?

Jakkolwiek byś nie zdefiniował tej figury to w pewnym momencie i tak musi zostać ona przekształcona na listę trójkątów (bądź inną strukturę w której da się wyodrębnić kolejne trójkąty).

Jeśli możesz ten schodek rozbić na trójkąty ręcznie w kodzie to najlepiej jest właśnie to zrobić.
Jeśli nie możesz to na pewno znajdzie się prostsze rozwiązanie od tego wyżej, tylko musiałbyś lepiej opisać problem i jak definiujesz swoje figury.

Mógłbyś skorzystać od razu z sf::VertexArray, żeby mieć większą kontrolę nad tym co się dzieje. Z tego co widzę to ConvexShape konwertuje kształt do triangle fan (http://en.wikipedia.org/wiki/Triangle_fan) gdzie wspólnym punktem jest środek figury (mógłby to być równie dobrze jeden z jej punktów, nie wiem po co autor zrobił to akurat tak). Przez co dostajesz właśnie taki a nie inny efekt.

0

Problem jest taki, że figury tworzone są wg. ruchu gracza, który może się poruszać tylko w 4 kierunkach, dlatego zawsze wychodzi figura złożona z prostokątów. jedyne co mam to właśnie współrzędne puntków ( rogów) figury. Podczas zmiany kierunku postaci, zapamiętywana jest jego pozycja, czyli mam współrzędne X i Y. No tak, widziałem w dokumentacji SFML, że niektóre figury można tworzyć z trójkątów, które mają jeden wspólny wierzchoołek. TrianglesFan to chyba umożliwia, jednak nie widze jakoś jak te moje 'schodki' mogłby być podzielone na trójkąty

np narysowałem teraz na szybko w paincie dwie możliwe figury, do stworzenia w mojej grze, pytanie, jak rozbić je na trójkąty z jednym wspólnym wierzchołkiem?

c9f5cf0001.png

i Który wierzchołek wybrać? Zależnie przecież od typu i kszatłu, za każdym razem może to być inny, nie koniecznie 5, 6 z kolei.

np.

61b5f7f9e9.png

0

Czy ta figura zawsze składa się z jednakowych kwadratów? Tzn. czy gracz porusza się po czymś w stylu kafelków?
Czy miałbyś możliwość zapisania na przykład w tablicy dwuwymiarowej, które pola leżą w figurze, a które poza?

0

nie, nie z jednakowych. różna grubośći.

Przeczytałem, o thorze. Tam jest ConcaveShape, do tworzenia figur wklęsłych, lecz nie ma w tej bibliotece jeszcze napisanej funkcji getglobalbounds, która jest mi niezbędna do wykrywania kolizji. Więc to raczej odpada... :/

Gra to mniej wiecej Mamba 2d. Poruszając się tworze obiekty które mają rozny kształt... jedyne ułatwienie to własnie to, że te figury składają sie z poskładanych prostokątów.

0

Kurczę, napisałbyś tę triangulację w góra 3h (albo skopiował kod, bo są gotowce i w 1h masz) i miał spokój dawno temu, a nie się tak męczysz ;p
Edit: w sumie to można by też pokombinować z triangulacją na GPU (OpenGL oraz DirectX mają do tego wbudowane funkcje, OpenGL bodajże od 4+, a DirectX od 11-tki, szukaj pod kątem teselacja), w tym wypadku masz jeszcze mniej roboty.

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