|
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
MoD2000 Mini JLI'ler
Anmeldedatum: 01.12.2003 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 23.12.2003, 14:35 Titel: DirectInput Problem Absolute Mauskoordinaten |
|
|
Also ich hab das hier in der DirectX8SDK hilfe gefunden:
Zitat: | The axis mode, which specifies whether relative or absolute data should be returned, is a property that can be changed before the device is acquired. (See Device Properties.) To set the axis mode to absolute, call IDirectInputDevice8::SetProperty with the DIPROP_AXISMODE value in the rguidProp parameter and with DIPROPAXISMODE_ABS in the dwData member of the DIPROPDWORD structure. |
ich hab dass dann geändert von
Code: | 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
// bei Ereignisbehandlung zwingend notwendig
lpDIMouse->SetProperty(DIPROP_BUFFERSIZE, &DIProperties.diph); |
auf
Code: | 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 = DIPROPAXISMODE_ABS;;
// Puffergröße für Mouseeingaben setzen
// bei Ereignisbehandlung zwingend notwendig
lpDIMouse->SetProperty(DIPROP_AXISMODE, &DIProperties.diph);
|
aber wenn ich dann die Mauskoordinaten auslese:
Code: |
int Mouse::GetEvent(void)
{
DWORD NumElements = 1;
DIDEVICEOBJECTDATA data;
int button = 0;
ZeroMemory(&data,sizeof(data));
if(FAILED(lpDIMouse->GetDeviceData(sizeof(data),&data,&NumElements,0)))
{
// die Mouse wurde zwischenzeitlich von einer andere Anwendung genutzt,
// deshalb Kontrolle wiederholen
lpDIMouse->Acquire();
return -1;
}
switch(data.dwOfs)
{
case DIMOFS_X:
XPos = data.dwData;
break;
case DIMOFS_Y:
YPos = data.dwData;
break;
case DIMOFS_BUTTON0:
if (!data.dwData) // Button1 wurde losgelassen
{
button = 1;
}
break;
case DIMOFS_BUTTON1:
if (!data.dwData) // Button2 wurde losgelassen
{
button = 2;
}
break;
}
return button;
}
|
, diese dann am Bildschirm anzeigen lasse, dann steht da immer 0!
PS.: es gibt keine warnung oder sowas vom kompiler, der fehler liegt an den einstellungen DIProperties, denke ich.
vielleicht liegt es aber auch an dem: (hab ich nicht verstanden)
Zitat: | When the axis mode is set to absolute, the coordinates are simply a running total of all relative motions received by DirectInput. The axis coordinates are not initialized to any particular value when the device is acquired, so your application should treat absolute values as relative to an unknown origin. You can record the current absolute position whenever the device is acquired and save it as the virtual origin. This virtual origin can then be subtracted from subsequent absolute coordinates retrieved from the device to compute the relative distance that the mouse has moved from the point of acquisition. |
|
|
Nach oben |
|
|
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 23.12.2003, 18:29 Titel: |
|
|
nimm das um die absoluten koordinaten zu bestimmen:
GetCursorPos();
ScreenToClient();
mit DInput geht das nicht, soweit ich weiß.. |
|
Nach oben |
|
|
MoD2000 Mini JLI'ler
Anmeldedatum: 01.12.2003 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 23.12.2003, 19:26 Titel: |
|
|
hmm komisch, dass dann in der hilfe überhaupt etwas erwähnt war.
braucht man für die funktion eigentlich nur windows.h ?
noch eine totale noob frage:
wie kann ich den cursor deaktivieren?
ich hab mit wndClass.hCursor schon alles möglcihe probiert:
einfach mal NULL setzten, LoadCursor(NULL) etc. aber da kommt dann immer nur die Sanduhr.
EDIT:
hab da noch ein problem, das is auch sehr merkwürdig.
ich habe mir so eine typische pfadstruktur für das projekt gemacht, wie es auch bei linux ist:
projektverzeichnis\src\
projektverzeichnis\doc\
projektverzeichnis\pic\
projektverzeichnis\dbg\ (debug)
usw.
ich hab beim projekt alles so eingestellt, dass die ganzen debug-files auch wirklich in dbg gespeichert werden.
das alle files ja in src sind, habe ich als arbeitsverzeichnis .. gewählt, damit ich ins projektverzeichnis komme. es hat alles einwandfrei geklappt, das kompilieren usw.
nur wenn ich dann die executable aus dem dbg verzeichniss starte, findet er keine pfade. hat wer ne ahnung warum???? |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 24.12.2003, 11:34 Titel: |
|
|
Vin der IDE aus ist der aktuelle Pfad immer das Projektverzeichnis. Wenn du die Exe-Datei später vom Explorer aus Doppelklickst, ist der aktuelle Pfad das Debug/Releaseverzeichnis.
Variante 1:
Du erstellst für den Explorer eine Verknüpfung zum Programm, auf die du immer doppelklickst - in dieser stellst du den aktuellen Pfad auf das Projektverzeichnis.
Variante 2:
Du stellst in den Projekteigenschaften der IDE den aktuellen Pfad auf die Debug/Releaseverzeichnisse um.
Variante 3: (Nur zu Testzwecken, bitte nicht so releasen)
Du benutzt im Programm komplett absolute Pfade
Variante 4:
Mit Hilfe der Registry liest du ein "Installationsverzeichnis" aus (das du vorher darin gespeichert hast) und benutzt absolute Pfade in Abhängigkeit des Eintrages der Registry. (Dieser Eintrag kann im Release z.B. bei einer Installation generiert werden, Registrybeispiel: Siehe Beispielprogramme von mir) _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
MoD2000 Mini JLI'ler
Anmeldedatum: 01.12.2003 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 24.12.2003, 12:59 Titel: |
|
|
aha, also ich hab ja variante 2 gemacht, aber dass das nciht ohne verknüpfung geht ist auch komisch, ich dachte, dass der arbeitspfad irgendwie gespeichert wird.
naja danke auf jedenfall, fehlt nurnoch das mit der maus, entweder die absoluten, oder den mauszeiger verhüllen.
wegen dem Mauszeiger verhüllen hab ich da was gefunden:
ein beispiel aus dem Directx8SDK, ich glaub dass is eh in jeder fullscreen anwendung so, aber ich habs trotzdem nicht geschafft. als vorlage habe ich das AnimatedPalette beispiel genommen.
bei den fenstereigenschaften stand da:
Code: | wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); |
aber ich denke es ist egal welchen cursor man ladet, da er eh nciht angezeigt werden soll. ich hab später nochwas gefunden, in der Callback funktion:
Code: | case WM_SETCURSOR:
// Hide the cursor in fullscreen
SetCursor( NULL );
break; |
das hab ich reinopiert, aber es funz trotzdem nix, anscheinend bringt das SetCursor (NULL); aus irgendeinem grund in meinem pgm nicht wirkt.
sonst hab ich nix über cursor gefunden. |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 24.12.2003, 13:05 Titel: |
|
|
Ich glaube ShowCurser(true/false);
Am Anfang vom Programm verstecken, und am ENde wieder anzeigen lassen. (Beachte, Wenn das Programm abstürzt, kann es sein, dass der Curser dann nicht Sichtbar ist)
Alternativ: Verwende einen Mauscursor, der 100% Transparente Pixel enthält - kann man im Visual Studio selber malen.
SetCursor(NULL) macht eigendlich gar nichts... _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
MoD2000 Mini JLI'ler
Anmeldedatum: 01.12.2003 Beiträge: 12
Medaillen: Keine
|
Verfasst am: 24.12.2003, 15:44 Titel: |
|
|
thx für alles und frohe Weihnachten |
|
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
|