gpt4 book ai didi

keyboard - 创建自定义键盘控件 [Elm]

转载 作者:行者123 更新时间:2023-12-02 22:10:52 24 4
gpt4 key购买 nike

我正在尝试为 4 人游戏创建自定义键盘控件。现在, key 是这样预先确定的:

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 将得到一个信号的信号。

我的最后一个想法是组合信号,但这对我来说似乎不是一个选择,因为我希望一个信号依赖于另一个信号。

最佳答案

直接使用Keyboard.directions是行不通的。问题是在游戏开始时可以更改按键,以便您拥有一些信号字符。并且 Keyboard.direction 从“普通类型”变为“信号类型”。所以你举不起来。

但您还可以访问当前按下的键,Keyboard.keysDown。我查了一下implementation of Keyboard.directions我认为您可以在 Elm 中以采用 Signal Int 参数的方式重新创建它。

这是普通 Keyboard.directions 的 Elm 实现:

directions : Int -> Int -> Int -> Int -> Signal { x : Int, y : Int }
directions up down left right =
(\kd ->
List.filter (\ky -> List.member ky [up,down,left,right]) kd |>
List.foldl (\ky st -> if | ky == up -> { st | y <- st.y + 1 }
| ky == down -> { st | y <- st.y - 1 }
| ky == left -> { st | x <- st.x - 1 }
| ky == right -> { st | x <- st.x + 1 }
) {x=0,y=0}
) <~ Keyboard.keysDown

这是您要使用的实现:

directions : Signal Int -> Signal Int -> Signal Int -> Signal Int -> Signal { x : Int, y : Int }
directions up down left right =
(\u d l r kd ->
List.filter (\ky -> List.member ky [u,d,l,r]) kd |>
List.foldl (\ky st -> if | ky == u -> { st | y <- st.y + 1 }
| ky == d -> { st | y <- st.y - 1 }
| ky == l -> { st | x <- st.x - 1 }
| ky == r -> { st | x <- st.x + 1 }
) {x=0,y=0}
) <~ up ~ down ~ left ~ right ~ Keyboard.keysDown

请随意重构,我只是快速地将这段代码组合在一起,因此对于单个函数来说它有点太大了。

关于keyboard - 创建自定义键盘控件 [Elm],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27512004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com