榆树的领域和事件0.13

时间:2014-12-24 09:39:11

标签: events field elm

这个问题在某种程度上与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)

如果我在游戏模式下开始游戏(因此没有显示输入表格),这样可以正常工作,我可以重置游戏。看起来输入是阻止事件流,但我无法弄清楚它出错的地方。

1 个答案:

答案 0 :(得分:0)

所以,我修好了。

显然

case (event, game.state) of
    (NewGame, _) ->
    ...
    (Tick t, Playing) ->

语句是阻止的,因此它与Tick TimePaused状态中发送的Ended信号不匹配并在那里被阻止。一个简单的

(_, _) -> game

案例确定了所有内容,因此我的960行榆树不会浪费!