done with handling for gamepad's face buttons; next, handle r2 and l2 buttons

This commit is contained in:
2026-01-20 07:56:04 +00:00
parent 73d30bfb1f
commit ff33812b27

View File

@@ -5,7 +5,7 @@ struct
fun isInDeadZone (x, y) = fun isInDeadZone (x, y) =
x < 0.1 andalso x > ~0.1 andalso y < 0.1 andalso y > ~0.1 x < 0.1 andalso x > ~0.1 andalso y < 0.1 andalso y > ~0.1
(* todo: query L2 and R2, and handle them *) (* todo: also query L2 and R2, and handle them *)
fun axisToDir (x, y) = fun axisToDir (x, y) =
if isInDeadZone (x, y) then CENTRE if isInDeadZone (x, y) then CENTRE
else if abs x > abs y then if x > 0.0 then RIGHT else LEFT else if abs x > abs y then if x > 0.0 then RIGHT else LEFT
@@ -22,10 +22,24 @@ struct
orelse Input.getGamepadState 12 <> 0 orelse Input.getGamepadState 13 <> 0 orelse Input.getGamepadState 12 <> 0 orelse Input.getGamepadState 13 <> 0
orelse Input.getGamepadState 14 <> 0 orelse Input.getGamepadState 15 <> 0 orelse Input.getGamepadState 14 <> 0 orelse Input.getGamepadState 15 <> 0
local open InputMsg local
in val state =
{ crossPressed = ref false
, circlePressed = ref false
, squarePressed = ref false
, trianglePressed = ref false
, r1Pressed = ref false
, l1Pressed = ref false
}
open InputMsg
fun handleTrianglePressed (x, y) = fun handleTrianglePressed (x, y) =
if !(#trianglePressed state) then
()
else
let let
val () = #trianglePressed state := true
val chr = val chr =
case axisToDir (x, y) of case axisToDir (x, y) of
CENTRE => #"a" CENTRE => #"a"
@@ -40,7 +54,11 @@ struct
end end
fun handleCirclePressed (x, y) = fun handleCirclePressed (x, y) =
if !(#circlePressed state) then
()
else
let let
val () = #circlePressed state := true
val chr = val chr =
case axisToDir (x, y) of case axisToDir (x, y) of
CENTRE => #"b" CENTRE => #"b"
@@ -55,6 +73,12 @@ struct
end end
fun handleCrossPressed (x, y) = fun handleCrossPressed (x, y) =
if !(#crossPressed state) then
()
else
let
val () = #crossPressed state := true
in
case axisToDir (x, y) of case axisToDir (x, y) of
CENTRE => InputMailbox.append (CHAR_EVENT #"c") CENTRE => InputMailbox.append (CHAR_EVENT #"c")
| UP => InputMailbox.append (CHAR_EVENT #"g") | UP => InputMailbox.append (CHAR_EVENT #"g")
@@ -65,8 +89,15 @@ struct
| R2 => | R2 =>
(* todo: either shift or enter *) (* todo: either shift or enter *)
raise Fail "glfw-gamepad.sml: 77\n" raise Fail "glfw-gamepad.sml: 77\n"
end
fun handleSquarePressed (x, y) = fun handleSquarePressed (x, y) =
if !(#squarePressed state) then
()
else
let
val () = #squarePressed state := true
in
case axisToDir (x, y) of case axisToDir (x, y) of
CENTRE => InputMailbox.append (CHAR_EVENT #"d") CENTRE => InputMailbox.append (CHAR_EVENT #"d")
| UP => InputMailbox.append (CHAR_EVENT #"h") | UP => InputMailbox.append (CHAR_EVENT #"h")
@@ -78,39 +109,57 @@ struct
(* todo: either shift or enter *) (* todo: either shift or enter *)
raise Fail "glfw-gamepad.sml: 87\n" raise Fail "glfw-gamepad.sml: 87\n"
end end
in
fun handleIfJoystickIsPresent () = fun handleIfJoystickIsPresent () =
let let
open InputMsg open InputMsg
(* query possible events for information *)
val xAxis = Input.getLeftJoystickXAxisState () val xAxis = Input.getLeftJoystickXAxisState ()
val yAxis = Input.getLeftJoystickYAxisState () val yAxis = Input.getLeftJoystickYAxisState ()
val crossPrressed = Input.isCrossButtonPressed () val crossPressed = Input.isCrossButtonPressed ()
val circlePressed = Input.isCircleButtonPressed () val circlePressed = Input.isCircleButtonPressed ()
val squarePressed = Input.isSquareButtonPressed () val squarePressed = Input.isSquareButtonPressed ()
val trianglePressed = Input.isTriangleButtonPressed () val trianglePressed = Input.isTriangleButtonPressed ()
val r1Pressed = Input.isR1ButtonPressed () val r1Pressed = Input.isR1ButtonPressed ()
val l1Pressed = Input.isL1ButtonPressed () val l1Pressed = Input.isL1ButtonPressed ()
in
if crossPrressed <> 0 then (* handle button events *)
(* pressing two buttons at the same time is a no-op *) val () =
if if crossPressed = 0 then #crossPressed state := false
circlePressed <> 0 orelse squarePressed <> 0 else if !(#crossPressed state) then ()
orelse trianglePressed <> 0 orelse r1Pressed <> 0
orelse l1Pressed <> 0
then ()
else handleCrossPressed (xAxis, yAxis) else handleCrossPressed (xAxis, yAxis)
else if circlePressed <> 0 then
if val () =
squarePressed <> 0 orelse trianglePressed <> 0 orelse r1Pressed <> 0 if circlePressed = 0 then #circlePressed state := false
orelse l1Pressed <> 0 else if !(#circlePressed state) then ()
then ()
else handleCirclePressed (xAxis, yAxis) else handleCirclePressed (xAxis, yAxis)
else
val () =
if squarePressed = 0 then #squarePressed state := false
else if !(#squarePressed state) then ()
else handleSquarePressed (xAxis, yAxis)
val () =
if trianglePressed = 0 then #trianglePressed state := false
else if !(#trianglePressed state) then ()
else handleTrianglePressed (xAxis, yAxis)
val () =
if r1Pressed = 0 then #r1Pressed state := false
else if !(#r1Pressed state) then ()
else InputMailbox.append (CHAR_EVENT #" ")
val () =
if l1Pressed = 0 then #l1Pressed state := false
else if !(#l1Pressed state) then ()
else InputMailbox.append KEY_BACKSPACE
in
() ()
end end
end
fun query () = fun query () =
if getGamepadState () then handleIfJoystickIsPresent () if getGamepadState () then handleIfJoystickIsPresent ()