JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

DirectInput Problem Absolute Mauskoordinaten

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
MoD2000
Mini JLI'ler



Anmeldedatum: 01.12.2003
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 23.12.2003, 14:35    Titel: DirectInput Problem Absolute Mauskoordinaten Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Chewie
Super JLI'ler



Anmeldedatum: 17.07.2003
Beiträge: 382

Medaillen: Keine

BeitragVerfasst am: 23.12.2003, 18:29    Titel: Antworten mit Zitat

nimm das um die absoluten koordinaten zu bestimmen:
GetCursorPos();
ScreenToClient();

mit DInput geht das nicht, soweit ich weiß..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MoD2000
Mini JLI'ler



Anmeldedatum: 01.12.2003
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 23.12.2003, 19:26    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 24.12.2003, 11:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MoD2000
Mini JLI'ler



Anmeldedatum: 01.12.2003
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 24.12.2003, 12:59    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
AFE-GmdG
JLI MVP
JLI MVP


Alter: 45
Anmeldedatum: 19.07.2002
Beiträge: 1374
Wohnort: Irgendwo im Universum...
Medaillen: Keine

BeitragVerfasst am: 24.12.2003, 13:05    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
MoD2000
Mini JLI'ler



Anmeldedatum: 01.12.2003
Beiträge: 12

Medaillen: Keine

BeitragVerfasst am: 24.12.2003, 15:44    Titel: Antworten mit Zitat

thx für alles und frohe Weihnachten Very Happy
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