Создание пользовательских элементов управления клавиатурой [Elm]
Я пытаюсь создать пользовательские элементы управления клавиатурой для игры для 4 игроков. Прямо сейчас ключи предопределены так:
type Orient = { x:Int, y:Int }
type GameInput = { space:Bool, delta:Time, so1:Orient, so2:Orient, so3:Orient,
so4:Orient, amount:Int }
gameInput : Signal GameInput
gameInput =
let sampledInput = sampleOn delta
<| GameInput <~ Keyboard.space
~ delta
~ Keyboard.arrows
~ Keyboard.wasd
~ Keyboard.directions (toCode 'O')
(toCode 'L')
(toCode 'K')
(toCode 'M')
~ Keyboard.directions (toCode 'Y')
(toCode 'H')
(toCode 'G')
(toCode 'J')
~ amountPlayers.signal
in lift (Debug.watch "input") sampledInput
Я создал (для каждого игрока) ввод формы:
type CustomKeys = { up:Char, down:Char, left:Char, right:Char }
customKeys2 : Signal CustomKeys
customKeys2 = CustomKeys <~ ck2up.signal
~ ck2down.signal
~ ck2left.signal
~ ck2right.signal
ck2up : Input Char
ck2up = input 'W'
ck2down : Input Char
ck2down = input 'S'
ck2left : Input Char
ck2left = input 'A'
ck2right : Input Char
ck2right = input 'D'
Обработчик в другом месте будет корректировать значения ввода в соответствии с потребностями игрока. Но мне трудно понять, как вставить эти значения в аргументы дляKeyboard.directions
.
Я пытался поднять аргументы вKeyboard.directions
непосредственно:
~ Keyboard.directions <~ ...
Любой результат станет Сигналом Сигнала, который нельзя поднять наGameInput
(правильно).
Я попытался передать символы в качестве аргументов вgameInput
:
gameInput2 : Signal GameInput
gameInput2 = gameInput <~ customKeys2
gameInput : CustomKeys -> Signal GameInput
gameInput { up,down,left,right } = GameInput <~ Keyboard.directions (toCode up)
(toCode down)
(toCode left)
(toCode right)
СейчасgameInput2
будет иметь в результате сигнал сигнала.
Моя последняя идея - объединить сигналы, но это не кажется мне вариантом, поскольку я хочу, чтобы один сигнал зависел от другого.