The-Simpsons-Hit-and-Run/game/code/input/RealController.h

131 lines
4.4 KiB
C++

/******************************************************************************
File: RealController.h
Desc: Interface for the RealController class.
- RealController essentially is a physical controller class.
- a wrapper around IRadController.
Date: May 16, 2003
History:
*****************************************************************************/
#ifndef REALCONTROLLER_H
#define REALCONTROLLER_H
//========================================
// System Includes
//========================================
#include <radcontroller.hpp>
#include <list>
using namespace std;
//========================================
// Nested Includes
//========================================
#include <input/controller.h>
#include <input/mapper.h>
#include <input/virtualinputs.hpp>
class UserController;
/*****************************************
Some typedefs for convienince
****************************************/
typedef ref< IRadController > RADCONTROLLER;
typedef list< IRadControllerInputPoint* > RADINPUTPOINTLIST;
typedef list< IRadControllerInputPoint* >::iterator INPUTPOINTITER;
//=============================================================================
// Enumerations
//=============================================================================
// Types of real controllers.
enum eControllerType
{
GAMEPAD = 0, // gamepad/joystick
KEYBOARD,
MOUSE,
STEERINGWHEEL,
NUM_CONTROLLERTYPES
};
// Directions which inputs can process.
enum eDirectionType
{
DIR_UP = 0,
DIR_DOWN,
DIR_RIGHT,
DIR_LEFT,
NUM_DIRTYPES
};
//=============================================================================
// Class: RealController
//=============================================================================
//
// Description: The base class for every device plugged in to receive input
// from the user. There is one instance for each keyboard, mouse,
// gamepad...
//
//=============================================================================
class RealController
{
public:
RealController( eControllerType type );
virtual ~RealController();
RADCONTROLLER getController() const { return m_radController; }
bool IsConnected() const { return m_bConnected; }
void Connect() { m_bConnected = true; }
void Disconnect() { m_bConnected = false; }
eControllerType ControllerType() const { return m_eControllerType; }
void Init( IRadController* pController );
void Release();
// Return true if the dxKey is one of the following types of inputs.
virtual bool IsInputAxis( int dxKey ) const;
virtual bool IsMouseAxis( int dxKey ) const;
virtual bool IsPovHat( int dxKey ) const;
// Returns true if this is a valid input for the controller.
virtual bool IsValidInput( int dxKey ) const = 0;
// Returns true if the key is banned for mapping.
virtual bool IsBannedInput( int dxKey ) const;
// Sets up a mapping from a dxkey/direction to a virtual button
virtual bool SetMap( int dxKey, eDirectionType dir, int virtualButton ) = 0;
// Retrieves the virtual button of the given type mapped to a dxKey, direction
virtual int GetMap( int dxKey, eDirectionType dir, eMapType map ) const = 0;
// Clears the specified mapping so it no longer exists.
virtual void ClearMap( int dxKey, eDirectionType dir, int virtualButton ) = 0;
// Clears all the cached mappings.
virtual void ClearMappedButtons() = 0;
// Returns the name of the input.
const char* GetInputName( int dxKey ) const;
// Store & release registered input points.
void AddInputPoints( IRadControllerInputPoint* pInputPoint );
void ReleaseInputPoints( UserController* parent );
// Returns the direct input code representing a given input point for
// the controller, or Input::INVALID_CONTROLLERID if the i.p. doesn't exist.
int GetDICode( int inputpoint ) const;
protected:
// Sets up an input point index -> direct input keycode map for the
// controller in m_InputToDICode. Called automatically by Init().
virtual void MapInputToDICode() = 0;
protected:
RADCONTROLLER m_radController;
bool m_bConnected;
eControllerType m_eControllerType;
RADINPUTPOINTLIST m_inputPointList;
int* m_InputToDICode;
int m_numInputPoints;
};
#endif