Creating custom keyboard controls [Elm]

前端 未结 1 842
情书的邮戳
情书的邮戳 2021-01-13 19:18

I\'m trying to create custom keyboard controls for a 4 player game. Right now, the keys are predetermined like this:

type Orient = { x:Int, y:Int }
type Gam         


        
相关标签:
1条回答
  • 2021-01-13 19:51

    Directly using Keyboard.directions is not gonna work. The problem is that at the start of the game the keys can be changed so you have some Signal Char. And Keyboard.direction goes from "normal types" to "signal types". So you can't lift it.

    But you also have access to the keys that are currently held down, Keyboard.keysDown. I looked up the implementation of Keyboard.directions and I think you can recreate it in Elm in a way that has it take Signal Int arguments.

    Here's an Elm implementation of the normal Keyboard.directions:

    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
    

    and here's the implementation you'll want to use:

    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
    

    Feel free to refactor, I just hacked this code together quickly so it's kind of too large for a single function.

    0 讨论(0)
提交回复
热议问题