Beginnen met DirectX

Hallo

Hallo!

Mn 2e tut!

Dit is niet een officiele tut maar meer een extraatje,

het gaat over DirectInput MouseInput.

Wat Insiej deed met MouseInput is volgens mij nogal“oud” (no offense).

Dus hier komt mijn versie van “De Muis”……

 

 

LET OP! :: ik ga een aparte class maken, je kan natuurlijk ook die van Insiej gebruiken.   Wat je nodig gaat hebben:

 

L i b s:

dinput8.lib

 

H e a d e r s:

dinput8.h

fstream.h

 

Laten we maar ff beginnen:

 
// Cinput.h //
 
// i n c l u d e s
#include “dinput8.h”
#include “fstream.h”
 
// d e f i n e s
#define LOG( obj , msg ) if( obj.is_open ){ log<<msg; }                     // Om veilig loggen
#define SAFERELEASE( pObj ) if( pObj ){ pObj->Release; pObj=NULL; }         // Om veilig af te sluiten
#define KEYDOWN( buf , key ) buf[ key ] &0x80 ? true : false                // kijken of een toets is ingedrukt
 
// c o d e
class CDirectInput{
 
public:
CDirectInput();                       // Constructor
~CDirectInput();                              // Destructor  
int DirectInputInit();                // Init DirectInput
int GetMouseState();                  // Slaat bewegingen op
int ProcessMouseInput();              // Reageert op de bewegingen
 
private:
LPDIRECTINPUT lpDI;                   // zie tut van Inseij voor meer info
LPDIRECTINPUTDEVICE lpMouseDevice;    // zie tut van Insiej voor meer info
HRESULT dxrval;                       // error checken
fstream log;                          // nog meer error checken
DIMOUSESTATE mousestate;              // oei! dit is nieuw , het is een STRUCT om je bewegingen erin op te slaan  
 
};
 
 

typedef struct DIMOUSESTATE {

    LONG lX;                   // afstand (sinds vorig opname ) dat de muis op de X as heeft gemaakt – NIET DE POSITIE

    LONG lY;                   // afstand (sinds vorig opname ) dat de muis op de Y as heeft gemaakt – NIET DE POSITIE

    LONG lZ;                   // afstand (sinds vorig opname ) dat de muiswiel heeft gemaakt – NIET DE POSITIE

   BYTE rgbButtons[4];         // knoppen van de muis… 0 = LB , 1 = RB , 2 = (klikbare) MB…

} DIMOUSESTATE, *LPDIMOUSESTATE;

Okidoki, dit is gewoon onze struct om bewegingen in op te slaan. LET OP! je hoeft het niet in je source te schrijven want dit hoort bij DINPUT8.H~!!!

 
 

Dit is onze class. Zoals je ziet gaan we onze errors loggen! Joepie!

Ff de funties vullen, k?

 

// Cinput.cpp //
 
// i n c l u d e s
#include “Cinput.h”
 
// c o d e
CDirectInput::CDirectInput(){
        
        this->lpDI = NULL;
        this->lpMouseDevice = NULL;
        dxrval = 0;
        log.open(“log.txt” , ios::trunc | ios::app);
        LOG( log , “-----Constructor-----Worked-----\n\n” )
 
}
 
CDirectInput::~CDirectInput(){
        
        lpMouseDevice->Unaquire();
        SAFERELEASE( lpDI )
        SAFERELEASE( lpMouseDevice )
        dxrval = 0;
        LOG( log , “\n-----Destructor-----Worked-----\n” )
        log.close();
 
}
 
int CDirectInput::DirectInputInit(){
 
        dxrval = DirectInputCreate( hInst , DIRECTINPUT_VERSION , &lpDI , NULL );
 
        if( dxrval != NULL ){
               LOG( log , “1) DirectInputCreate() worked J\n” )
        }else{  return 0;   }
 
        dxrval = lpDI->CreateDevice( GUID_SysMouse , &lpMouseDevice , NULL);
 
        if( dxrval != NULL ){
               LOG( log , “2) CreateDevice() worked J\n” )
        }else{  return 0;   }
 
        dxrval = lpMouse->SetDataFormat( &c_dfDIMouse2 );
 
        if( dxrval != NULL ){
               LOG( log , “3) SetDataFormat() worked J\n” )
        }else{  return 0;   }
 
        dxrval = lpMouse->SetCooperativeLevel( hWnd, DISCL_FOREGROUND | DISCL_EXCLUSIVE); 
 
        if( dxrval != NULL ){
               LOG( log , “4) SetCooperativeLevel() worked J\n” )
        }else{  return 0;   }
 
        dxrval = lpMouse->Acquire();
 
        if( dxrval != NULL ){
               LOG( log , “5) Acquire() worked J\n” )
        }else{  return 0;   }
 
        return 1;
}
 
int CDirectInput::GetMouseState(){
 
        this->lpMouseDevice->GetDeviceState( sizeof(this->mousestate) , (LPVOID)&this->mousestate);
 
}
 
int CDirectInput::ProcessMouseInput(){
 
        if( KEYDOWN( mousestate , mousestate.rgbButtons[0] )){
               PostQuitMessage(0);
               Return 0;
        }
        return 1;
}
 
 

Zozo!

We zijn alweer bijna klaar, ff wat uitleg...

De Constructor zorgt voor een veilige start en een log-object met log-file.

De Destructor zorgt voor een veilig einde.

De Init functie initialiseert DirectInput en maakt een bruikbare MouseDevice.

De GetState functie neemt de bewegingen op die de muis maakt.

De ProcessInput functie kan je zelf nog wijzigen. Het gaat bij KEYDOWN erom, dat je eerst een buffer invult, zoals een DIMOUSESTATE bij ons dus ‘mousestate’, daarna een key die gedrukt zou kunnen zijn: mousestate.rgbButtons[0] = onze linkermuis knoppie!

 

KLAAR!!! Finished! Ga nu nog een beetje experimenteren en go to the Forum voor vragen… Rick_rackplayer@hotmail.com… Smell ya later!

 

Next Time On VampireStudios: Win32 Mouse Position!