Graphics 640,480
;A dynamic system for getting user input from keyboard, mouse and a simple joystick
;Written by Jacob Christian Munch-Andersen
;Copy the Initialization to the beginning of your code, then decide how many inputs you want to use,
;this can always be changed later. Also copy the six function to anywhere in your code.
;In order to configure an input, first run the preidsconfigure function, then run the
;idsconfigure function, with the id number of the input that you want to configure as parameter,
;in a loop, untill it return 0, this will happen when the user make an input.
;The hit and down functions work almost like the Blitz Basic Hit and Down function families,
;A difference is that the down function will return values depending on how much the user push the
;joystick, or how far the user have moved the mouse since last check. Check the array
;keynames$(input id) to get the name of a key/input, this should work almost correctly with any
;keyboard, you can alter the keynames if you like. The save and load functions will save/load all
;input settings, you can pass a filename/path yourself, or use the default.
;This code is public domain, you can use it, alter it and pass it to others, free of charge.
;Initialization
Global key_num=4 ;How many inputs do you need?
Dim ids(1,key_num)
Dim keynames$(key_num)
Global mx_keys
Global my_keys
Global mz_keys
Global last_mouse_x_pos
Global last_mouse_y_pos
Global last_mouse_z_pos
Global last_mouse_x_neg
Global last_mouse_y_neg
Global last_mouse_z_neg
Global last_mouse_x_hitp
Global last_mouse_y_hitp
Global last_mouse_x_hitn
Global last_mouse_y_hitn
Global mouse_factor_x#=1.0
Global mouse_factor_y#=1.0
Global mouse_factor_z#=1.0
Global joystick_factor_x#=1.0
Global joystick_factor_y#=1.0
Dim joystick_minmax#(7)
joystick_minmax(0)=-.08
joystick_minmax(1)=-.8
joystick_minmax(2)=.08
joystick_minmax(3)=.8
joystick_minmax(4)=-.08
joystick_minmax(5)=-.8
joystick_minmax(6)=.08
joystick_minmax(7)=.8
Dim joy_dir_list(3)
;End of initialization
;Demo code
For a=0 To key_num
Write "Key "+a+" = "
b=-1
preidsconfigure()
While b=-1
b=idsconfigure(a)
Wend
Print keynames$(a)
Next
While Not KeyDown(1)
For a=0 To key_num
If hit(a) Print a+" "+down#(0)
Next
Delay 30
Wend
End
Function save_key_settings(file$="keysettings.dat")
filehandle=WriteFile(file$)
If filehandle=0 Then Return 0
WriteFloat filehandle,mouse_factor_x#
WriteFloat filehandle,mouse_factor_y#
WriteFloat filehandle,mouse_factor_z#
WriteFloat filehandle,joystick_factor_x#
WriteFloat filehandle,joystick_factor_y#
For a_keys=0 To 7
WriteFloat filehandle,joystick_minmax(a_keys)
Next
For a_keys=0 To key_num
WriteInt filehandle,ids(0,a_keys)
WriteInt filehandle,ids(1,a_keys)
WriteString filehandle,keynames(a_keys)
Next
CloseFile filehandle
Return 1
End Function
Function load_key_settings(file$="keysettings.dat")
filehandle=ReadFile(file$)
If filehandle=0 Then Return 0
mouse_factor_x#=ReadFloat(filehandle)
mouse_factor_y#=ReadFloat(filehandle)
mouse_factor_z#=ReadFloat(filehandle)
joystick_factor_x#=ReadFloat(filehandle)
joystick_factor_y#=ReadFloat(filehandle)
For a_keys=0 To 7
joystick_minmax(a_keys)=ReadFloat(filehandle)
Next
For a_keys=0 To key_num
ids(0,a_keys)=ReadInt(filehandle)
ids(1,a_keys)=ReadInt(filehandle)
keynames(a_keys)=ReadString(filehandle)
Next
CloseFile filehandle
Return 1
End Function
Function hit(id)
If ids(0,id)=0 Then
Return KeyHit(ids(1,id))
Else If ids(0,id)=1 Then
Return MouseHit(ids(1,id))
Else If ids(0,id)=2 Then
Return JoyHit(ids(1,id))
Else If ids(0,id)=3 Then
If ids(1,id)=0 Then
a_keys=MouseX()-last_mouse_x_hitn
If a_keys<-20 Then
last_mouse_x_hitn=MouseX()
Return 1
Else If a_keys>20 Then
last_mouse_x_hitn=MouseX()
Return 0
Else
Return 0
End If
Else If ids(1,id)=1 Then
a_keys=MouseX()-last_mouse_x_hitp
If a_keys>20 Then
last_mouse_x_hitp=MouseX()
Return 1
Else If a_keys<-20 Then
last_mouse_x_hitp=MouseX()
Return 0
Else
Return 0
End If
Else If ids(1,id)=2 Then
a_keys=MouseY()-last_mouse_y_hitn
If a_keys<-20 Then
last_mouse_y_hitn=MouseY()
Return 1
Else If a_keys>20 Then
last_mouse_y_hitn=MouseY()
Return 0
Else
Return 0
End If
Else If ids(1,id)=3 Then
a_keys=MouseY()-last_mouse_y_hitp
If a_keys>20 Then
last_mouse_y_hitp=MouseY()
Return 1
Else If a_keys<-20 Then
last_mouse_y_hitp=MouseY()
Return 0
Else
Return 0
End If
Else If ids(1,id)=4 Then
a_keys=MouseZ()-last_mouse_z_neg
last_mouse_z_neg=MouseZ()
If a_keys<0 Then
Return 1
Else
Return 0
End If
Else If ids(1,id)=5 Then
a_keys=MouseZ()-last_mouse_z_pos
last_mouse_z_pos=MouseZ()
If a_keys>0 Then
Return 1
Else
Return 0
End If
Else If ids(1,id)=6
If JoyXDir()=-1 Then
If joy_dir_list(0)=1 Then
Return 0
Else
joy_dir_list(0)=1
Return 1
End If
Else
joy_dir_list(0)=0
Return 0
End If
Else If ids(1,id)=7
If JoyXDir()=1 Then
If joy_dir_list(1)=1 Then
Return 0
Else
joy_dir_list(1)=1
Return 1
End If
Else
joy_dir_list(1)=0
Return 0
End If
Else If ids(1,id)=8
If JoyYDir()=-1 Then
If joy_dir_list(2)=1 Then
Return 0
Else
joy_dir_list(2)=1
Return 1
End If
Else
joy_dir_list(2)=0
Return 0
End If
Else If ids(1,id)=9
If JoyYDir()=1 Then
If joy_dir_list(3)=1 Then
Return 0
Else
joy_dir_list(3)=1
Return 1
End If
Else
joy_dir_list(3)=0
Return 0
End If
End If
End If
End Function
Function down#(id)
If ids(0,id)=0 Then
Return KeyDown(ids(1,id))
Else If ids(0,id)=1 Then
Return MouseDown(ids(1,id))
Else If ids(0,id)=2 Then
Return JoyDown(ids(1,id))
Else If ids(0,id)=3 Then
If ids(1,id)=0 Then
a_keys=MouseX()-last_mouse_x_neg
last_mouse_x_neg=MouseX()
If a_keys<0 Then
Return -a_keys*mouse_factor_x#
Else
Return 0
End If
Else If ids(1,id)=1 Then
a_keys=MouseX()-last_mouse_x_pos
last_mouse_x_pos=MouseX()
If a_keys>0 Then
Return a_keys*mouse_factor_x#
Else
Return 0
End If
Else If ids(1,id)=2 Then
a_keys=MouseY()-last_mouse_y_neg
last_mouse_y_neg=MouseY()
If a_keys<0 Then
Return -a_keys*mouse_factor_y#
Else
Return 0
End If
Else If ids(1,id)=3 Then
a_keys=MouseY()-last_mouse_y_pos
last_mouse_y_pos=MouseY()
If a_keys>0 Then
Return a_keys*mouse_factor_y#
Else
Return 0
End If
Else If ids(1,id)=4 Then
a_keys=MouseZ()-last_mouse_z_neg
last_mouse_z_neg=MouseZ()
If a_keys<0 Then
Return -a_keys*mouse_factor_z#
Else
Return 0
End If
Else If ids(1,id)=5 Then
a_keys=MouseZ()-last_mouse_z_pos
last_mouse_z_pos=MouseZ()
If a_keys>0 Then
Return a_keys*mouse_factor_z#
Else
Return 0
End If
Else If ids(1,id)=6 Then
a_keyss#=JoyX()
If a_keyss>joystick_minmax(0) Then
Return 0
Else If a_keyss>joystick_minmax(1) Then
Return joystick_factor_x*(joystick_minmax(0)-a_keyss)/(joystick_minmax(0)-joystick_minmax(1))
Else
Return 1
End If
Else If ids(1,id)=7 Then
a_keyss#=JoyX()
If a_keyss<joystick_minmax(2) Then
Return 0
Else If a_keyss<joystick_minmax(3) Then
Return joystick_factor_x*(joystick_minmax(2)-a_keyss)/(joystick_minmax(2)-joystick_minmax(3))
Else
Return 1
End If
Else If ids(1,id)=8 Then
a_keyss#=JoyY()
If a_keyss>joystick_minmax(4) Then
Return 0
Else If a_keyss>joystick_minmax(5) Then
Return joystick_factor_y*(joystick_minmax(4)-a_keyss)/(joystick_minmax(4)-joystick_minmax(5))
Else
Return 1
End If
Else If ids(1,id)=9 Then
a_keyss#=JoyY()
If a_keyss<joystick_minmax(6) Then
Return 0
Else If a_keyss<joystick_minmax(7) Then
Return joystick_factor_y*(joystick_minmax(6)-a_keyss)/(joystick_minmax(6)-joystick_minmax(7))
Else
Return 1
End If
End If
End If
End Function
Function preidsconfigure()
FlushKeys
FlushMouse
MoveMouse(GraphicsWidth()/2,GraphicsHeight()/2) ;Optionanl
mx_keys=MouseX()
my_keys=MouseY()
mz_keys=MouseZ()
joy_dir_list(0)=(JoyXDir()=-1)
joy_dir_list(1)=(JoyXDir()=1)
joy_dir_list(2)=(JoyYDir()=-1)
joy_dir_list(3)=(JoyYDir()=1)
End Function
Function idsconfigure(id)
; Repeat
If JoyXDir()<>-1 Then joy_dir_list(0)=0
If JoyXDir()<>1 Then joy_dir_list(1)=0
If JoyYDir()<>-1 Then joy_dir_list(2)=0
If JoyYDir()<>1 Then joy_dir_list(3)=0
If MouseX()-mx_keys<-50 Then
ids(0,id)=3
ids(1,id)=0
keynames(id)="Move Mouse Left"
Return
Else If MouseX()-mx_keys>50 Then
ids(0,id)=3
ids(1,id)=1
keynames(id)="Move Mouse Right"
Return
Else If MouseY()-my_keys<-50 Then
ids(0,id)=3
ids(1,id)=2
keynames(id)="Move Mouse Up"
Return
Else If MouseY()-my_keys>50 Then
ids(0,id)=3
ids(1,id)=3
keynames(id)="Move Mouse Down"
Return
Else If MouseZ()-mz_keys<0 Then
ids(0,id)=3
ids(1,id)=4
keynames(id)="Roll Whell Backward"
Return
Else If MouseZ()-mz_keys>0 Then
ids(0,id)=3
ids(1,id)=5
keynames(id)="Roll Whell Forward"
Return
Else If JoyXDir()=-1 And joy_dir_list(0)=0 Then
ids(0,id)=3
ids(1,id)=6
keynames(id)="Joystick Left"
Return
Else If JoyXDir()=1 And joy_dir_list(1)=0 Then
ids(0,id)=3
ids(1,id)=7
keynames(id)="Joystick Right"
Return
Else If JoyYDir()=-1 And joy_dir_list(2)=0 Then
ids(0,id)=3
ids(1,id)=8
keynames(id)="Joystick Up"
Return
Else If JoyYDir()=1 And joy_dir_list(3)=0 Then
ids(0,id)=3
ids(1,id)=9
keynames(id)="Joystick Down"
Return
End If
For a=0 To 255
If KeyHit(a) Then
ids(0,id)=0
ids(1,id)=a
keys_midvar=GetKey()
; If keys_midvar=0 Or a=57 Or a>70 And a<84 Or a=55 Or a=181 Or 1=1 Then
If a=1 Then
keynames(id)="Escape"
Else If a=15 Then
keynames(id)="Tab"
Else If a=58 Then
keynames(id)="Caps Lock"
Else If a=42 Then
keynames(id)="Left Shift"
Else If a=29 Then
keynames(id)="Left Control"
Else If a=219 Then
keynames(id)="Left Start"
Else If a=56 Then
keynames(id)="Left Alt"
Else If a=57 Then
keynames(id)="Space"
Else If a=184 Then
keynames(id)="Right Alt Gr"
Else If a=220 Then
keynames(id)="Right Start"
Else If a=221 Then
keynames(id)="Menu Button"
Else If a=157 Then
keynames(id)="Right Control"
Else If a=54 Then
keynames(id)="Right Shift"
Else If a=28 Then
keynames(id)="Enter"
Else If a=14 Then
keynames(id)="Backspace"
Else If a=59 Then
keynames(id)="F1"
Else If a=60 Then
keynames(id)="F2"
Else If a=61 Then
keynames(id)="F3"
Else If a=62 Then
keynames(id)="F4"
Else If a=63 Then
keynames(id)="F5"
Else If a=64 Then
keynames(id)="F6"
Else If a=65 Then
keynames(id)="F7"
Else If a=66 Then
keynames(id)="F8"
Else If a=67 Then
keynames(id)="F9"
Else If a=68 Then
keynames(id)="F10"
Else If a=87 Then
keynames(id)="F11"
Else If a=88 Then
keynames(id)="F12"
Else If a=183 Then
keynames(id)="Print Screen"
Else If a=70 Then
keynames(id)="Pause"
Else If a=197 Then
keynames(id)="Num Lock"
Else If a=210 Then
keynames(id)="Insert"
Else If a=199 Then
keynames(id)="Home"
Else If a=201 Then
keynames(id)="Page Up"
Else If a=211 Then
keynames(id)="Delete"
Else If a=207 Then
keynames(id)="End"
Else If a=209 Then
keynames(id)="Page Down"
Else If a=200 Then
keynames(id)="Arrow Up"
Else If a=203 Then
keynames(id)="Arrow Left"
Else If a=208 Then
keynames(id)="Arrow Down"
Else If a=205 Then
keynames(id)="Arrow Right"
Else If a=69 Then
keynames(id)="Num Lock"
Else If a=181 Then
keynames(id)="Numpad /"
Else If a=55 Then
keynames(id)="Numpad *"
Else If a=71 Then
keynames(id)="Numpad 7"
Else If a=72 Then
keynames(id)="Numpad 8"
Else If a=73 Then
keynames(id)="Numpad 9"
Else If a=74 Then
keynames(id)="Numpad -"
Else If a=75 Then
keynames(id)="Numpad 4"
Else If a=76 Then
keynames(id)="Numpad 5"
Else If a=77 Then
keynames(id)="Numpad 6"
Else If a=78 Then
keynames(id)="Munpad +"
Else If a=79 Then
keynames(id)="Numpad 1"
Else If a=80 Then
keynames(id)="Numpad 2"
Else If a=81 Then
keynames(id)="Numpad 3"
Else If a=82 Then
keynames(id)="Numpad 0"
Else If a=83 Then
If keys_midvar=0 Then
keynames(id)="Numpad ."
Else
keynames(id)="Numpad "+Chr(keys_midvar)
End If
Else If a=156 Then
keynames(id)="Numpad Enter"
Else
; keynames(id)="Unknown key "+a
If keys_midvar>223 Then keys_midvar=keys_midvar-32
If keys_midvar=0 Then
keynames(id)="Unknown Key"
Else
keynames(id)=Upper(Chr(keys_midvar));+" Key"
End If
End If
; Else
; If keys_midvar>223 Then keys_midvar=keys_midvar-32
; keynames(id)=Upper(Chr(keys_midvar));+" Key"
; End If
Return
End If
Next
For a=0 To 15
If JoyHit(a) Then
ids(0,id)=2
ids(1,id)=a
keynames(id)="Joystick Button "+a
Return
End If
Next
For a=1 To 3
If MouseHit(a) Then
ids(0,id)=1
ids(1,id)=a
If a=1 Then
keynames(id)="Left Mouse Key"
Else If a=2 Then
keynames(id)="Right Mouse Key"
Else
keynames(id)="Middle Mouse Key"
End If
Return
End If
Next
; Delay 5
; Forever
Return -1
End Function