Maus abfangen in Spielen
-
Hi,
wie fangt ihr die Mausbewegung in Spielen ab? (Windows, ansonsten halt System übertragen).
Bei jedem Frame GetCursorPos()? In einem separaten Thread GetCursorPos()? Warten auf WM_MOUSEMOVE? DirectInput?
-
cooky451 schrieb:
[...] Warten auf WM_MOUSEMOVE? [...]
-
Als Zusatz:
Auch Microsoft rät von DirectInput mittlerweile ab und rät dazu, die WinAPI zu verwenden.
Wenn du es ein wenig mehr OOP willst:
wxWidgets eignet sich für diesen Zweck auch hervorragend. Glaubt man kaum, ist aber so :).
Ein DirectX-Control ist schnell geschrieben.
-
Scorcher24 schrieb:
Als Zusatz:
Auch Microsoft rät von DirectInput mittlerweile ab und rät dazu, die WinAPI zu verwenden.Das freut mich, dann muss ich nichts Neues lernen.
Scorcher24 schrieb:
Wenn du es ein wenig mehr OOP willst:
Noe, passt schon, aber danke
Bleiben noch die WinAPI Sachen. WM_MOUSEMOVE wurde ja schon für gut befunden, also ich habs momentan so:
case WM_LBUTTONDOWN: GetCursorPos(&startPos); ScreenToClient(hwnd, &startPos); break; case WM_MOUSEMOVE: if (LOWORD(lparam) == startPos.x && HIWORD(lparam) == startPos.y) break; if (wparam & MK_LBUTTON) { camEgo.m_rotX = (LOWORD(lparam) - startPos.x) / 0.5f; camEgo.m_rotY = (HIWORD(lparam) - startPos.y) / 0.5f; ClientToScreen(hwnd, &startPos); SetCursorPos(startPos.x, startPos.y); ScreenToClient(hwnd, &startPos); } break;
Allerdings erscheint mir das zu vorher, als ich noch einfach bei jedem Frame die Position abgefragt hatte, irgendwie wackeliger.. ich weiß aber nicht woran das liegt; WM_MOUSEMOVE müsste doch eigentlich schneller sein? (Ist zudem natürlich irgendwie eleganter :D)
-
Wenn du eine WinAPI-Nachricht behandelst, solltest du immer 0 zurückgeben. Und nicht break. Am Ende deiner WinProc sollte nämlich "return DefWindowProc.." stehen.
Siehe das Sample von mir hier:
http://www.c-plusplus.net/forum/p2050382#2050382
-
Scorcher24 schrieb:
Wenn du eine WinAPI-Nachricht behandelst, solltest du immer 0 zurückgeben.
Hm.. das scheint tatsächlich was zu bringen..
, danke