DirectInput

Hallo,

ich versuche per DirectInput8 ein Inputinterface zu schreiben, mein iface sieht wie folgt aus

class IInput
{public:
virtual void GetMousePos( int* Maus_X, int* Maus_Y ) = 0;
virtual DWORD GetMouseButtons( void ) = 0;
};

meine implementierung der GetMousPos(…) sieht wie folgt aus:

IInput::GetMousePos( int* Maus_X, int* Maus_Y )

if (Mauspuffer == TRUE)
bGepufferte_Maus = TRUE;
else
bGepufferte_Maus = FALSE;

//////////////////MAUS OBJEKT ERSTELLEN///////////////////////////////////////////////////////
cinput.m_hr = Cinput.lpDI->CreatDeviceEx (GUID_SysMouse,IID_IDirecInputDevice7,
(LPVOID*)&lpDIMaus, NULL);
if FAILED(Cinput.m_hr) {
DI_Term();
return FALSE;
}

/////////////DATENFORMAT FESTLEGEN//////////////////////////////////////////////////////////
cinput.m_hr = lpDIMaus->SetDataFormat(&c_dfDIMouse);
if FAILED(Cinput.m_hr) {
DI_Term();
return FALSE;
}
//////////////kooperation mit windows festlegen////////////////////////////////////////////
Cinput.m_hr = lpDIMaus ->SetCooperativeLevel (hwnd, DISCL_FOREGROUND | DISCL_NONEXCLUSICE);
if FAILED(Cinput.m_hr) {
DI_Term();
return FALSE;
}

/////////////////////////puffer für maus aktivierung erzeugen/////////////////////////////
dipdw.diph.dwSize = sizeof(DIPROPDWORD);
dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
dipdw.diph.dwObj = 0;
dipdw.diph.dwHow = DIPH_DEVICE;
dipdw.dwData = DINPUT_BUFFERSIZE;

Cinput.m_hr = = lpDIMaus->SetProperty(DIPROP_BUFFERSIZE, &dipdw.diph)
if FAILED(Cinput.m_hr) {
DI_Term();
return FALSE;
}

/////////////////////////MAUS OBJEKT AKTIVIEREN///////////////////////////////////////////
if (lpDIMaus)
{
Cinput.m_hr = lpDIMaus->Acquire();

if FAILED(Cinput.m_hr) {
DI_Term();
return FALSE;
}

inline BOOL Cinput::Maus_Update(void)
{
BOOL bFertig = FALSE;
DIMOUSESTATE ms;

// Gepuffert: Langsam, bearbeitet aber ALLE Maus-Aktionen
if (bGepufferte_Maus == TRUE)
{
while (!bFertig)
{
DIDEVICEOBJECTDATA od; // Speichert Mauszustand
DWORD dwElemente = 1; // Elemente die abgefragt werden sollen

Cinput.m_hr = lpDIMaus->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),
&od, &dwElemente, 0);
if (Cinput.m_hr == DIERR_INPUTLOST)
{
lpDIMaus->Acquire();
if (Cinput.m_hr != DI_OK)
{
DI_Term();
return FALSE;
}
else
{
Cinput.m_hr = lpDIMaus->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),
&od, &dwElemente, 0);
if (Cinput.m_hr == DIERR_INPUTLOST)
{
DI_Term();
return FALSE;
}
} // else
} // if INPUTLOST
// Das hier kommt öfters vor, also nicht abbrechen
else if (Cinput.m_hr != DI_OK)
{
bFertig = TRUE;
return FALSE;
} // else [anderer Fehler]

// Keine Elemente wurden verändert
if (dwElemente == 0)
bFertig = TRUE;

// Feld ‚dwOfs‘ enthält Maus-Aktion:
switch (od.dwOfs)
{
// Horizontale Bewegung
case DIMOFS_X:
Maus_x += od.dwData;
bFertig = TRUE;
break;
// Vertikale Bewegung
case DIMOFS_Y:
Maus_y += od.dwData;
bFertig = TRUE;
break;
// Knopf 0 gedrückt
case DIMOFS_BUTTON0:
// Knopf gedrück
if (od.dwData & 0x80)
{
bMaus_Buttons[0] = TRUE;
bFertig = TRUE;
}
// Knopf losgelassen
else
{
bMaus_Buttons[0] = FALSE;
bFertig = TRUE;
}
break;
// Knopf 1 gedrückt
case DIMOFS_BUTTON1:
// Knopf gedrück
if (od.dwData & 0x80)
{
bMaus_Buttons[1] = TRUE;
bFertig = TRUE;
}
// Knopf losgelassen
else
{
bMaus_Buttons[1] = FALSE;
bFertig = TRUE;
}
break;
}; // switch
} // while
} // if [bGepufferte_Maus]
// Ungepuffert: Schnell, verpasst aber ab und zu Maus-Aktionen:
else
{
Cinput.m_hr = lpDIMaus->GetDeviceState(sizeof(DIMOUSESTATE),
(LPVOID)&ms);
if (Cinput.m_hr == DIERR_INPUTLOST)
{
lpDIMaus->Acquire();
if (Cinput.m_hr != DI_OK)
{
DI_Term();
return FALSE;
}
else
{
Cinput.m_hr = lpDIMaus->GetDeviceState(sizeof(DIMOUSESTATE),
(LPVOID)&ms);
if (Cinput.m_hr == DIERR_INPUTLOST)
{
DI_Term();
return FALSE;
}
} // else
} // if INPUTLOST
// Das hier kommt öfters vor, also nicht abbrechen
else if (Cinput.m_hr != DI_OK)
{
return FALSE;
} // else [anderer Fehler]

Maus_x += ms.lX;
Maus_y += ms.lY;

if (ms.rgbButtons[0] & 0x80)
bMaus_Buttons[0] = TRUE;
else
bMaus_Buttons[0] = FALSE;
if (ms.rgbButtons[1] & 0x80)
bMaus_Buttons[1] = TRUE;
else
bMaus_Buttons[1] = FALSE;
} // else [!bGepufferte_Maus]

} // ::Maus_Update

wie bekomm ich nun Maus_x und Maus_y als Parameter an die funktion,

mit return (Maus_x Maus_y) ???

muss die implementierung von di eigentlich innerhalb der funktion erfolgen, oder reicht es, wenn sie innerhalb der class erfolgt ???
gruss
sven

wie bekomm ich nun Maus_x und Maus_y als Parameter an die
funktion,

mit return (Maus_x Maus_y) ???

Noe, das geht nicht. Wie waer’s aber mit call-by-reference Variablen?

IInput::GetMousePos( int& Maus\_X, int& Maus\_Y )
{
 ...
 Maus\_X = ...;
 Maus\_Y = ...;
}

Ich hab’ die Implementierung mir nicht genau angesehen, weiss daher auch nicht, ob das so funktionieren wird, aber irgendwie sah das alles fuer mich sehr schief und merkwuerdig aus. Schau’ Dir noch einmal genau die Samples im SDK an.

–Mathias