Code archives/User Input/Human Interface Lib
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| A very basic system for handling input presses. Simple enough to use - read the comments! :) | |||||
; -----------------------------------------------------------------------------------------------------
;
; The NuClear Fusion Game Engine
; Human Interface Library
;
; -----------------------------------------------------------------------------------------------------
;
; This library is the support for input. It allows better input of devices than blitz supports because
; the hit mouse buttons, joystick buttons or keyboard kets are stored until the next HINT_Update is
; called.
;
; Usage
; Usage of this library is simple. You first define which keys do what using the HIO_DefineAction
; function (allows for keyboard, joystick and mouse support) and then at the end, or start of every
; loop call 'HINT_Update.' Now, you can use HINT_CheckAction to check
; an action.
;
; Thanks to..
; Andreas|Blixt - Nice simple XML loading, taken from a verlet 2D demo you made.
;
; -----------------------------------------------------------------------------------------------------
Global HINT_Version$ = "1.0.00"
Const HINT_INPUTTYPE_MOUSE = 1
Const HINT_INPUTTYPE_KEYBOARD = 2
Const HINT_INPUTTYPE_JOYSTICK = 3
Const HINT_MODE_UP = 0
Const HINT_MODE_HIT = 1
Const HINT_MODE_DOWN = 2
Const HINT_MODE_RELEASE = 3
Dim HINT_Keys(237)
Type HINT_Action
Field Name$
Field Key
Field DownMode
Field ActionType
End Type
; -----------------------------------------------------------------------------------------------------
; These functions are used for the human interface library
; -----------------------------------------------------------------------------------------------------
Function HINT_CheckAction(Name$)
Local Action.HINT_Action = HINT_FindAction_Name(Name)
Return Action\DownMode
End Function
Function HINT_DefineAction(Name$, ActionCode, ActionType = HINT_INPUTTYPE_KEYBOARD)
Local Action.HINT_Action = New HINT_Action
Action\Name = Name
Action\Key = ActionCode
Action\ActionType = ActionType
End Function
Function HINT_FindAction_Name.HINT_Action(Name$)
Local Action.HINT_Action
For Action = Each HINT_Action
If Action\Name = Name Then Return Action
Next
End Function
Function HINT_Update()
Local Action.HINT_Action
For Action = Each HINT_Action
Select Action\ActionType
Case HINT_INPUTTYPE_MOUSE
Select Action\DownMode
Case HINT_MODE_UP If MouseDown(Action\Key) Then Action\DownMode = HINT_MODE_HIT
Case HINT_MODE_HIT If MouseDown(Action\Key) Then Action\DownMode = HINT_MODE_DOWN Else Action\DownMode = HINT_MODE_UP
Case HINT_MODE_DOWN If Not MouseDown(Action\Key) Then Action\DownMode = HINT_MODE_RELEASE
Case HINT_MODE_RELEASE Action\DownMode = HINT_MODE_UP
End Select
End Select
Next
End Function
; -----------------------------------------------------------------------------------------------------
; These functions are used for loading human interface data from config files (in xml format)
; -----------------------------------------------------------------------------------------------------
Function HINT_XML_GetAttribute$(xmlline$,attr$)
Local pos1%,pos2%,temp$,name$,value$
If Left(xmlline,1) <> "<" Or Right(xmlline,1) <> ">" Then Return ""
xmlline = Mid(xmlline,2,Len(xmlline) - 2)
attr = Lower(attr)
pos2 = Instr(xmlline," ")
Repeat
pos1 = pos2
pos2 = Instr(xmlline," ",pos1 + 1)
If pos1 > 0 And pos2 = 0
pos2 = Len(xmlline)
While Mid(xmlline,pos2,1) <> Chr(34)
If pos2 <= 1 Then Exit
pos2 = pos2 - 1
Wend
pos2 = pos2 + 1
ElseIf pos1 = 0 And pos2 = 0
Exit
EndIf
temp = Mid(xmlline,pos1 + 1,pos2 - pos1 - 2)
If Instr(temp,"=")
name = Left(temp,Instr(temp,"=") - 1)
value = Mid(temp,Instr(temp,"=") + 2)
If Lower(name) = attr Then Return value
EndIf
Forever
Return ""
End Function
Function HINT_XML_GetTag$(ParseString$)
Local Pos
ParseString = Trim(ParseString)
; Check its valid
If Left(ParseString, 1) <> "<" Or Right(ParseString, 1) <> ">" Then Return ""
If Len(ParseString) < 3 Then Return ""
; Get where the end of the tag is.
Pos = Instr(ParseString, " ")
If Pos = 0 Or Pos > Instr(ParseString, ">") Then Pos = Instr(ParseString, ">")
If Pos = 0 Then Return ""
; Return the tag name
Return Lower$(Mid$(ParseString, 2, Pos - 2))
End Function
Function HINT_XML_LoadConfig(File$)
Local FilePointer, CurrentLine$, Action.HINT_Action
FilePointer = OpenFile(File)
If FilePointer = 0 Then DebugLog "[ Human Interface Error!!! XML Loading ] The requested file cannot be accessed, check its existance. '" + File + "'": Return False
While Not Eof(FilePointer)
CurrentLine = ReadLine(FilePointer)
DebugLog HINT_XML_GetTag(CurrentLine)
Select HINT_XML_GetTag(CurrentLine)
Case "keyboardkey"
Action = New HINT_Action
Action\Name = HINT_XML_GetAttribute(CurrentLine, "Name")
Action\Key = HINT_XML_GetAttribute(CurrentLine, "Keycode")
Action\ActionType = HINT_INPUTTYPE_KEYBOARD
Case "mousebutton"
Action = New HINT_Action
Action\Name = HINT_XML_GetAttribute(CurrentLine, "Name")
Action\Key = HINT_XML_GetAttribute(CurrentLine, "Mousebutton")
Action\ActionType = HINT_INPUTTYPE_MOUSE
Case "joystick"
Action = New HINT_Action
Action\Name = HINT_XML_GetAttribute(CurrentLine, "Name")
Action\Key = HINT_XML_GetAttribute(CurrentLine, "Joybutton")
Action\ActionType = HINT_INPUTTYPE_JOYSTICK
End Select
Wend
End Function
Function HINT_XML_SaveConfig(File$)
Local FilePointer, CurrentLine$, Action.HINT_Action
FilePointer = WriteFile(File)
If FilePointer = 0 Then DebugLog "[ Human Interface Error!!! XML Loading ] The requested file cannot be accessed, check its existance and write propeties. '" + File + "'": Return False
For Action = Each HINT_Action
Select Action\ActionType
Case HINT_INPUTTYPE_MOUSE WriteLine FilePointer, "<MouseButton Name=" + Chr(34) + Action\Name + Chr(34) + " MouseButton=" + Chr(34) + Action\Key + Chr(34) + ">"
Case HINT_INPUTTYPE_KEYBOARD WriteLine FilePointer, "<Keyboard Name=" + Chr(34) + Action\Name + Chr(34) + " Keycode" + Chr(34) + Action\Key + Chr(34) + ">"
Case HINT_INPUTTYPE_KEYBOARD WriteLine FilePointer, "<Joystick Name=" + Chr(34) + Action\Name + Chr(34) + " Joybutton" + Chr(34) + Action\Key + Chr(34) + ">"
End Select
Next
End Function
; -----------------------------------------------------------------------------------------------------
; -----------------------------------------------------------------------------------------------------
; -----------------------------------------------------------------------------------------------------
; Example
SetBuffer BackBuffer()
Stop
HINT_XML_LoadConfig("Test.Config")
While Not KeyHit(1)
Cls
For a.hint_action = Each hint_action
Text 0, y, a\name
Next
;Stop
HINT_Update
;If HINT_CheckAction("Click") = 3 Then RuntimeError ""
Flip
Wend |
Comments
None.
Code Archives Forum