这个问题在某种程度上与How to use Fields in Elm 0.13有关(我们正在进行相同的任务)。
就我而言,游戏中发生变化的一切都应该产生一个事件:
data Event = NewGame
| PauseGame
| Turn [KeyCode]
| PlayerActive [Bool]
| PlayerChanged [PlayerSettings]
| Tick Time
例如,PlayerChanged事件的生成如下:
settingsSignal : Signal Event
settingsSignal =
lift PlayerChanged <|
combine [ pOneSettingsSignal, pTwoSettingsSignal
, pThreeSettingsSignal, pFourSettingsSignal]
pOneSettingsSignal : Signal PlayerSettings
pOneSettingsSignal =
PlayerSettings <~ (Controls <~ lift toCode pOneUp.signal
~ lift toCode pOneDown.signal
~ lift toCode pOneLeft.signal
~ lift toCode pOneRight.signal)
~ (pOneColor.signal)
~ (lift contentToString pOneName.signal)
其中pOne<Direction>
和pOneColor
是dropDowns的输入,pOneName
是Input.Field的输入:
pOneName : Input Content
pOneName = input (Content nameOne (Selection 0 0 Forward))
我在此假设当我更新文本字段(或下拉列表)时,将生成PlayerChanged [PlayerSettings]
事件。所有事件合并如下:
eventSignal : Signal Event
eventSignal = merges [ clockSignal
, newGameSignal
, pauseGameSignal
, turnSignal
, activeSignal
, settingsSignal ]
最后将事件信号提升到更新功能:
gameState : Signal Game
gameState =
foldp update initialGame eventSignal
main = lift2 view gameState Window.dimensions
但是,当游戏暂停时,似乎所有输入都被阻止,没有信号再传播。此外,文本字段是不可编辑的。播放器名称的每个Input.Field定义如下:
playerOneName : String -> Element
playerOneName name =
field defaultStyle pOneName.handle identity nameOne
(Content name (Selection 0 0 Forward))
然后,在视图函数
中pOneNameField = playerOneName playerOne.settings.name
对我来说,似乎一切都是正确的。编辑显示的字段时,会更改pOneName.signal
,这会导致(通过一系列提升)生成PlayerChanged
事件,这会导致重新绘制模型,该模型应显示新的更新。但是,Input.Field
不知何故仍然是不可编辑的。更糟糕的是:即使是简单的NewGame
事件也不再生成,下拉列表中的事件也不会传播:没有任何变化。
newGameSignal : Signal Event
newGameSignal =
always NewGame <~ (keepIf identity False <| space)
如果我在游戏模式下开始游戏(因此没有显示输入表格),这样可以正常工作,我可以重置游戏。看起来输入是阻止事件流,但我无法弄清楚它出错的地方。
答案 0 :(得分:0)
所以,我修好了。
显然
case (event, game.state) of
(NewGame, _) ->
...
(Tick t, Playing) ->
语句是阻止的,因此它与Tick Time
和Paused
状态中发送的Ended
信号不匹配并在那里被阻止。一个简单的
(_, _) -> game
案例确定了所有内容,因此我的960行榆树不会浪费!