Hi all,
On discussion with Unseen about how we would handle the keyboard routine , we pondered over the existing GDK idea of a type and dim.
TYPE KeyBoardState
Left AS LONG
Right AS LONG
Down AS LONG
Up AS LONG
CTRL AS LONG
SHIFT AS LONG
ALT AS LONG
SPACE AS LONG
ENTER AS LONG
ESC AS LONG
Num1 AS LONG
Num2 AS LONG
Num3 AS LONG
Num4 AS LONG
Num5 AS LONG
Num6 AS LONG
Num7 AS LONG
Num8 AS LONG
Num9 AS LONG
Num0 AS LONG
PLUS AS LONG
MINUS AS LONG
BACKSPACE AS LONG
TAB AS LONG
A AS LONG
B AS LONG
C AS LONG
D AS LONG
E AS LONG
F AS LONG
G AS LONG
H AS LONG
I AS LONG
J AS LONG
K AS LONG
L AS LONG
M AS LONG
N AS LONG
O AS LONG
P AS LONG
Q AS LONG
R AS LONG
S AS LONG
T AS LONG
U AS LONG
V AS LONG
W AS LONG
X AS LONG
Y AS LONG
Z AS LONG
END TYPE
SUB GDK_Keyboard_GetState (KeyboardRef AS KeyBoardState)
FOR x% = 1 TO 88 'read each key scancode from array
IF x% = 1 THEN KeyboardRef.ESC = scankey%(x%)
IF x% = 2 THEN KeyboardRef.Num1 = scankey%(x%)
IF x% = 3 THEN KeyboardRef.Num2 = scankey%(x%)
IF x% = 4 THEN KeyboardRef.Num3 = scankey%(x%)
IF x% = 5 THEN KeyboardRef.Num4 = scankey%(x%)
IF x% = 6 THEN KeyboardRef.Num5 = scankey%(x%)
IF x% = 7 THEN KeyboardRef.Num6 = scankey%(x%)
IF x% = 8 THEN KeyboardRef.Num7 = scankey%(x%)
IF x% = 9 THEN KeyboardRef.Num8 = scankey%(x%)
IF x% = 10 THEN KeyboardRef.Num9 = scankey%(x%)
IF x% = 11 THEN KeyboardRef.Num0 = scankey%(x%)
IF x% = 12 THEN KeyboardRef.PLUS = scankey%(x%)
IF x% = 13 THEN KeyboardRef.MINUS = scankey%(x%)
IF x% = 14 THEN KeyboardRef.BACKSPACE = scankey%(x%)
IF x% = 15 THEN KeyboardRef.TAB = scankey%(x%)
IF x% = 30 THEN KeyboardRef.A = scankey%(x%)
IF x% = 48 THEN KeyboardRef.B = scankey%(x%)
IF x% = 46 THEN KeyboardRef.C = scankey%(x%)
IF x% = 32 THEN KeyboardRef.D = scankey%(x%)
IF x% = 18 THEN KeyboardRef.E = scankey%(x%)
IF x% = 33 THEN KeyboardRef.F = scankey%(x%)
IF x% = 34 THEN KeyboardRef.G = scankey%(x%)
IF x% = 35 THEN KeyboardRef.H = scankey%(x%)
IF x% = 23 THEN KeyboardRef.I = scankey%(x%)
IF x% = 36 THEN KeyboardRef.J = scankey%(x%)
IF x% = 37 THEN KeyboardRef.K = scankey%(x%)
IF x% = 38 THEN KeyboardRef.L = scankey%(x%)
IF x% = 50 THEN KeyboardRef.M = scankey%(x%)
IF x% = 49 THEN KeyboardRef.N = scankey%(x%)
IF x% = 24 THEN KeyboardRef.O = scankey%(x%)
IF x% = 25 THEN KeyboardRef.P = scankey%(x%)
IF x% = 16 THEN KeyboardRef.Q = scankey%(x%)
IF x% = 19 THEN KeyboardRef.R = scankey%(x%)
IF x% = 31 THEN KeyboardRef.S = scankey%(x%)
IF x% = 20 THEN KeyboardRef.T = scankey%(x%)
IF x% = 22 THEN KeyboardRef.U = scankey%(x%)
IF x% = 47 THEN KeyboardRef.V = scankey%(x%)
IF x% = 17 THEN KeyboardRef.W = scankey%(x%)
IF x% = 45 THEN KeyboardRef.X = scankey%(x%)
IF x% = 21 THEN KeyboardRef.Y = scankey%(x%)
IF x% = 44 THEN KeyboardRef.Z = scankey%(x%)
IF x% = 72 THEN KeyboardRef.Up = scankey%(x%)
IF x% = 75 THEN KeyboardRef.Left = scankey%(x%)
IF x% = 77 THEN KeyboardRef.Right = scankey%(x%)
IF x% = 80 THEN KeyboardRef.Down = scankey%(x%)
IF x% = 28 THEN KeyboardRef.ENTER = scankey%(x%)
IF x% = 57 THEN KeyboardRef.SPACE = scankey%(x%)
IF x% = 29 THEN KeyboardRef.CTRL = scankey%(x%)
IF x% = 56 THEN KeyboardRef.ALT = scankey%(x%)
IF x% = 42 THEN KeyboardRef.SHIFT = scankey%(x%)
NEXT
END SUB
FUNCTION scankey% (scancode%)
STATIC Ready%, keyflags%()
IF NOT Ready% THEN REDIM keyflags%(0 TO 127): Ready% = -1 'the keyboard states
i% = INP(&H60)
IF (i% AND 128) THEN keyflags%(i% XOR 128) = 0
IF (i% AND 128) = 0 THEN keyflags%(i%) = -1
WHILE INKEY$ <> "": WEND
scankey% = keyflags%(scancode%)
END FUNCTION
I disclosed that i believe that Galleon's efforts with _KEYDOWN were suppose to be faster. He agreed in the sense that if its faster then we would go with that idea. And so this routine was born. Any comments?
REM KeyBoard1.bas
DEFLNG A-Z
CONST True = -1, False = 0
TYPE KeyBoardState
Left AS LONG
Right AS LONG
Down AS LONG
Up AS LONG
CTRL AS LONG
SHIFT AS LONG
ALT AS LONG
SPACE AS LONG
ENTER AS LONG
ESC AS LONG
END TYPE
DIM KeyRef AS KeyBoardState
'------------------------------------------------------------------------------------------------------------------------------------
SCREEN 12
DO
_LIMIT 30
KeyState KeyRef
LOCATE 9, 1: PRINT "Left", "Up", "Down", "Right"
LOCATE 10, 1
PRINT KeyRef.Left, KeyRef.Up, KeyRef.Down, KeyRef.Right
LOCATE 12, 1: PRINT "CTRL", "ALT", "Shift", "Space"
LOCATE 13, 1
PRINT KeyRef.CTRL, KeyRef.ALT, KeyRef.SHIFT, KeyRef.SPACE
_DISPLAY
LOOP UNTIL Done = 1
SLEEP
SYSTEM
'------------------------------------------------------------------------------------------------------------------------------------
SUB KeyState (KeyRef AS KeyBoardState)
KeyRef.ESC = _KEYDOWN(27)
KeyRef.SPACE = _KEYDOWN(32)
KeyRef.Left = _KEYDOWN(19200)
KeyRef.Right = _KEYDOWN(19712)
KeyRef.Down = _KEYDOWN(20480)
KeyRef.Up = _KEYDOWN(18432)
IF _KEYDOWN(100305) OR _KEYDOWN(100306) THEN KeyRef.CTRL = True ELSE KeyRef.CTRL = False
IF _KEYDOWN(100307) OR _KEYDOWN(100308) THEN KeyRef.ALT = True ELSE KeyRef.ALT = False
IF _KEYDOWN(100303) OR _KEYDOWN(100304) THEN KeyRef.SHIFT = True ELSE KeyRef.SHIFT = False
KeyRef.ENTER = _KEYDOWN(13)
END SUB
Compared to the existing key routine this seems it may be faster on paper. This routine can be expanded to cover more keys later. At the moment this routine treats the separate R + L shift , alt and ctrl keys as only one of each. The idea is in a game we only interested if a key is down or up and not so much which of the two keys it is. Although this can be changed later.