【问题标题】:Configurable inputs in model (Elm 0.13)模型中的可配置输入(Elm 0.13)
【发布时间】:2014-12-20 16:30:57
【问题描述】:

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

我已经在整个互联网上进行了搜索以找到解决此问题的方法,但我在这个方向上找不到任何东西。有没有办法按照我尝试的方式来做(通过在模型中包含控件),还是我必须通过让控件自己发出信号来从模型中释放控件?

【问题讨论】:

  • 小注:编程语言的大小写为elm或Elm。 IIRC 这已在邮件列表中讨论过,但我目前找不到来源。
  • @Apanatshka 不过问题已经解决了,我还是会更新它;-)。

标签: keyboard signals elm


【解决方案1】:

这里有一个密切相关的问题: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}

如果您想从Game 中删除Controls,您可以将其提升到foldp 的输入定义中。

【讨论】:

  • 我找到了相关问题,但也许有办法将foldl 的结果循环回input。正如您所描述的,我通过收集所有键盘输入并随后检查正确的信号进行了尝试,这确实有效!我很高兴可以按照我的预期将它保留在我的模型中,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多