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

question-closed SFML, odpowiednik dla GLFW_CURSOR_DISABLED

Object Storage Arubacloud
+1 głos
174 wizyt
pytanie zadane 9 października 2020 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 10 października 2020 przez Jakub 0

Witam, uczę się z tego poradnika, z taką różnicą że używam SFML zamiast GLFW w celu utworzenia okna, obsługi eventów itd... Zamiast funkcji z GLFW:

glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED)

używam oczywiście następującej metody z SFML'a:

window.setMouseCursorVisible(false);

Jest jednak problem... kursor muszy wciąż opuszcza okno podczas "rozglądania się", nawet jeśli jest on ukryty. Okazuje się że glfwSetInputMode poza ukryciem kursora, sprawia że nie opuszcza on nigdy okna programu. Tego niestety nie można powiedzieć o window.setMouseCursorVisible z SFML. 

Potrzebuję więc odpowiednika funkcji z GLFW dla SFML, szukałem informacji ale nic zadawalającego nie znalazłem.

Z góry dziękuje za pomoc i pozdrawiam :)

komentarz zamknięcia: problem rozwiązany
komentarz 10 października 2020 przez VBService Ekspert (253,280 p.)

Wygląda na to, że musisz dopisać "trap" na myszkę wink, czyli sprawdzać czy opuszcza okienko Twojej aplikacji.
MOUSE POSITION RELATIVE TO GAMES WINDOW IN SFML 2
Trapping/Clipping the Mouse Cursor - SFML

2 odpowiedzi

+3 głosów
odpowiedź 10 października 2020 przez tangarr Mędrzec (154,860 p.)
wybrane 10 października 2020 przez Jakub 0
 
Najlepsza

Czy próbowałeś użyć funkcji sf::Window::setMouseCursorGrabbed(bool grabbed)?

Wg dokumentacji:

Grab or release the mouse cursor.

If set, grabs the mouse cursor inside this window's client area so it may no longer be moved outside its bounds. Note that grabbing is only active while the window has focus.

komentarz 10 października 2020 przez Jakub 0 Pasjonat (23,120 p.)
przywrócone 10 października 2020 przez Jakub 0

Dziękuje za pomoc, ogólnie w sporej części mój problem rozwiązuje taki kod:

case sf::Event::MouseMoved: {
	glm::vec2 mousePos(windowEvent.mouseMove.x, windowEvent.mouseMove.y);
	auto windowSize = window.getSize();
	uint32_t maxMousePosRadius = glm::min(windowSize.x, windowSize.y) / 3;
	glm::vec2 windowCenter(windowSize.x / 2, windowSize.y / 2);
				
	if (glm::length(mousePos - windowCenter) > maxMousePosRadius) {
		lastX = windowCenter.x;
		lastY = windowCenter.y;
		sf::Mouse::setPosition(sf::Vector2i((int)windowCenter.x, (int)windowCenter.y), window);
	}
	else {
		float xpos = mousePos.x;
		float ypos = mousePos.y;

		if (firstMouse) {
			lastX = xpos;
			lastY = ypos;
			firstMouse = false;
		}

		float xoffset = xpos - lastX;
		float yoffset = lastY - ypos; 

		lastX = xpos;
		lastY = ypos;

		camera.ProcessMouseMovement(xoffset, yoffset);
	}
					
	break;
}

Po prostu w razie potrzeby ustawiam pozycje myszy na środku jeśli ta za bardzo się od niego oddali. Oczywiście problem jest gdy poruszamy kursorem zbyt gwałtownie, wtedy algorytm "nie nadąży" i wskaźnik myszy opuszcza okno. Użyłem sf::Window::setMouseCursorGrabbed, teraz faktycznie nie ma tego problemu. Jednak gdy poruszam myszką zbyt szybko to "mechanizm rozglądania się" zacina się, tzn. że potrzeba chyba trochę czasu by event opuszczenia myszy został spropagowany. Nie odpowiada mi ten efekt, w grach przecież możemy poruszać kursorem tak szybko jak nam odpowiada i rozglądanie się działa płynnie. Więc wciąż są problemy... 

1
komentarz 10 października 2020 przez Jakub 0 Pasjonat (23,120 p.)

Udało mi się rozwiązać i to, wystarczyło usunąć else i przenieść kod w nim zawarty ponad warunek sprawdzający oddalenie kursora od centrum okna :

float xpos = mousePos.x;
float ypos = mousePos.y;

if (firstMouse) {
	lastX = xpos;
	lastY = ypos;
	firstMouse = false;
}

float xoffset = xpos - lastX;
float yoffset = lastY - ypos;

lastX = xpos;
lastY = ypos;

camera.ProcessMouseMovement(xoffset, yoffset);

				
if (glm::length(mousePos - windowCenter) > maxMousePosRadius) {
	lastX = windowCenter.x;
	lastY = windowCenter.y;
        sf::Mouse::setPosition(sf::Vector2i((int)windowCenter.x, (int)windowCenter.y), window);
}

Dzięki temu animacja rozglądania się nigdy nie jest blokowana. Napisałem to bo może się to komuś jeszcze przyda...

0 głosów
odpowiedź 10 października 2020 przez DragonCoder Nałogowiec (36,500 p.)
A czemu mialby zostac w oknie?

1. Sama nazwa funkcji mowi, ze ustawia tylko widocznosc kursora (jedna funkcja = jedno zadanie)

2. Z tego co sie orientuje, to nie ma tak owej implementacji, ale byl pomysl jej zrobienia kilka lat temu. Chyba na githubie jest jeszcze kod (cursor grabbed chyba sie to nazywalo). Ale czy taki odpowiednik istnieje, nie jestem pewien.

3. Teoretycznie mozesz sprawdzic, czy myszka nie opuscila okna. W sensie nazjac rozmiary, mozesz za kazdym razem sprawdzac, czy myszka probuje wyjsc po za okno, jesli tak to wrzucasz ja na granice okna czy cos.

4. Poczekalbym tez na opinie bardziej kompetentnych osob w tej sprawie

Podobne pytania

0 głosów
2 odpowiedzi 154 wizyt
pytanie zadane 12 grudnia 2015 w C i C++ przez niezalogowany
0 głosów
3 odpowiedzi 1,458 wizyt
pytanie zadane 27 czerwca 2015 w C i C++ przez niezalogowany
0 głosów
2 odpowiedzi 165 wizyt
pytanie zadane 17 lutego 2016 w C i C++ przez Avernis Nałogowiec (27,400 p.)

92,566 zapytań

141,420 odpowiedzi

319,614 komentarzy

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

...