模型中的可配置输入(榆木0.13)

时间:2014-12-20 16:30:58

标签: keyboard signals elm

对于我正在开发的Elm(0.13)游戏,我希望有可重新配置的输入。我得到的模型的简化版本是

type Controls = {
    up:    KeyCode,
    down:  KeyCode,
    left:  KeyCode,
    right: KeyCode
}

type Player = {
    ...
    controls: Controls,
    ...
}

type Game = {
    state: State,
    players: [Player]
}

对于游戏循环,我使用的是标准foldp构造,我希望输入依赖于游戏的当前状态。到目前为止,我尝试了以下内容:

gameState =
    let 
        initialGame = (newGame initialActive)
    in
        foldp update initialGame (input initialGame)

但当然,输入信号生成功能(input : Game -> Signal Input)继续使用初始游戏,而不是更改的游戏状态。

我已经在互联网上搜索了一个解决方案,但我找不到任何方向。有没有办法按照我尝试的方式(通过在模型中包含控件)来实现,或者我是否必须通过自己制作控件来从模型中释放控件?

1 个答案:

答案 0 :(得分:2)

这里有一个密切相关的问题:Creating custom keyboard controls [Elm]

如果您愿意,可以保持游戏状态的Controls部分。这样做的方法不是将您的输入基于initialGame,而是采取更一般的输入,您可以从中随时提取所需内容。在这种情况下,Keyboard.keysDown。然后你可以使用以下方式获得每个玩家的输入:

playerInput : Controls -> [KeyCode] -> { x : Int, y : Int }
playerInput {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}

如果您要从Controls中移除Game,可以将其提升为foldp输入的定义。