Rozbieżność Vector2i z Vector2f sfml

Rozbieżność Vector2i z Vector2f sfml
K1
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 godziny
  • Postów:49
0

Programuje małą grę w sfml. Problem pojawił się kiedy zacząłem tworzyć menu główne, zrobiłem funkcję do sprawdzania kolizji czy myszka kliknęła na przycisk i po debugu zauważyłem że metoda sf::Mouse::getPosition(Window) dawała dziwne rezultaty. Kiedy kliknąłem na przycisk o pozycji (-150, -200) wyrzuciło x=0 a jako y różne liczby. Kiedy zacząłem drążyć temat przeprowadziłem eksperyment, zauważyłem że myszka operuje na Vector2i a sprit-y na Vector2f, ustawiłem pozycję myszki na Vector2i(0,0) i pozycję randomowego sprite-a na Vector2f(0,0) i oba dały zupełnie inny punk w oknie programu, jak to wytłumaczyć? (Jestem nowy w sfml i gdyby ktoś dał wskazówkę jak porównać pozycję myszki i sprite-a bo u mnie nijak dają się porównać)


"C sprawia, że łatwo jest sobie strzelić w stopę. Z C++ jest to trudniejsze, ale za to w razie czego odstrzelisz sobie całą nogę"- Bjarne Stroustrup.
"A w C# jest to prawie niemożliwe, ale w razie czego strzelisz sobie w łeb" - Ja
Wniosek: im wyższy poziom abstrakcji, tym rzadziej występują błędy, lecz tym większe niosą konsekwencje
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:3 minuty
  • Postów:2100
1

może problem wynika z błędnego porównywania float+float float+int
na początek https://floating-point-gui.de/errors/comparison/


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
K1
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 godziny
  • Postów:49
0

Raczej nie to. Problem najprawdopodobniej wynika ze sposobu odczytywania pozycji myszki a obiektów w grze, pozycja obiektów jest liczona od skali w programie, a myszka jest liczona od lewego, górnego rogu okna. Potwierdziły to moje eksperymenty. Nie wiem tylko jak porównać pozycję myszy z pozycją obiektów w grze.


"C sprawia, że łatwo jest sobie strzelić w stopę. Z C++ jest to trudniejsze, ale za to w razie czego odstrzelisz sobie całą nogę"- Bjarne Stroustrup.
"A w C# jest to prawie niemożliwe, ale w razie czego strzelisz sobie w łeb" - Ja
Wniosek: im wyższy poziom abstrakcji, tym rzadziej występują błędy, lecz tym większe niosą konsekwencje
Marius.Maximus
  • Rejestracja:ponad 14 lat
  • Ostatnio:3 minuty
  • Postów:2100
0

@karol1165: musisz wiedzieć w jakim układzie współrzędnych jesteś , a potem tylko przeliczyć z jednego okładu współrzędnych na drugi
najczęściej w takim przypadku pomocne są słowa kluczowe: matrix, inverse matrix
ale może biblioteka ma jakąś własną filozofię


--
Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność.
Programowanie bez formatowania to jak chodzenie ze spodniami spuszczonymi na kostki. Owszem da się ale po pierwsze nie wygodne, po drugie nieprzyzwoicie wygląda.
Przed zaczęciem nowego wątku przeczytam problem XY
CZ
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
  • Postów:2324
0
  1. Pokaż kod.
  2. Do menu polecam imgui.
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:2 minuty
0

Opis problem jest mało konkretny:

karol1165 napisał(a):
  • sf::Mouse::getPosition(Window) dawała dziwne rezultaty. Kiedy kliknąłem na przycisk o pozycji (-150, -200) wyrzuciło x=0 a jako y różne liczby.
  • Vector2i a sprit-y na Vector2f, ustawiłem pozycję myszki na Vector2i(0,0) i pozycję randomowego sprite-a na Vector2f(0,0) i oba dały zupełnie inny punk w oknie programu

Używasz skalowania koordynatów? Zaokrąglanie flotat do int jest w stronę zera, więc dziwne zachowanie w okolicy zera jest zrozumiałe.
Odróżniasz koordynaty pikseli ekranu, od koordynatów widoku?

Też niepokoi mnie tekst:

Kiedy kliknąłem na przycisk o pozycji (-150, -200)

Nie korzystałem z sfml, ale zwykle koordynaty lokalne przecisku są tak dobrane, że pozycja (0, 0) to lewy górny róg, a prawy dolny to jakieś współrzędne o dodatnich wartościach.
Ergo te ujemne wartości, sugerują kliknięcie poza przyciskiem (powyżej i na lewo), więc czemu obsługujesz to zdarzenie?


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
K1
  • Rejestracja:ponad 2 lata
  • Ostatnio:około 2 godziny
  • Postów:49
0

@MarekR22: Problem jest już rozwiązany. sf::Vector2i opisuje współrzędne, gdzie 0, 0 to lewy górny róg ekranu, sf::Vector2f opisuje współrzędne, gdzie 0, 0 to środek ekranu. Różni się punkt zaczepienia, więc wartości dla tego samego punktu są inne. Co do przycisku, gdy ustawiłem go na Vector2f(-150, -200) był widoczny na ekranie, bo 0,0 to środek (ustawiałem też niestandardowe punkty zaczepienia), więc wszystko działało prawidłowo. Główny problem polegał na tym, że informacje i pozycji myszy były podawane w wersji gdzie 0,0 to róg ekranu, a pozycje spriteów były podawane w wersji gdzie 0,0 to środek okna. Aby rozwiązać problem wystarczyło użyć funkcji sfml mappixeltocoords().


"C sprawia, że łatwo jest sobie strzelić w stopę. Z C++ jest to trudniejsze, ale za to w razie czego odstrzelisz sobie całą nogę"- Bjarne Stroustrup.
"A w C# jest to prawie niemożliwe, ale w razie czego strzelisz sobie w łeb" - Ja
Wniosek: im wyższy poziom abstrakcji, tym rzadziej występują błędy, lecz tym większe niosą konsekwencje
edytowany 1x, ostatnio: karol1165

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.