JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Lauffähiges Beispiel einer DirectX Mauseinbindung

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

BeitragVerfasst am: 30.04.2006, 18:19    Titel: Lauffähiges Beispiel einer DirectX Mauseinbindung Antworten mit Zitat

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


Alter: 33
Anmeldedatum: 03.03.2005
Beiträge: 208
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 30.04.2006, 20:00    Titel: Antworten mit Zitat

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


Alter: 43
Anmeldedatum: 16.01.2006
Beiträge: 130
Wohnort: Bayern
Medaillen: Keine

BeitragVerfasst am: 01.05.2006, 10:38    Titel: Ja, aber bei der initiierung hackt es noch... Antworten mit Zitat

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 Sad

RayJunx

edit KI: besser cpp-tags benutzen.
_________________
Just a Freak
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
OLiver
Super JLI'ler


Alter: 33
Anmeldedatum: 29.06.2003
Beiträge: 306
Wohnort: Jena
Medaillen: Keine

BeitragVerfasst am: 01.05.2006, 11:12    Titel: Antworten mit Zitat

Wäre es nicht viel einfacher die Maus via WinAPI abzufragen?
_________________
http://www.sieder25.org/ (Siedler 2 - Remake)
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: 01.05.2006, 11:37    Titel: Antworten mit Zitat

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



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 01.05.2006, 11:52    Titel: Re: Ja, aber bei der initiierung hackt es noch... Antworten mit Zitat

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 Razz ) 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. Smile

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
RayJunx
JLI'ler


Alter: 43
Anmeldedatum: 16.01.2006
Beiträge: 130
Wohnort: Bayern
Medaillen: Keine

BeitragVerfasst am: 01.05.2006, 15:38    Titel: Irgendwo ist noch der wurm drin... Antworten mit Zitat

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... Sad

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 Wink ?

danke für die hilfe,

Rayjunx
_________________
Just a Freak
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jones
Senior JLI'ler


Alter: 33
Anmeldedatum: 03.03.2005
Beiträge: 208
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 01.05.2006, 15:46    Titel: Antworten mit Zitat

Du musst natürlich 'dims2' natürlich deklarieren Wink , also:
CPP:
DIMOUSESTATE2 dims2;
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
RayJunx
JLI'ler


Alter: 43
Anmeldedatum: 16.01.2006
Beiträge: 130
Wohnort: Bayern
Medaillen: Keine

BeitragVerfasst am: 01.05.2006, 15:48    Titel: an welcher stelle Antworten mit Zitat

an welcher stelle soll ich das?
_________________
Just a Freak
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jones
Senior JLI'ler


Alter: 33
Anmeldedatum: 03.03.2005
Beiträge: 208
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 01.05.2006, 15:51    Titel: Antworten mit Zitat

Da, wo du auch die Variabeln für die Mauskoordinaten deklariert hast.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
DirectXer
Dark JLI'ler



Anmeldedatum: 05.02.2005
Beiträge: 1201
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 01.05.2006, 17:53    Titel: Antworten mit Zitat

und du musst hr auch da in der der funktion am Anfang deklarieren:
CPP:
HRESULT hr;
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
RayJunx
JLI'ler


Alter: 43
Anmeldedatum: 16.01.2006
Beiträge: 130
Wohnort: Bayern
Medaillen: Keine

BeitragVerfasst am: 01.05.2006, 20:23    Titel: Perfekt! Antworten mit Zitat

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