Mausabfrage sehr ungenau / zu langsam
-
Hi leute!
also ich habe folgendes problem:ich frage per Direct Input die position des mauszeigers ab. beim start des programmes wird per
GetCursorPos()
die aktuelle position gespeichert und dann bei bewegungen (die im weiteren verlauf von direct input ausgelesen werden) entsprechend verändert. mein problem ist jetzt allerdings, daß die koordinaten die mir DInput zurückliefert nicht immer mit den "echten" übereinstimmen. ich hab erst gedacht ich müsste da nochwas umrechnen. zur kontrolle hole ich mir per
GetCursorPos()
von windows die koordinaten..um es auf den punkt zu bringen:
zu anfang sind die direct inpout koordinaten gleich der windows koordinaten und wenn ich die maus langsam bewege stimmt auch noch alles. doch bei einem "Ruck" kommt DirectInput nichtmehr hinterher und liefert falsche koordinaten.
in der forumsuche habe ich leider nur threads zur umrechnung von 2d in 3d koordinaten gefunden. jemand eine ahnung oder braucht ihr erst etwas source?
thx && cya
-
Wie arbeitest du denn mit DInput? Wird die Veränderung der Mausposition eventgesteuert (buffered) verarbeitet? Wenn nicht, also mit immediate data, kann ich mir schon vorstellen, dass da was verlorengeht. Dann solltest du das umstellen.
-
Spurcecode wäre gut, vielleicht hängt es ja mit deinem Programm zusammen...
-
Stimme mit groovemaster überein.
Aber am ehesten glaube ich, Du hast ein konzeptionelles Problem...
-
Könnte evtl. auch mit Mausbeschleunigung zu tun haben. Keine Ahnung ob die evtl. bei DX nicht beachtet wird.
Bye, TGGC (Denken, und gut ist.)
-
TGGC schrieb:
Könnte evtl. auch mit Mausbeschleunigung zu tun haben. Keine Ahnung ob die evtl. bei DX nicht beachtet wird.
Stimmt. IIRC wird alles was in der Systemsteuerung unter "Maus" einzustellen ist, bei DI verworfen. Nur die Gamecontroller nutzt DI.
Trotzdem: Das ist sowieso Teufelswerk IMHO - wie Du WinAPI mit DirectX kombinieren willt... Hängt den Ketzer!!
-
hi und danke für die antworten. laso hier nun etwas source:
MausInitalisieren() { W_rval = X_input->CreateDevice(GUID_SysMouse,&X_maus,NULL); if(W_rval != DI_OK) { M("Fehler beim erstellen des Devices (Maus)"); b_isInit = false; } W_rval = X_maus->SetDataFormat(&c_dfDIMouse); if(W_rval != DI_OK) { M("Fehler bei SetDataFormat (Maus)"); b_isInit = false; } W_rval = X_maus->SetCooperativeLevel(hWnd,DISCL_BACKGROUND | DISCL_NONEXCLUSIVE); if(W_rval != DI_OK) { M("Fehler bei SetCooperativeLevel (Maus)"); b_isInit = false; } X_prop.diph.dwHeaderSize = sizeof(DIPROPHEADER); X_prop.diph.dwSize = sizeof(DIPROPDWORD); X_prop.diph.dwHow = DIPH_DEVICE; X_prop.diph.dwObj = 0; X_prop.dwData = SAMPLE_BUFFER_SIZE; // ist angegeben mit 16 if(FAILED(X_maus->SetProperty(DIPROP_BUFFERSIZE,&X_prop.diph))) { MessageBox(NULL,"Fehler bei SetProperty()!", "Fehler 9!",0); } W_rval = X_maus->Acquire(); if(W_rval != DI_OK && W_rval != S_FALSE) { M("Fehler bei Acquire (Maus)"); b_isInit = false; } b_isInit = true; }
MausAuslesen() { DWORD DW_elemente = SAMPLE_BUFFER_SIZE; //wie gesagt 16 W_rval = X_maus->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),X_mausData,&DW_elemente,0); if(W_rval != DI_OK) { W_rval = X_maus->Acquire(); while(W_rval == DIERR_INPUTLOST) W_rval = X_maus->Acquire(); } for(DWORD i = 0;i<DW_elemente;i++) { switch(X_mausData[i].dwOfs) { case DIMOFS_BUTTON0: if(X_mausData[i].dwData & 0x80 ) { MausTaste[0] = true; } //Taste Gedrückt else { MausTaste[0] = false; } break; case DIMOFS_BUTTON1: if(X_mausData[i].dwData & 0x80) { MausTaste[1] = true; } else { MausTaste[1] = false; } break; case DIMOFS_BUTTON2: if(X_mausData[i].dwData & 0x80 ) { MausTaste[2] = true; } else { MausTaste[2] = false; } break; case DIMOFS_BUTTON3: if(X_mausData[i].dwData & 0x80 ) { MausTaste[3] = true; } else { MausTaste[3] = false; } break; case DIMOFS_X: n_mausX+=X_mausData[i].dwData; break; case DIMOFS_Y: n_mausY+=X_mausData[i].dwData; break; default: break; } } }
so ich hoffe ich hab nichts vergessen. vielleicht könnt ihr mir ja nu helfen
Könnte evtl. auch mit Mausbeschleunigung zu tun haben. Keine Ahnung ob die evtl. bei DX nicht beachtet wird.
hmm gut möglich. wie krieg ich die denn raus? (zur not auch per winapi)
Trotzdem: Das ist sowieso Teufelswerk IMHO - wie Du WinAPI mit DirectX kombinieren willt... Hängt den Ketzer!!
falls du die sache mit GetCursorPos meinst, das ist ja nur zur kontrolle und wird später wieder rausgehauen, tja bis auf das eine mal nämlich am start um die momentanen koordinaten zu erhalten oder gibts da nen besseren weg ?
(per DX)
mfg
-
Was ist denn noch das Problem?
Bye, TGGC (Denken, und gut ist.)
-
also das problem ist immernoch das gleiche. bei einer schnellen mausbewegung kommt directinput einfach nichtmehr hinterher und liefert falsche koordinaten. das mit der beschleunigung ist ne möglichkeit aber ich weiss nicht wie ich da ran komme.
mfg
-
hmm. also nach lesen in einem anderen forum (ZFX.info) hab ich nun begriffen wo die krux begraben liegt
:
es liegt u.a. an der beschleunigung und der geschwindigkeit, die von windows berücksichtigt werden aber von direct X nicht.
daher können bei schnellen bewegungen die koordinaten auch nimmer stimmen. werde nun wie folgt vorgehen:
den WindowsCursor verschwinden lassen und meinen "eigenen" cursor malen an der X,Y koordinate, die mir directX liefert. beschleunigung bzw geschwindigkeit kann man da ja nach belieben durch multiplikation der relativen koordinaten einstellen.
das problem hat sich vorübergehend erledigt. danke an alle!
p.s. falls ihr bessere vorschläge für mich habt oder meinen source verbessern wollt seid ihr herzlich willkommen!
mfg
-
das machen doch alle so. wie willste sonst so coole mauskursors mahlen lassen?
-
Wenn du denkst, GetCursorPos hat die einzig richtig Koordinaten, dann nimm halt die. Ansonsten glaube ich, das keiner es nachmisst und sich beschwert.
Bye, TGGC (Denken, und gut ist.)
-
Wenn du denkst, GetCursorPos hat die einzig richtig Koordinaten, dann nimm halt die. Ansonsten glaube ich, das keiner es nachmisst und sich beschwert.
denke ich ja nicht. ich wusste vorher nur nicht dass sich die DInput koordinaten von den windows Koordinaten unterscheiden.
das machen doch alle so. wie willste sonst so coole mauskursors mahlen lassen?
mir gings ja erstmal um einen standard cursor..aber der neue wird sicherlich viel cooler.
mfg
-
nicht immer mit den "echten" übereinstimmen [...] per GetCursorPos()
Bye, TGGC (Denken, und gut ist.)
-
hast ja recht..