DirectInput:
Keyboard control
By: Jack Hoxley
Written: May 2000
Download:
DI_Keyboard.Zip
(12kb)
In my personal opinion; This
feature of DirectInput is only really useful to C/C++ developers; as they normally
have to write their own input code anyway. In VB we already have a certain degree
of keyboard control; although using DirectX does offer some new features and
some added control; It makes the simplest of things much more difficult. If
you just wanted to check if the space bar had been pressed; you could use 5
lines of code in the "KeyPress", "KeyDown" or "KeyUp"
procedures in a form object OR you could write out 50 lines for getting DirectInput
to do the same thing.
I'm not dicouraging you from
using DirectInput, I'm just making sure you're aware that you may not actually
need to use it. Thankfully, it isn't too difficult to use if you want to though.
NB: If you use the Win32 DLL
to create a window - as done in the Win32 Window Creation
tutorial; you will have to use DirectInput to get user input.
There are two ways of using DirectInput
Keyboard control; the first is on a loop basis, the second is by using DirectXEvent.
First off, use the DirectXEvent always. Lots of people use the first method
(including myself up to a certain point) - there are two major disadvantages
to using it though:
- If you check the keys on EVERY
loop of your game you're going to knock a fair amount of speed out of the
final product. Okay, using this method mean that you can specify the keyboards
repeat speed; but what if you're user rarely presses buttons? you could check
the keys 10,000 times between each key press - an awful waste of time.
- Missing keystrokes. This can
be a big problem on slower computers. If you set the keyboard checking speed
to 10 a second (for example) it means that a person must hold down a key for
an entire 10th of a second - may not sound long, but you get a fast typer
or someone knocking lots of keys during a crucial stage of the game and it
will really hit you. People wont be pleased with your game if they die because
you have faulty key detection. Then there is a second problem; what if the
game slows down to below 10 frames a second (when you're checking 10 times
a second) - it can mean that you miss lots of keystrokes. I think I've made
my point.
Using DirectXEvent means that
DirectX tells you when the keyboard has been changed - this way you dont have
to keep checking - it tells you, not you ask it. The DirectXEvent is raised
every time a key is pressed - you then have to work out which one. If you use
this structure; when there are lots of keys being pressed it works fine; then
if no keys are being pressed no unnecessary code is being executed. An all round
better option.
Checking the keys is also fairly
easy; like VB, DirectInput provides us with a complete set of constants to replace
the numbers. You can either use these constants (recommended) or you can refer
to keys by number. I suggest you look through this list of keys; you dont need
to remember them though. If you want to find out what they are without this
page press F2 in VB to bring up the object browser; look through the DirectX
library and you'll find a complete list of them - without descriptions though.
Note: Not all of them override
their default uses. ie, pressing the windows key will still bring up the start
menu. You cant stop it doing this (this way) but you can make it so that it
does something else as well.
DIK_A
DIK_B
DIK_C
DIK_D
DIK_E
DIK_F
DIK_G
DIK_H
DIK_I
DIK_J
DIK_K
DIK_L
DIK_M
DIK_N
DIK_O
DIK_P
DIK_Q
DIK_R
DIK_S
DIK_T
DIK_U
DIK_V
DIK_W
DIK_X
DIK_Y
DIK_Z
DIK_1
On main keyboard
DIK_2 On main keyboard
DIK_3 On main keyboard
DIK_4 On main keyboard
DIK_5 On main keyboard
DIK_6 On main keyboard
DIK_7 On main keyboard
DIK_8 On main keyboard
DIK_9 On main keyboard
DIK_0 On main keyboard
DIK_F1
DIK_F2
DIK_F3
DIK_F4
DIK_F5
DIK_F6
DIK_F7
DIK_F8
DIK_F9
DIK_F10
DIK_F11
DIK_F12
DIK_F13
DIK_F14
DIK_F15
DIK_NUMPAD0
DIK_NUMPAD1
DIK_NUMPAD2
DIK_NUMPAD3
DIK_NUMPAD4
DIK_NUMPAD5
DIK_NUMPAD6
DIK_NUMPAD7
DIK_NUMPAD8
DIK_NUMPAD9
DIK_ESCAPE
DIK_MINUS
On main keyboard
DIK_EQUALS On main keyboard
DIK_BACK BackSpace
DIK_TAB
DIK_LBRACKET [
DIK_RBRACKET ]
DIK_RETURN Enter on main keyboard
DIK_LCONTROL Left CTRL Key
DIK_SEMICOLON
DIK_APOSTROPHE
DIK_GRAVE
Grave accent (`)
DIK_LSHIFT Left SHIFT
DIK_BACKSLASH
DIK_COMMA
DIK_PERIOD On main keyboard
DIK_SLASH Forward slash (/)on main keyboard
DIK_RSHIFT Right SHIFT
DIK_MULTIPLY Asterisk on numeric keypad
DIK_LMENU Left ALT
DIK_SPACE Spacebar
DIK_CAPITAL Caps Lock
DIK_NUMLOCK
DIK_SCROLL
Scroll Lock
DIK_SUBTRACT Hyphen (minus sign) on numeric keypad
DIK_ADD Plus sign on numeric keypad
DIK_DECIMAL Period (decimal point) on numeric keypad
DIK_NUMPADENTER
DIK_RCONTROL Right CTRL key
DIK_NUMPADCOMMA Comma on NEC PC98 numeric keypad
DIK_DIVIDE Forward slash (/)on numeric keypad
DIK_SYSRQ
DIK_RMENU Right ALT
DIK_HOME
DIK_UP
Up arrow
DIK_PRIOR Page Up
DIK_LEFT Left arrow
DIK_RIGHT Right arrow
DIK_END
DIK_DOWN Down arrow
DIK_NEXT Page Down
DIK_INSERT
DIK_DELETE
DIK_LWIN
Left Windows key
DIK_RWIN Right Windows key
DIK_APPS Application key
DIK_PAUSE
You can download a working (if
overcomplicated) example from the downloads page;
or from the top of this page.
|