Files
sml-projects/shell/input-state.sml

67 lines
1.7 KiB
Standard ML

structure InputState =
struct
(* global state detecting button inputs *)
val state =
{ leftHeld = ref false
, rightHeld = ref false
, upHeld = ref false
, downHeld = ref false
}
fun getSnapshot () =
{ leftHeld = !(#leftHeld state)
, rightHeld = !(#rightHeld state)
, upHeld = !(#upHeld state)
, downHeld = !(#downHeld state)
}
fun getPlayerXAxis () =
let
val lh = #leftHeld state
val rh = #rightHeld state
open Player
in
case (!lh, !rh) of
(false, false) => STAY_STILL
| (false, true) => MOVE_RIGHT
| (true, false) => MOVE_LEFT
| (true, true) => STAY_STILL
end
open Input
fun handleKey (key, action) =
if key = ARROW_UP then
if action = PRESS then (#upHeld state) := true
else if action = RELEASE then (#upHeld state) := false
else ()
else if key = ARROW_DOWN then
if action = PRESS then (#downHeld state) := true
else if action = RELEASE then (#downHeld state) := false
else ()
else if key = ARROW_LEFT then
if action = PRESS then (#leftHeld state) := true
else if action = RELEASE then (#leftHeld state) := false
else ()
else if key = ARROW_RIGHT then
if action = PRESS then (#rightHeld state) := true
else if action = RELEASE then (#rightHeld state) := false
else ()
else
()
fun keyCallback (key, scancode, action, mods) =
let open Input
in if mods = 0 then handleKey (key, action) else ()
end
fun registerCallbacks window =
let
val () = Input.exportKeyCallback keyCallback
val () = Input.setKeyCallback window
in
()
end
end