【问题标题】:Creating custom keyboard controls [Elm]创建自定义键盘控件 [Elm]
【发布时间】:2014-12-16 19:02:23
【问题描述】:

我正在尝试为 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 将得到一个信号的信号。

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

【问题讨论】:

    标签: keyboard signals elm


    【解决方案1】:

    直接使用Keyboard.directions 是行不通的。问题是在游戏开始时可以更改键,所以你有一些Signal Char。而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
    

    请随意重构,我只是快速将这段代码拼凑在一起,所以它对于单个函数来说有点太大了。

    【讨论】:

      猜你喜欢
      • 2012-01-09
      • 2011-06-06
      • 2016-12-10
      • 2016-04-25
      • 2016-05-29
      • 2012-12-26
      • 1970-01-01
      相关资源
      最近更新 更多