对于我正在开发的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
)继续使用初始游戏,而不是更改的游戏状态。
我已经在互联网上搜索了一个解决方案,但我找不到任何方向。有没有办法按照我尝试的方式(通过在模型中包含控件)来实现,或者我是否必须通过自己制作控件来从模型中释放控件?
答案 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
输入的定义。