begin coding functionality for remapping keys

This commit is contained in:
2025-02-16 12:45:29 +00:00
parent 0edeb65131
commit 47bda26da5
6 changed files with 294 additions and 10 deletions

277
fcore/core-key.sml Normal file
View File

@@ -0,0 +1,277 @@
signature CORE_KEY =
sig
(* enumeration of keys, following GLFW names
* taken from https://www.glfw.org/docs/latest/group__keys.html
* note that there is no dependency on GLFW here: it is just a plain datatype.
* *)
datatype key_code =
KEY_SPACE
| KEY_APOSTROPHE
| KEY_COMMA
| KEY_MINUS
| KEY_PERIOD
| KEY_SLASH
| KEY_0
| KEY_1
| KEY_2
| KEY_3
| KEY_4
| KEY_5
| KEY_6
| KEY_7
| KEY_8
| KEY_9
| KEY_SEMICOLON
| KEY_EQUAL
| KEY_A
| KEY_B
| KEY_C
| KEY_D
| KEY_E
| KEY_F
| KEY_G
| KEY_H
| KEY_I
| KEY_J
| KEY_K
| KEY_L
| KEY_M
| KEY_N
| KEY_O
| KEY_P
| KEY_Q
| KEY_R
| KEY_S
| KEY_T
| KEY_U
| KEY_V
| KEY_W
| KEY_X
| KEY_Y
| KEY_Z
| KEY_LEFT_BRACKET
| KEY_BACKSLASH
| KEY_RIGHT_BRACKET
| KEY_GRAVE_ACCENT
| KEY_WORLD_1
| KEY_WORLD_2
| KEY_ESCAPE
| KEY_ENTER
| KEY_TAB
| KEY_BACKSPACE
| KEY_INSERT
| KEY_DELETE
| KEY_LEFT
| KEY_RIGHT
| KEY_DOWN
| KEY_UP
| KEY_PAGE_UP
| KEY_PAGE_DOWN
| KEY_HOME
| KEY_END
| KEY_CAPS_LOCK
| KEY_SCROLL_LOCK
| KEY_NUM_LOCK
| KEY_PRINT_SCREEN
| KEY_PAUSE
| KEY_F1
| KEY_F2
| KEY_F3
| KEY_F4
| KEY_F5
| KEY_F6
| KEY_F7
| KEY_F8
| KEY_F9
| KEY_F10
| KEY_F11
| KEY_F12
| KEY_F13
| KEY_F14
| KEY_F15
| KEY_F16
| KEY_F17
| KEY_F18
| KEY_F19
| KEY_F20
| KEY_F21
| KEY_F22
| KEY_F23
| KEY_F24
| KEY_F25
| KEY_KP_0
| KEY_KP_1
| KEY_KP_2
| KEY_KP_3
| KEY_KP_4
| KEY_KP_5
| KEY_KP_6
| KEY_KP_7
| KEY_KP_8
| KEY_KP_9
| KEY_KP_DECIMAL
| KEY_KP_DIVIDE
| KEY_KP_MULTIPLY
| KEY_KP_SUBTRACT
| KEY_KP_ADD
| KEY_KP_ENTER
| KEY_KP_EQUAL
| KEY_LEFT_SHIFT
| KEY_LEFT_CONTROL
| KEY_LEFT_ALT
| KEY_LEFT_SUPER
| KEY_RIGHT_SHIFT
| KEY_RIGHT_CONTROL
| KEY_RIGHT_ALT
| KEY_RIGHT_SUPER
| KEY_MENU
(* user's chosen key mappings *)
type user_key =
{ left: key_code
, right: key_code
, up: key_code
, down: key_code
, jump: key_code
, attack: key_code
}
end
structure CoreKey :> CORE_KEY =
struct
(* enumeration of keys, following GLFW names
* taken from https://www.glfw.org/docs/latest/group__keys.html
* note that there is no dependency on GLFW here: it is just a plain datatype.
* *)
datatype key_code =
KEY_SPACE
| KEY_APOSTROPHE
| KEY_COMMA
| KEY_MINUS
| KEY_PERIOD
| KEY_SLASH
| KEY_0
| KEY_1
| KEY_2
| KEY_3
| KEY_4
| KEY_5
| KEY_6
| KEY_7
| KEY_8
| KEY_9
| KEY_SEMICOLON
| KEY_EQUAL
| KEY_A
| KEY_B
| KEY_C
| KEY_D
| KEY_E
| KEY_F
| KEY_G
| KEY_H
| KEY_I
| KEY_J
| KEY_K
| KEY_L
| KEY_M
| KEY_N
| KEY_O
| KEY_P
| KEY_Q
| KEY_R
| KEY_S
| KEY_T
| KEY_U
| KEY_V
| KEY_W
| KEY_X
| KEY_Y
| KEY_Z
| KEY_LEFT_BRACKET
| KEY_BACKSLASH
| KEY_RIGHT_BRACKET
| KEY_GRAVE_ACCENT
| KEY_WORLD_1
| KEY_WORLD_2
| KEY_ESCAPE
| KEY_ENTER
| KEY_TAB
| KEY_BACKSPACE
| KEY_INSERT
| KEY_DELETE
| KEY_LEFT
| KEY_RIGHT
| KEY_DOWN
| KEY_UP
| KEY_PAGE_UP
| KEY_PAGE_DOWN
| KEY_HOME
| KEY_END
| KEY_CAPS_LOCK
| KEY_SCROLL_LOCK
| KEY_NUM_LOCK
| KEY_PRINT_SCREEN
| KEY_PAUSE
| KEY_F1
| KEY_F2
| KEY_F3
| KEY_F4
| KEY_F5
| KEY_F6
| KEY_F7
| KEY_F8
| KEY_F9
| KEY_F10
| KEY_F11
| KEY_F12
| KEY_F13
| KEY_F14
| KEY_F15
| KEY_F16
| KEY_F17
| KEY_F18
| KEY_F19
| KEY_F20
| KEY_F21
| KEY_F22
| KEY_F23
| KEY_F24
| KEY_F25
| KEY_KP_0
| KEY_KP_1
| KEY_KP_2
| KEY_KP_3
| KEY_KP_4
| KEY_KP_5
| KEY_KP_6
| KEY_KP_7
| KEY_KP_8
| KEY_KP_9
| KEY_KP_DECIMAL
| KEY_KP_DIVIDE
| KEY_KP_MULTIPLY
| KEY_KP_SUBTRACT
| KEY_KP_ADD
| KEY_KP_ENTER
| KEY_KP_EQUAL
| KEY_LEFT_SHIFT
| KEY_LEFT_CONTROL
| KEY_LEFT_ALT
| KEY_LEFT_SUPER
| KEY_RIGHT_SHIFT
| KEY_RIGHT_CONTROL
| KEY_RIGHT_ALT
| KEY_RIGHT_SUPER
| KEY_MENU
(* user's chosen key mappings *)
type user_key =
{ left: key_code
, right: key_code
, up: key_code
, down: key_code
, jump: key_code
, attack: key_code
}
end

View File

@@ -9,6 +9,7 @@ sig
, enemies: EnemyMap.t
, graph: PlatSet.elem vector vector
, fallingEnemies: FallingEnemyMap.t
, userKeys: CoreKey.user_key
}
val initial: game_type
@@ -25,6 +26,7 @@ struct
, enemies: EnemyMap.t
, graph: PlatSet.elem vector vector
, fallingEnemies: FallingEnemyMap.t
, userKeys: CoreKey.user_key
}
fun enemyMapFromList (hd :: tl, map) =
@@ -53,6 +55,16 @@ struct
, platID = ~1
}
(* todo: replace initialKeys with keys parsed from file *)
val initialKeys =
{ left = CoreKey.KEY_S
, right = CoreKey.KEY_L
, up = CoreKey.KEY_E
, down = CoreKey.KEY_D
, jump = CoreKey.KEY_K
, attack = CoreKey.KEY_J
}
val wall1 = {id = 1, x = 0, y = 0, width = 100, height = 1080}
val wall2 = {id = 2, x = 1820, y = 0, width = 100, height = 1080}
val wall3 = {id = 3, x = 0, y = 980, width = 1920, height = 108}
@@ -140,6 +152,7 @@ struct
, enemies = enemies
, graph = graph
, fallingEnemies = FallingEnemyMap.empty
, userKeys = initialKeys
}
end
end

View File

@@ -11,6 +11,7 @@ struct
, enemies
, graph
, fallingEnemies
, userKeys
} = game
val player = Player.runPhysicsAndInput (game, input)
@@ -39,6 +40,7 @@ struct
, enemies = enemies
, graph = graph
, fallingEnemies = fallingEnemies
, userKeys = userKeys
}
end
end

View File

@@ -142,7 +142,6 @@ struct
, defeteadEnemies
, projectiles
, attackHeld
, chargeHeld
, charge
, player
, acc
@@ -206,8 +205,7 @@ struct
, ...
} = player
val {leftHeld, rightHeld, upHeld, downHeld, attackHeld, chargeHeld} =
input
val {leftHeld, rightHeld, upHeld, downHeld, attackHeld} = input
val xAxis = getXAxis (leftHeld, rightHeld)
val facing = getFacing (facing, xAxis)
@@ -221,7 +219,6 @@ struct
, enemies
, projectiles
, attackHeld
, chargeHeld
, charge
, player
, acc

View File

@@ -34,6 +34,7 @@ fcore/enemy/enemy-map.sml
fcore/enemy/falling-enemy-pair.sml
fcore/enemy/falling-enemy-map.sml
fcore/core-key.sml
fcore/player/player-type.sml
fcore/game-type.sml

View File

@@ -7,7 +7,6 @@ struct
, upHeld = ref false
, downHeld = ref false
, attackHeld = ref false
, chargeHeld = ref false
, width = ref (1920.0 : Real32.real)
, height = ref (1080.0 : Real32.real)
}
@@ -18,7 +17,6 @@ struct
, upHeld = !(#upHeld state)
, downHeld = !(#downHeld state)
, attackHeld = !(#attackHeld state)
, chargeHeld = !(#chargeHeld state)
}
fun getWidth () =
@@ -53,10 +51,6 @@ struct
if action = PRESS then (#attackHeld state) := true
else if action = RELEASE then (#attackHeld state) := false
else ()
else if key = KEY_L then
if action = PRESS then (#chargeHeld state) := true
else if action = RELEASE then (#chargeHeld state) := false
else ()
else
()