Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
RayJunx JLI'ler
Alter: 43 Anmeldedatum: 16.01.2006 Beiträge: 130 Wohnort: Bayern Medaillen: Keine
|
Verfasst am: 30.04.2006, 18:19 Titel: Lauffähiges Beispiel einer DirectX Mauseinbindung |
|
|
Hat mir jemand zufällig eine lauffähige Anwendung einer Direct X Mauseinbindung? Tastendruck( links rechts mitte ) und Mausposition?
Ich habe viel probiert, hab auch 3 Beispiele gefunden aber KEINES
funktioniert wirklich. Entweder sie spucken nur irre werte aus oder
es geht garnichts.
Irgend ein beispiel das geht, dann find ich schon raus was ich früher
falsch gemacht habe oder was gefehlt hat.
schonmal danke für alle Infos!
grüße
Rayjunx _________________ Just a Freak |
|
Nach oben |
|
|
Jones Senior JLI'ler
Alter: 33 Anmeldedatum: 03.03.2005 Beiträge: 208 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 30.04.2006, 20:00 Titel: |
|
|
Die Mausposition die dir Direct Input ausgibt sind relative sondern absolute Werte. Du musst die relativen Werte jedesmal beim Updaten in einer Variable hinzuaddieren, das ist dann die absolute Koordinate.
Hier der Pseudocode:
Code: |
AbsMousePosX += Mousestate.x;
AbsMousePosY += Mousestate.y;
|
|
|
Nach oben |
|
|
RayJunx JLI'ler
Alter: 43 Anmeldedatum: 16.01.2006 Beiträge: 130 Wohnort: Bayern Medaillen: Keine
|
Verfasst am: 01.05.2006, 10:38 Titel: Ja, aber bei der initiierung hackt es noch... |
|
|
Hi, hab aber noch probleme das ganze gerüßt auf die beine zu stellen...
ich weiß nicht was ich wo genau initieren muß und wie ich es von der struktur her anlegen muß... ich will am ende nur an die mauskoordinaten kommen,
hier der code bisher:
CPP: | // Globale Variablen Definiert für Maus:
float DirectMausX; // Mauskoordinaten der Direct X Maus
float DirectMausY;
....
BOOL InitDirectInput(HINSTANCE hInst); // DirectInput-Objekte initialisieren
// Funktion sieht dann wie folgt aus:
BOOL InitDirectInput(HINSTANCE hInst)
{
DirectInput8Create(hInst, DIRECTINPUT_VERSION, IID_IDirectInput8,(void**)&lpDI,NULL);// DirectInput8-Objekt anlegen
lpDI->CreateDevice(GUID_SysKeyboard, &lpDIKeyboard, NULL); // Gerät für die Tastatur festlegen
lpDI->CreateDevice(GUID_SysMouse,&lpDIMouse, NULL);
lpDIKeyboard->SetDataFormat(&c_dfDIKeyboard);
lpDIMouse->SetDataFormat(&c_dfDIMouse2);
lpDIKeyboard->SetCooperativeLevel(hWnd,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); // Kooperationsebene festlegen
lpDIMouse->SetCooperativeLevel(hWnd,DISCL_FOREGROUND | DISCL_NONEXCLUSIVE); // nonexclusive oder exclusiv
lpDIKeyboard->Acquire();// Zugang zu Tastatur
lpDIMouse->Acquire();// Zugang zur Maus
// wo soll ich das hier definieren???
typedef struct DIMOUSESTATE2
{
LONG lX;
LONG lY;
LONG lZ;
BYTE rgbButtons[8];
} DMOUSESTATE, *LPDIMOUSESTATE2;
return TRUE;
}
...
//dann wieder im hauptcode:
InitDirectInput(hInstance); // DirectInput initialisieren
//...
//und im programm wird dann die funktion zur verarbeitung des
//inputs aufgerufen:
void ProcessInput(void)
{
ZeroMemory(&dims2,sizeof(dims2));
hr=lpDIMouse->GetDeviceState(sizeof(DIMMOUSESTATE2), &dims2);
DirectMausX += dims2.lX;
DirectMausY += dims2.lY;
}
// irgendwie so. Das habe ich mir querbet zusammengeschußtert, aber
wie man sieht funktioniert es nicht, weil ich garantiert die hälfte vergessen habe.
|
bitte hilfe
RayJunx
edit KI: besser cpp-tags benutzen. _________________ Just a Freak |
|
Nach oben |
|
|
OLiver Super JLI'ler
Alter: 33 Anmeldedatum: 29.06.2003 Beiträge: 306 Wohnort: Jena Medaillen: Keine
|
Verfasst am: 01.05.2006, 11:12 Titel: |
|
|
Wäre es nicht viel einfacher die Maus via WinAPI abzufragen? _________________ http://www.sieder25.org/ (Siedler 2 - Remake) |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 01.05.2006, 11:37 Titel: |
|
|
mit DInput ist das schon ganz ok, da kann man z.b. auch Mausgeschwindigkeit und so ändern.
So auf den ersten BLick sieht das Beispeil schon ganz ok aus. Jedefnalls sollten die Globalen Variablen mit 0 initialisiert werden oder noch besser Member eine DirectInputklasse sein. Was genau funktioniet den nicht? Verändern sich die Koordinaten nicht oder was?
Du solltest auf jeden Fall ncoh einfügen, das die Dimensionen beschränkt werdne, also nahcdme du DirectMausX verändert ahst chekcne ob es innerhalb de s Bildhscmr liegt (bei 1024x768 müsste DirectMausX also zwischen 0 und 1024 liegen). _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 01.05.2006, 11:52 Titel: Re: Ja, aber bei der initiierung hackt es noch... |
|
|
RayJunx hat Folgendes geschrieben: | CPP: | // wo soll ich das hier definieren???
typedef struct DIMOUSESTATE2
{
LONG lX;
LONG lY;
LONG lZ;
BYTE rgbButtons[8];
} DMOUSESTATE, *LPDIMOUSESTATE2; |
|
ähm, du sollst diese Struktur _gar nicht_ definieren, die ist schon definiert und zwar bei den dinput-Komponentet... Aber ich glaube, du meinst wo du diese Struktur benutzen sollst, oder? Also:
In deiner Init-Funktion (übrigens: es heißt entweder initialisieren oder initiieren (wobei das 2. nix mit programmierung zu tun hat), denn initieren gibt es net ) hast du folegnde Zeile stehen: CPP: | lpDIMouse->SetDataFormat(&c_dfDIMouse2); | Damit versicherst du DI, dass es dir auf Anfrage die Mausdaten in eine Struktur namens DIMOUSESTATE2 (s.O.) schreiben soll. Dieses "auf Anfrage" hast du ja auch schon gemacht, und zwar in deiner ProcessInput-Funktion. (Außer dass du in deiner ProcessInput aus Versehen ein doppel-M geschreiben hast) Das ist dann so schon richtig, müsste eigentlich klappen.
Gruß DXer
PS: ich würde beim CooperativLevel bei der Maus das EXCLUSIVE nehmen und bei ProcessInput vorher noch dein hr überprüfen, und zwar so: CPP: | void ProcessInput(void)
{
ZeroMemory(&dims2,sizeof(dims2));
hr=lpDIMouse->GetDeviceState(sizeof(DIMMOUSESTATE2), &dims2);
if(FAILED(hr))
{
hr = lpDIMouse->Acquire();
while(hr == DIERR_INPUTLOST)
hr = lpDIMouse->Acquire();
}
DirectMausX += dims2.lX;
DirectMausY += dims2.lY;
}
|
|
|
Nach oben |
|
|
RayJunx JLI'ler
Alter: 43 Anmeldedatum: 16.01.2006 Beiträge: 130 Wohnort: Bayern Medaillen: Keine
|
Verfasst am: 01.05.2006, 15:38 Titel: Irgendwo ist noch der wurm drin... |
|
|
Hi all,
erstmal wegen der winapi einbindung... so habe ich es bisher auch gemacht, aber ich möchte jetzt direct X für die maus verwenden. die api ist nicht gerade so gut dafür geeignet, habe auch immer ein problem das ich mit der maus nicht direkt an den rand gehen kann. Wenn ich es zu schnell mache
bleibt die maus beispielsweiße auf X20 stehen und dann ist es gleich wie
weit ich die maus noch nach links bewege, aber ganz gleich spielt ja jetzt keine rolle mehr.
Habe alle änderungen einfließen lassen und den code überarbeitet und auch den doppel M tipfehler behoben, bekomme aber immernoch eine fehlermeldung: jene hier:
.\Main.CPP(684) : error C2065: 'dims2' : undeclared identifier
.\Main.CPP(684) : error C2070: ''unknown-type'': illegal sizeof operand
.\Main.CPP(685) : error C2065: 'hr' : undeclared identifier
bezieht sich auf diese codezeilen:
Code: | ZeroMemory(&dims2,sizeof(dims2));
hr=lpDIMouse->GetDeviceState(sizeof(DIMOUSESTATE2), &dims2); |
Und das verstehe ich jetzt wieder nicht...
hiernochmal die aktuellen Codeausschnitte:
Code: |
// grundvariablen:
float DirectMausX=0; // Mauskoordinaten der Direct X Maus
float DirectMausY=0;
// init direct input
lpDI->CreateDevice(GUID_SysMouse,&lpDIMouse, NULL);
lpDIMouse->SetDataFormat(&c_dfDIMouse2);
lpDIMouse->SetCooperativeLevel(hWnd,DISCL_FOREGROUND | DISCL_EXCLUSIVE); // nonexclusive oder exclusiv
lpDIMouse->Acquire();// Zugang zur Maus
ZeroMemory(&dims2,sizeof(dims2));
hr=lpDIMouse->GetDeviceState(sizeof(DIMOUSESTATE2), &dims2);
if(FAILED(hr))
{
hr = lpDIMouse->Acquire();
while(hr == DIERR_INPUTLOST)
hr = lpDIMouse->Acquire();
}
// processinput-verarbeitung
DirectMausX += dims2.lX; // Mausänderung einrechnen
DirectMausY += dims2.lY;
if (DirectMausX<0) DirectMausX=0; // Maus auf Bildbereich beschränken
if (DirectMausY<0) DirectMausY=0;
if (DirectMausX>1280) DirectMausX=1280;
if (DirectMausY>1024) DirectMausY=1024;
|
Kann mir jemand sagen ob ich dims2 irgendwo zu declarieren vergessen habe, oder woran es sonst hängt? oder Läufts nur bei mir nicht ?
danke für die hilfe,
Rayjunx _________________ Just a Freak |
|
Nach oben |
|
|
Jones Senior JLI'ler
Alter: 33 Anmeldedatum: 03.03.2005 Beiträge: 208 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 01.05.2006, 15:46 Titel: |
|
|
Du musst natürlich 'dims2' natürlich deklarieren , also:
CPP: | DIMOUSESTATE2 dims2; |
|
|
Nach oben |
|
|
RayJunx JLI'ler
Alter: 43 Anmeldedatum: 16.01.2006 Beiträge: 130 Wohnort: Bayern Medaillen: Keine
|
Verfasst am: 01.05.2006, 15:48 Titel: an welcher stelle |
|
|
an welcher stelle soll ich das? _________________ Just a Freak |
|
Nach oben |
|
|
Jones Senior JLI'ler
Alter: 33 Anmeldedatum: 03.03.2005 Beiträge: 208 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 01.05.2006, 15:51 Titel: |
|
|
Da, wo du auch die Variabeln für die Mauskoordinaten deklariert hast. |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 01.05.2006, 17:53 Titel: |
|
|
und du musst hr auch da in der der funktion am Anfang deklarieren: |
|
Nach oben |
|
|
RayJunx JLI'ler
Alter: 43 Anmeldedatum: 16.01.2006 Beiträge: 130 Wohnort: Bayern Medaillen: Keine
|
Verfasst am: 01.05.2006, 20:23 Titel: Perfekt! |
|
|
Perfekt!
Tausend Dank, jetzt funktioniert alles wunderprächtig! Habe ständig die Koordinaten, den Status aller Tasten, ja sogar des Z Mausrades. No prob. man muß nur wie oben von euch geschrieben die beiden variablen noch am start definieren, und dann noch untern die vearbeitung der mauseingaben etwas ausbauen. hänge den quellcode der mausverarbeitungsfunktion mal eben an, für den fall das jemand mal vor dem gleichen problem steht:
und danke nochmal an alle! *die runde wink*
Code: |
//Mauseinbindung
ZeroMemory(&dims2,sizeof(dims2));
hr=lpDIMouse->GetDeviceState(sizeof(DIMOUSESTATE2), &dims2);
if(FAILED(hr))
{
hr = lpDIMouse->Acquire();
while(hr == DIERR_INPUTLOST)
hr = lpDIMouse->Acquire();
}
maus_lb_down=0;
maus_mb_down=0;
maus_rb_down=0;
if(dims2.rgbButtons[0] & 0x80)
maus_lb_down=1;
if(dims2.rgbButtons[1] & 0x80)
maus_mb_down=1;
if(dims2.rgbButtons[2] & 0x80)
maus_rb_down=1;
DirectMausX += dims2.lX*MAUSSPEEDFAKTOR; // Mausänderung einrechnen
DirectMausY += dims2.lY*MAUSSPEEDFAKTOR;
DirectMausZ += dims2.lZ;
if (DirectMausX<0) DirectMausX=0; // Maus auf Bildbereich beschränken
if (DirectMausY<0) DirectMausY=0;
if (DirectMausX>1280) DirectMausX=1280;
if (DirectMausY>1024) DirectMausY=1024;
|
_________________ Just a Freak |
|
Nach oben |
|
|
|