[Direct3D]Wahre Mausposition
-
Hallo,
es geht um meine DirectX 8 Anwendung (Bitte keine Bemerkungen zum Alter von DX8, es geht nicht anders).
Ich hole mir die Mausposition um Eingaben zu überprüfen bis jetzt immer
überPOINT p; GetCursorPos(&p); p.x -= (long)Menu.diagX; //Set GUI to P(0|0) p.y -= (long)Menu.diagY;Und vergleiche dann.
Das Problem ist leider, dass bei manchen Spielern die Maus "verschoben" zu sein scheint also anderen Koordinaten entspricht

Ich hab keine Lust den user dazu zwingen beim Start die Maus zu kalibrieren, kann ich iergendwie die "wahre" Mausposition rauskriegen?
Ich danke euch!
Listing
-
Vllt ist das Problem, dass du ein Fenster hast und die Koordinaten sich auf das Fenster beziehen?
Dann kannst du sie in absolute Koordinaten umrechnen
-
Laut user kann er die Knöpfe jetzt garnicht mehr drücken (Vorher waren sie bei ihm nur nach oben verschoben von der hitbox).
Bei mir funktioniert es mit ClientToScreen bei allen Auflösungen wunderbar...Ich hoffe ihr könnt mir schnell helfen damit ich das wichtige update noch morgen rausbringen kann

-
Einige andere beschweren sich jetzt, dass sich je nach
Auflösung die Knöpfe ein bisschen nach links / oben verschoben sind...Das ist ein großes Projekt also bin ich auf schnelle Hilfe wirklich angewiesen.
Vielen Dank
-
Aha, und was denkst du sollen wir jetzt machen?
Du hast weder irgendwelche relevanten Angaben gemacht noch Quellcode gegeben und von Buttons war in deinem Ausgangspost nirgends die Rede
-
Naja, die DirectX koordinaten scheinen nicht mit denen des Bitmaps, das ich lade übereinzustimmen, nachdem man es als sprite zeichnet.
Ich frage die Mauspositionen wie im Ausgangspost ab, und gucke ob der Knopf im Bitmap gedrückt wurde.
Funktioniert bei mir aber nicht bei anderen

-
hast du schonmal an debugausgaben oder ne log-datei gedacht?
dann kannst du uns ja mal die differenz mitteilen...
-
Differenz ist 8 nach oben, bei manchen rechnern

Bei manchen auch mehr

Ich könnte eine Kalibrierung machen, aber das wäre die letzte Lösung
-
Könnte es vielleicht sein dass es an der Ausgabe liegt?
Ich nehme an du wirst wohl Direct3D verwenden (bei DirectDraw würdest du ja wohl eher DX 7 verwenden und nicht
- kann es da nicht sein dass die Berechnung der Projektionsmatrix vielleicht bei bestimmten Auflösungen oder vielleicht 16:10 Monitoren daneben ist?Ansonsten würde ich mal versuchen die Maus über DirectInput oder WM_INPUT abzufragen.
-
hustbaer schrieb:
Könnte es vielleicht sein dass es an der Ausgabe liegt?
Möglich ist alles, leider konnte ich bis jetzt noch nicht feststellen woran es genau liegt, einige meiner Nutzer sagen allerdings, dass die Verschiebung bei verschiedenen Auflösungen unterschiedlich ist
hustbaer schrieb:
Ich nehme an du wirst wohl Direct3D verwenden (bei DirectDraw würdest du ja wohl eher DX 7 verwenden und nicht

Stimmt
hustbaer schrieb:
kann es da nicht sein dass die Berechnung der Projektionsmatrix vielleicht bei bestimmten Auflösungen oder vielleicht 16:10 Monitoren daneben ist?
Ich zeichne das Menue auf allen Auflösungen an die gleichen Koordinaten
Deshalb sollte sich ja eigentlich nichts ändern.hustbaer schrieb:
Ansonsten würde ich mal versuchen die Maus über DirectInput oder WM_INPUT abzufragen.
Ich habe keinen Winapi-Ereignisbearbeiter für Benutzereingaben, sondern prüfe derzeit mit GetAsyncKeystate u.Ä. auf Eingaben.
Vielen Dank schonmal
-
Du zeichnest mit den selben Koordinaten, ok, mag sein, aber wo es am Bildschirm liegt kommt eben noch auch auf die verwendete(n) Matritze(n) an, wie z.B. die Projektionsmatrix.
Du könntest ja mal den Backbuffer locken und "per Hand" ein paar Marker an bestimmten Positionen zeichnen, oder einfach nen Screenshot machen und per Paint/Photoshop/... nachgucken wo es gezeichnet wird, und mit den gewünschten "Sollwerten" vergleichen.
Unterschiedliche Auflösungen lassen sich ja einfach ausprobieren - 1024x768 ist 4:3 und 1280x1024 ist 5:4 - könnte sein dass das schon ausreicht um das Problem nachstellen zu können.
Ich habe keinen Winapi-Ereignisbearbeiter für Benutzereingaben, sondern prüfe derzeit mit GetAsyncKeystate u.Ä. auf Eingaben.
Jo. Liesse sich aber doch einfach einbauen

Der Vorteil der Window Messages ist halt auch dass man keine Inputs "übersieht" wenn der User nur ganz kurz ne Taste drückt.
Zwar kann man das "least significant bit" des Returnwertes von GetAsyncKeyState verwenden um zu sehen ob die Taste zwischen 2 Abfragen gedrückt war, allerdings wird seitens MS davon abgeraten, da es auch nicht immer funktioniert (Details sind in der MSDN dokumentiert: GetAsyncKeyState - Remarks).
-
Unterschiedliche Auflösungen lassen sich ja einfach ausprobieren - 1024x768 ist 4:3 und 1280x1024 ist 5:4 - könnte sein dass das schon ausreicht um das Problem nachstellen zu können.Funktioniert bei mir bei beiden wie geschmiert.
Wird auch beides bei P(100|200) gezeichnet. (Photoshop)
Der Vorteil der Window Messages ist halt auch dass man keine Inputs "übersieht" wenn der User nur ganz kurz ne Taste drückt.Ich frage dazu zu oft ab
Zwar kann man das "least significant bit" des Returnwertes von GetAsyncKeyState verwenden um zu sehen ob die Taste zwischen...Ich habe meine eigene Klasse um zu prüfen ob die Taste schonmal gedrückt wurde (Flag wird so lange gesetzt bis GetAsyncKeyState false returned)
mfG