1

对于我正在开发的 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) 继续使用初始游戏,而不是改变的游戏状态。

我已经在整个互联网上搜索以找到解决方案,但我在这个方向上找不到任何东西。有没有办法按照我尝试的方式进行(通过在模型中包含控件),或者我是否必须通过使控件本身发出信号来从模型中释放控件?

4

1 回答 1

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}

如果要从中删除ControlsGame可以将其提升到foldp.

于 2014-12-21T11:59:25.003 回答