Code archives/User Input/User input system

This code has been declared by its author to be Public Domain code.

Download source code

User input system by eBusiness2004
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.
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

Comments

None.

Code Archives Forum