|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 03.04.2004, 06:20 Titel: DirectX Input Mauspostion (GetDeviceState) |
|
|
Ich programmirer mir gerade eine Klasee üfr DirectXInput (DX9)
In dem Buch sind die Varianten mit Polling un Ereigniserzeugung beschribene.
Da mir das mit dem Puffer aber zu kompliziert ist (ich hab gelesen, da wird bei jeder Mausbewegung für jede Richtung ein neuer Eintrag gemacht, man muss also am besten immer den Kompletten Puffer lesen um richtige Ergebnisse zu haben), wollte ich die Funktion GetDeviceState benutzen:
Code: |
void CDirectInput::GetInput()
{
if(NULL==m_lpDI)
{
Error("Direct Input wurde nicht initialisiert!");
}
//Die Tastaur aktualiesieren
if(FAILED(m_lpDIKeyboard->GetDeviceState(sizeof(m_bKeyboard), (LPVOID)&m_bKeyboard)))
{
Error("Direct X Input: Kontrolle über Tastatur verloren!");
}
//Die Maus aktualiesieren
m_lpDIMouse->GetDeviceState(sizeof(m_Mousestate), &m_Mousestate);
m_CursorXPos+=(int)m_Mousestate.lX;
m_CursorYPos+=(int)m_Mousestate.lY;
} |
Die initialisierung der Maus:
Code: |
void CDirectInput::Init(HWND hWnd, HINSTANCE hInst)
{
if(FAILED(DirectInput8Create(hInst, DIRECTINPUT_VERSION, IID_IDirectInput8, (LPVOID*)&m_lpDI, NULL)))
{
Error("Direct X Input: Objekt konnte nicht erzeugt werden!");
}
//Die Tastatur initialisieren:
if(FAILED(m_lpDI->CreateDevice(GUID_SysKeyboard, &m_lpDIKeyboard, NULL)))
{
Error("Direct XInput: Tastaturdevice konnte nicht angelegt werden!");
}
//Datenformat setzten
if(FAILED(m_lpDIKeyboard->SetDataFormat(&c_dfDIKeyboard)))
{
Error("Direct X Input: Fehler beim setzen des Datenformats für die Tastatur!");
}
//Kooperationseben setzten
if(FAILED(m_lpDIKeyboard->SetCooperativeLevel(hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)))
{
Error("Direct X Input: Fehler beim setzten der Kooperationseben für die Tastatur!");
}
m_lpDIKeyboard->Acquire();
//Die Maus initialiesieren
if(FAILED(m_lpDI->CreateDevice(GUID_SysMouse, &m_lpDIMouse, NULL)))
{
Error("Direct X Input: Mausdevice konnte nicht angelegt werden!");
}
if(FAILED(m_lpDIMouse->SetDataFormat(&c_dfDIMouse)))
{
Error("Direct X Input: Fehler beim setzten des Datenformates für die Maus!");
}
if(FAILED(m_lpDIMouse->SetCooperativeLevel(hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE)))
{
Error("Direct X Input: Fehler beim setzten der Kooperationsebende für die Maus!");
}
} |
Und dann hab ich noch 2 Funktionen die jeweils m_CursorXPos und m_CursorYPos zurückgeben.
Die Tastatureingabe funktioniert, aber die Cursorposition ändert sich nicht. Kann es sein, das ich die Methode GetDeviceState() irgendiwe falsch benutze?[/quote] _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
=]Mid[=]Night[= Super JLI'ler
Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 03.04.2004, 08:06 Titel: |
|
|
Die beiden Elemente lX und lY von DIMOUSESTATE geben nicht die absolute Position der Maus, sondern die Änderung zur letzten Überprüfung an. Du musst also die absolute Position der Maus speichern und lX und lY zur jeweiligen Koordinate addieren.
[edit] ich seh grad das hast du schon so gemacht [/edit] |
|
Nach oben |
|
|
PeaceKiller JLI Master
Alter: 36 Anmeldedatum: 28.11.2002 Beiträge: 970
Medaillen: Keine
|
Verfasst am: 03.04.2004, 14:25 Titel: |
|
|
Das Problem hatte ich auch und dann habe ich debuggt und herausgefunden, dass das daran liegt das DirectInput nicht die Konrolle über die Maus behalten kann. Dann habe ich mir ein paar Beispiele aus dem DX-SDK angekuckt und mir daraus den folgenden Code gemacht.
Code: |
DWORD NumElements = INFINITE;
DIDEVICEOBJECTDATA data[16];
ZeroMemory(&data,sizeof(data));
HRESULT hr;
if(FAILED(m_lpDIDeviceMouse->Poll()))
{
// DInput is telling us that the input stream has been
// interrupted. We aren't tracking any state between polls, so
// we don't have any special reset that needs to be done. We
// just re-acquire and try again.
hr = m_lpDIDeviceMouse->Acquire();
while( hr == DIERR_INPUTLOST )
hr = m_lpDIDeviceMouse->Acquire();
// hr may be DIERR_OTHERAPPHASPRIO or other errors. This
// may occur when the app is minimized or in the process of
// switching, so just try again later
return 0;
}
// Get the input's device state
if( FAILED( hr = m_lpDIDeviceMouse->GetDeviceData(sizeof(data[16]),data,&NumElements,0) ) )
return hr; // The device should have been acquired during the Poll()
int MouseInput = 0;
int i;
for(i = 0;i < NumElements;i++)
{
// bestimmen, in welche Richtung die Mouse bewegt wurde
// und ob eine Mouse-Taste gedrückt wurde
switch(data[i].dwOfs)
{
case DIMOFS_X:
MouseX += data[i].dwData;
break;
case DIMOFS_Y:
MouseY += data[i].dwData;
break;
case DIMOFS_BUTTON0:
MouseInput = MOUSE_CLICK;
break;
}
}
if(MouseX >= SCR_WIDTH)
MouseX = SCR_WIDTH;
if(MouseX <= 0)
MouseX = 0;
if(MouseY >= SCR_HEIGHT)
MouseY = SCR_HEIGHT;
if(MouseY <= 0)
MouseY = 0;
return MouseInput;
}
|
Initialisierung:
Code: |
// Gerät für die Mouse festlegen
if(FAILED(m_lpDI->CreateDevice(GUID_SysMouse, &m_lpDIDeviceMouse, NULL)))
{
MessageBox(hWnd,"Fehler beim Anlegen des Geräts","Fehler",MB_OK);
return FALSE;
}
// c_dfDIMouse ist eine vordefinierte Variable
if(FAILED(m_lpDIDeviceMouse->SetDataFormat(&c_dfDIMouse2)))
{
MessageBox(hWnd,"Fehler beim Setzen des Datenformats","Fehler",MB_OK);
return FALSE;
}
// Kooperationsebene festlegen
if(FAILED(m_lpDIDeviceMouse->SetCooperativeLevel(hWnd,DISCL_FOREGROUND |
DISCL_EXCLUSIVE)))
{
MessageBox(hWnd,"Fehler beim Setzen des Kooperationsebene (DirectInput)","Fehler",MB_OK);
return FALSE;
}
// Eigenschaften für das Gerät setzen (Puffergröße)
DIPROPDWORD DIProperties;
ZeroMemory(&DIProperties,sizeof(DIProperties));
DIProperties.diph.dwSize = sizeof(DIPROPDWORD);
DIProperties.diph.dwHeaderSize = sizeof(DIPROPHEADER);
DIProperties.diph.dwObj = 0;
DIProperties.diph.dwHow = DIPH_DEVICE;
// Puffer größe festlegen
DIProperties.dwData = 16;
// Puffergröße für Mouseeingaben setzen
m_lpDIDeviceMouse->SetProperty(DIPROP_BUFFERSIZE, &DIProperties.diph);
// Zugang zur Mouse verschaffen
m_lpDIDeviceMouse->Acquire();
return TRUE;
|
|
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 03.04.2004, 15:19 Titel: |
|
|
@Peace Killer
Danke für die Antwort. Sie hat mir sehr weitergeholfen. Mein Problem war, das ich kein einziges mal m_lpDIMouse->Acquire() aufgerufen hab. Ich hab also nicht nur die Kontrolle verloren, sondern sie nie besessen!
Wenn ich mal an irgendwelchen Stellen plötzlich die Kontrolle verlieren sollte, werde ich sicherlich den Quellcode mal genauer unter die Lupe nehmen und eibauen.
danke _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
=]Mid[=]Night[= Super JLI'ler
Anmeldedatum: 20.11.2002 Beiträge: 380 Wohnort: Aachen Medaillen: Keine
|
Verfasst am: 04.04.2004, 10:13 Titel: |
|
|
ach so, Acquire() ist natürlich wichtig ... hab ich halt nicht gesehen |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|