Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 20.08.2004, 13:21 Titel: Mausproblem mit Direct Input |
|
|
Hallo,
ich wollte einen eigenen Mauscursor für ein Spiel machen. Der Cursor ist ein Spriteobjekt und die bewegung wollte ich mit Direct Input abfragen. Für die Mausabfrage habe ich die Klasse CInputManager aus dem 2. Buch JLI genommen und die Mausabfrage so optimiert das nicht nur der erste wert sondern 10 Werte in einer Schleif abgefragt werden. Wenn ich das kompiliere und bei mir starte läuft alles einwandfrei nur auf allen anderen Rechner die nicht die debugversion von directx installiert haben reagiert die Maus auch Tastatureingaben, besonders PFEIL_LINKS und PFEIL_HOCH, obwohl das in dem Programm an keiner Stelle so geschrieben ist. Da für Tastatur und Maus eine gemeinsame Klasse besteht werden 2 Objekte daraus erzeugt. Eine für Tastatur und eine für die Maus. zudem habe ich beides mit exklusievrechten initialisiert um anderen Problemen aus dem Weg zu geben.
Der Code für die mausabfrage ist:
Code: |
int CInputManager::getMouseInput(void)
{
DWORD NumElements = MOUSE_CHECKS;
DIDEVICEOBJECTDATA data[MOUSE_CHECKS];
ZeroMemory(&data,sizeof(data[0]));
if(FAILED(m_lpDIDevice->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),data,&NumElements,0)))
{
// die Mouse wurde zwischenzeitlich
// von einer andere Anwendung genutzt
// Kontrolle wiederholen
m_lpDIDevice->Acquire();
return 0;
}
// MousDatan auf den Ursprung setzen
int MouseInput = 0;
m_MouseData.x = 0;
m_MouseData.y = 0;
m_MouseData.Button0 = FALSE;
for(int c = 0; c < MOUSE_CHECKS; c++)
{
//int Movement = data[c].dwData;
// bestimmen, in welche Richtung die Mouse bewegt wurde
// und ob eine Mouse-Taste gedrückt wurde
if(data[c].dwOfs == DIMOFS_X)
{
m_MouseData.x += data[c].dwData;
/*if(Movement < 0)
{
m_MouseData.x -= 1 * m_MouseSpeed;
}
if(Movement > 0)
{
m_MouseData.x += 1 * m_MouseSpeed;
}*/
}
if(data[c].dwOfs == DIMOFS_Y)
{
m_MouseData.y += data[c].dwData;
/*if(Movement < 0)
{
m_MouseData.y -= 1 * m_MouseSpeed;
}
if(Movement > 0)
{
m_MouseData.y += 1 * m_MouseSpeed;
} */
}
if(data[c].dwOfs == DIMOFS_BUTTON0)
{
m_MouseData.Button0 = TRUE;
}
}
return MouseInput;
}
|
"return MouseInput;" wird nicht berücksichtigt und "m_MouseData" ist eine Struktur, deren Inhalt über eine gesonderte Funktion zurückgegeben wird.
Hat jemand eine Idee was hieran nicht stimmt oder woran es liegen könnte?
edit by miracleboy: hab code tags eingefügt! |
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 20.08.2004, 14:01 Titel: |
|
|
Der code ist ohne [code]-tags zimlich schwer zu lesen. _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
|
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 20.08.2004, 17:21 Titel: |
|
|
Sorry wusste nicht wie das geht. |
|
Nach oben |
|
|
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 22.08.2004, 12:38 Titel: |
|
|
Kann bitte jemand bei dem die Maus funktioniert den nötigen code Posten? Bin echt verzweifelt. Das Problem habe ich übrigens nur wenn ich Maus und Tastatur über Direct Input anspreche. |
|
Nach oben |
|
|
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 22.08.2004, 15:04 Titel: |
|
|
irgendwie schaut die mausabfrage bei mir überhaupt ganz anders aus:
Code: |
DIMOUSESTATE2 dims;
m_lpDIMouse->GetDeviceState(sizeof(DIMOUSESTATE2), &dims);
float relX = dims.lX;
float relY = dims.lY;
|
oder sieht es wie bei dir aus, wenn man gebuffert einliest? ich würds jedenfalls ungebuffert machen und mir halt die letzten 10 werte 'manuell' merken. |
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 35 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 22.08.2004, 16:15 Titel: |
|
|
Ich glaube nicht das es an dem codefragment liegt den du gepostet hast, sondern eher mir der verarbeitung danach. _________________ »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
– Robert X. Cringely, InfoWorld magazine |
|
Nach oben |
|
|
Chriss Senior JLI'ler
Anmeldedatum: 18.08.2004 Beiträge: 267
Medaillen: Keine
|
Verfasst am: 22.08.2004, 17:08 Titel: |
|
|
Erstmal danke für eure Beiträge,
die andere abfrage läuft bei mir gar nicht aber ich hab die lösung hier im forum zu einem anderen Thema gefunden. Es lag daran das im Debug Modus auch bei DirectX alles mit 0 initialisiert wird.
Falls noch jemand das Problem hatte hier ist die änderung:
// MOUSE_CHECKS steht nur für eine Zahl
DIDEVICEOBJECTDATA data[MOUSE_CHECKS];
muss in
DIDEVICEOBJECTDATA data[MOUSE_CHECKS] = {0,0,0,0};
geändert werden dann funktioniert es auch in der Retail version |
|
Nach oben |
|
|
|