| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen | 
	
	
		| Autor | Nachricht | 
	
		| Chriss Senior JLI'ler
 
 
 
 Anmeldedatum: 18.08.2004
 Beiträge: 267
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 20.08.2004, 13:21    Titel: Mausproblem mit Direct Input |   |  
				| 
 |  
				| Hallo, 
 ich wollte einen eigenen Mauscursor für ein Spiel machen. Der Cursor ist ein Spriteobjekt und die bewegung wollte ich mit Direct Input abfragen. Für die Mausabfrage habe ich die Klasse CInputManager aus dem 2. Buch JLI genommen und die Mausabfrage so optimiert das nicht nur der erste wert sondern 10 Werte in einer Schleif abgefragt werden. Wenn ich das kompiliere und bei mir starte läuft alles einwandfrei nur auf allen anderen Rechner die nicht die debugversion von directx installiert haben reagiert die Maus auch Tastatureingaben, besonders PFEIL_LINKS und PFEIL_HOCH, obwohl das in dem Programm an keiner Stelle so geschrieben ist. Da für Tastatur und Maus eine gemeinsame Klasse besteht werden 2 Objekte daraus erzeugt. Eine für Tastatur und eine für die Maus. zudem habe ich beides mit exklusievrechten initialisiert um anderen Problemen aus dem Weg zu geben.
 Der Code für die mausabfrage ist:
 
  	  | Code: |  	  | int CInputManager::getMouseInput(void)
 {
 DWORD NumElements = MOUSE_CHECKS;
 DIDEVICEOBJECTDATA data[MOUSE_CHECKS];
 ZeroMemory(&data,sizeof(data[0]));
 
 if(FAILED(m_lpDIDevice->GetDeviceData(sizeof(DIDEVICEOBJECTDATA),data,&NumElements,0)))
 {
 // die Mouse wurde zwischenzeitlich
 // von einer andere Anwendung genutzt
 // Kontrolle wiederholen
 m_lpDIDevice->Acquire();
 return 0;
 }
 
 // MousDatan auf den Ursprung setzen
 int MouseInput = 0;
 m_MouseData.x = 0;
 m_MouseData.y = 0;
 m_MouseData.Button0 = FALSE;
 
 for(int c = 0; c < MOUSE_CHECKS; c++)
 {
 //int Movement = data[c].dwData;
 
 // bestimmen, in welche Richtung die Mouse bewegt wurde
 // und ob eine Mouse-Taste gedrückt wurde
 if(data[c].dwOfs == DIMOFS_X)
 {
 m_MouseData.x += data[c].dwData;
 /*if(Movement < 0)
 {
 m_MouseData.x -= 1 * m_MouseSpeed;
 }
 if(Movement > 0)
 {
 m_MouseData.x += 1 * m_MouseSpeed;
 }*/
 }
 
 if(data[c].dwOfs ==  DIMOFS_Y)
 {
 m_MouseData.y += data[c].dwData;
 /*if(Movement < 0)
 {
 m_MouseData.y -= 1 * m_MouseSpeed;
 }
 if(Movement > 0)
 {
 m_MouseData.y += 1 * m_MouseSpeed;
 } */
 }
 
 if(data[c].dwOfs ==  DIMOFS_BUTTON0)
 {
 m_MouseData.Button0 = TRUE;
 }
 }
 
 return MouseInput;
 }
 
 | 
 "return MouseInput;" wird nicht berücksichtigt und "m_MouseData" ist eine Struktur, deren Inhalt über eine gesonderte Funktion zurückgegeben wird.
 Hat jemand eine Idee was hieran nicht stimmt oder woran es liegen könnte?
 
 edit by miracleboy: hab code tags eingefügt!
  |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| PeaceKiller JLI Master
 
  
 Alter: 36
 Anmeldedatum: 28.11.2002
 Beiträge: 970
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 20.08.2004, 14:01    Titel: |   |  
				| 
 |  
				| Der code ist ohne [code]-tags zimlich schwer zu lesen. _________________
 »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
 – Robert X. Cringely, InfoWorld magazine
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Chriss Senior JLI'ler
 
 
 
 Anmeldedatum: 18.08.2004
 Beiträge: 267
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 20.08.2004, 17:21    Titel: |   |  
				| 
 |  
				| Sorry wusste nicht wie das geht. |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Chriss Senior JLI'ler
 
 
 
 Anmeldedatum: 18.08.2004
 Beiträge: 267
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 22.08.2004, 12:38    Titel: |   |  
				| 
 |  
				| Kann bitte jemand bei dem die Maus funktioniert den nötigen code Posten? Bin echt verzweifelt. Das Problem habe ich übrigens nur wenn ich Maus und Tastatur über Direct Input anspreche. |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Chewie Super JLI'ler
 
 
 
 Anmeldedatum: 17.07.2003
 Beiträge: 382
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 22.08.2004, 15:04    Titel: |   |  
				| 
 |  
				| irgendwie schaut die mausabfrage bei mir überhaupt ganz anders aus: 
  	  | Code: |  	  | DIMOUSESTATE2 dims;
 m_lpDIMouse->GetDeviceState(sizeof(DIMOUSESTATE2), &dims);
 
 float relX = dims.lX;
 float relY = dims.lY;
 
 | 
 
 oder sieht es wie bei dir aus, wenn man gebuffert einliest? ich würds jedenfalls ungebuffert machen und mir halt die letzten 10 werte 'manuell' merken.
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| PeaceKiller JLI Master
 
  
 Alter: 36
 Anmeldedatum: 28.11.2002
 Beiträge: 970
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 22.08.2004, 16:15    Titel: |   |  
				| 
 |  
				| Ich glaube nicht das es an dem codefragment liegt den du gepostet hast, sondern eher mir der verarbeitung danach. _________________
 »If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside.«
 – Robert X. Cringely, InfoWorld magazine
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		| Chriss Senior JLI'ler
 
 
 
 Anmeldedatum: 18.08.2004
 Beiträge: 267
 
 Medaillen: Keine
 
 
 | 
			
				|  Verfasst am: 22.08.2004, 17:08    Titel: |   |  
				| 
 |  
				| Erstmal danke für eure Beiträge, die andere abfrage läuft bei mir gar nicht aber ich hab die lösung hier im forum zu einem anderen Thema gefunden. Es lag daran das im Debug Modus auch bei DirectX alles mit 0 initialisiert wird.
 
 Falls noch jemand das Problem hatte hier ist die änderung:
 
 // MOUSE_CHECKS steht nur für eine Zahl
 DIDEVICEOBJECTDATA data[MOUSE_CHECKS];
 
 muss in
 
 DIDEVICEOBJECTDATA data[MOUSE_CHECKS] = {0,0,0,0};
 
 geändert werden dann funktioniert es auch in der Retail version
 |  | 
	
		| Nach oben |  | 
	
		|  | 
	
		|  |