#define BUFFER_SIZE 16 class Input { public: /* Input::InputType species which type of Input object to create */ enum InputType { INPUT_UNKNOWN = 0, INPUT_MS = 1, INPUT_DX = 2, }; /* Input::InputType species which type of Input object to create */ enum ActionType { ACTION_UNKNOWN = -1, ACTION_WALK = 0, ACTION_RUN = 1, ACTION_BACK = 2, ACTION_LEFT = 3, ACTION_RIGHT = 4, ACTION_JUMP = 5, ACTION_CROUCH = 6, ACTION_STAND = 7, }; /* Input::KeyType enumerates all possible keys */ enum KeyType { KEY_ESCAPE, KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, KEY_F11, KEY_F12, KEY_PRNTSCN, KEY_SCRLCK, KEY_PAUSE, KEY_ACCENT, KEY_1, KEY_2, KEY_3, KEY_4, KEY_5, KEY_6, KEY_7, KEY_8, KEY_9, KEY_0, KEY_MINUS, KEY_EQUALS, KEY_BACKSPACE, KEY_INSERT, KEY_HOME, KEY_PAGEUP, KEY_KEYPAD_NUMLOCK, KEY_KEYPAD_DIVIDE, KEY_KEYPAD_MULTIPLY, KEY_KEYPAD_SUBTRACT, KEY_TAB, KEY_Q, KEY_W, KEY_E, KEY_R, KEY_T, KEY_Y, KEY_U, KEY_I, KEY_O, KEY_P, KEY_BRACKETL, KEY_BRACKETR, KEY_BACKSLASH, KEY_DELETE, KEY_END, KEY_PAGEDOWN, KEY_KEYPAD_7, KEY_KEYPAD_8, KEY_KEYPAD_9, KEY_KEYPAD_ADD, KEY_CAPSLOCK, KEY_A, KEY_S, KEY_D, KEY_F, KEY_G, KEY_H, KEY_J, KEY_K, KEY_L, KEY_SEMICOLON, KEY_QUOTE, KEY_ENTER, KEY_KEYPAD_4, KEY_KEYPAD_5, KEY_KEYPAD_6, KEY_SHIFTL, KEY_Z, KEY_X, KEY_C, KEY_V, KEY_B, KEY_N, KEY_M, KEY_COMMA, KEY_PERIOD, KEY_FORWARDSLASH, KEY_SHIFTR, KEY_UP, KEY_KEYPAD_1, KEY_KEYPAD_2, KEY_KEYPAD_3, KEY_KEYPAD_ENTER, KEY_CONTROLL, KEY_WINDOWSL, KEY_ALTL, KEY_SPACE, KEY_ALTR, KEY_WINDOWSR, KEY_CONTROLR, KEY_LEFT, KEY_DOWN, KEY_RIGHT, KEY_KEYPAD_0, KEY_KEYPAD_PERIOD, KEY_MB0, KEY_MB1, KEY_MB2, KEY_MB3, KEY_MB4, KEY_MB5, KEY_MB6, KEY_MB7, KEY_UNKNOWN, KEY_AMOUNT }; struct Action { ActionType m_enmType; bool m_blnOn; }; struct KeyChange { KeyType m_enmKey; bool m_blnDown; }; private: struct ActionInfo { ActionType m_enmType; KeyType * m_ptrKeys; unsigned char m_uchrKeys; }; UTIL::Array m_clsActions; protected: bool m_blnKeys[KEY_AMOUNT]; unsigned int * m_ptrActionIndices[KEY_AMOUNT]; virtual bool Sync(KeyChange * Changes, unsigned int & Amount, ASW::Point3i & MouseMovement) = 0; public: Input() { memset(&m_blnKeys, 0, KEY_AMOUNT * sizeof(bool)); memset(&m_ptrActionIndices, 0, KEY_AMOUNT * sizeof(unsigned int *)); } virtual bool Acquire(void) = 0; static Input * Create(const InputType Type, ASW::Window * WindowRef); virtual void Finish(void) = 0; bool Get(Action * Actions, unsigned int & Amount, ASW::Point3i & MouseMovement); virtual bool Init(ASW::Window * WindowRef) = 0; bool Set(const ActionType Type, const KeyType * Keys, const unsigned char Amount); };