JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=482f76f3cb479917cb58c4749f6ff8c1Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

DirectX Input Mauspostion (GetDeviceState)

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
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

BeitragVerfasst am: 03.04.2004, 06:20    Titel: DirectX Input Mauspostion (GetDeviceState) Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
=]Mid[=]Night[=
Super JLI'ler



Anmeldedatum: 20.11.2002
Beiträge: 380
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 03.04.2004, 08:06    Titel: Antworten mit Zitat

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] Embarassed
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
PeaceKiller
JLI Master


Alter: 36
Anmeldedatum: 28.11.2002
Beiträge: 970

Medaillen: Keine

BeitragVerfasst am: 03.04.2004, 14:25    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 03.04.2004, 15:19    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
=]Mid[=]Night[=
Super JLI'ler



Anmeldedatum: 20.11.2002
Beiträge: 380
Wohnort: Aachen
Medaillen: Keine

BeitragVerfasst am: 04.04.2004, 10:13    Titel: Antworten mit Zitat

ach so, Acquire() ist natürlich wichtig ... hab ich halt nicht gesehen Embarassed
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum