Code archives/User Input/Small keyboard handler
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Allows easy config of keys+very flexible key reading | |||||
;This is a little keyboard handler-I hope it is useful to someone...
;By Aaron Howald (aka Vector Viper)
;It can time key presses, releases, and holds.
;It also allows for easier keyboard configuration.
;please report back how well this works-my keyboard refuses
;to register more than 3 keys pressed at the same time,
;and no more than 5 pressed and held down at once
;also, holding down Lctrl,alt,space,altgr,Rctrl makes the left
;arrow key not register, but the other arrows still do!
;I was planning some neat weapons select by holding keys, but now...hmmm...
;(update)
;I since got a different keyboard-it CAN register any# of keys...
;uses these keycodes here
;u=200, d=208, l=203, r=205,space=57,l-alt=56 ,l ctrl=29,altgr=184,rctrl=157
Const screenwidth=640
Const screenheight=480
Const screendepth=16
Const displaymode=0;0=FS, 2=windowed
Graphics screenwidth,screenheight,screendepth,displaymode
Dim keytranslate(10)
;each slot is hard-coded function, to the program.
;the# returned is the key# attached to the function...
; 0 1 2 3 4 5 6 7 8 9 10
;tempxvalues;QUIT/MENU UP DOWN LEFT RIGHT FIRE1 FIRE2 FIRE3 FIRE4 SHIELD ?
; ESC (same ) space l-alt l-ctrl altgr rctrl
;esc=1, u=200, d=208, l=203, r=205, 57 56 29 184 157
Restore keyboard_load
.keyboard_load
Data 1,200,208,203,205,57,56,29,184,157
For x=0 To 9
Read temp
keytranslate(x)=temp
Next
Dim keyread(10);status of key assiged to the function
While KeyDown(1)=0
Flip
Cls
; put this in at the top of the main loop
For x=0 To 10 ;scan keytranslate
y=KeyDown(keytranslate(x)) ;returns 0 or 1
Select y+1
Case 1;key is NOT pressed NOW
If keyread(x)<0 Then keyread(x)=0;second cycle, set to not pressed
If keyread(x)>0 Then keyread(x)=-1;JUST released, 1st cycle
;can have more "cycles" if desired...can count from -10 to 0 say...
;can time releases too-just put these in place of the 2 above:
;If keyread(x)>0 Then keyread(x)=0
;keyread(x)=keyread(x)-1
;0 would then be the "key has changed" flag
Case 2 ;key pressed NOW
If keyread(x)<0 Then keyread(x)=0
keyread(x)=keyread(x)+1 ;times out keypress as long as held down
;actual time varies of course-sync to vblank?
End Select
Next
;General keyread values:
; 0=not pressed, 1=just pressed, 2 or more=held, -1=just released
;examples:
;If keyread(5)=-1;fire when key just released (weapons charge, or fighting game move)
;If keyread(5)>1;key is pressed,returns every cycle
;if keyread(5)=1;pressed key-returns only once!
;If keyread(5)>50 ;returns "pressed" continously after a delay
;if keyread(5)=50 ;returns "pressed" once after a delay
;if keyread(5)=1 or keyread(5)>30 ;returns once, then delay to repeating...
;I think this works very well!
;do rest of program, blah....
;show the values
For x=0 To 10
Text x*30,100,keyread(x)
Next
Wend
End |
Comments
None.
Code Archives Forum