2017-05-25 34 views
1

至于榆树学习的榜样,我想创建一个简单的蛇游戏与榆树架构。如何“生成”,在简单的应用程序自己的命令

这里是迄今全码: https://gist.github.com/DanEEStar/b11509514d72eaafb640378fc7c93b44

的程序的一部分是被通过按钮点击和updateWorld函数被称为当用户按下空格键产生的UpdateWorld消息。

这将导致如下的编译和运行的代码(片段形成的完整代码):

update : Msg -> Model -> (Model, Cmd Msg) 
update msg model = 
    case msg of 
     UpdateWorld -> 
      (updateWorld model, Cmd.none) 

     KeyPress keyCode -> 
      (handleInput keyCode model, Cmd.none) 


handleInput : Int -> Model -> Model 
handleInput keyCode model = 
    case Char.fromCode keyCode of 
     ' ' -> 
      updateWorld model 

     _ -> 
      model 


updateWorld : Model -> Model 
updateWorld model = 
    { model | snake = updateSnake model.snake } 


subscriptions : Model -> Sub Msg 
subscriptions model = 
    Keyboard.presses KeyPress 


view : Model -> Html Msg 
view model = 
    div [] 
     -- here I can simply tell `onClick` to generate the `UpdateWorld` command 
     [ button [ onClick UpdateWorld ] [ text "tick" ] 
     ] 

在此代码段是很清楚,onClick事件产生UpdateWorld命令。 但是在handleInput函数中我必须“手动”调用updateWorld函数。

我宁愿做的是从我的handleInput函数中“生成”一个新的UpdateWorld命令。我认为这会澄清代码。例如:

handleInput keyCode = 
    case Char.fromCode keyCode of 
     ' ' -> 
      -- how can I generate this command in my code 
      UpdateWorld 

我该怎么做?

这甚至是一个好主意,或者这将是一个更好的模式?

回答

3

回想一下,update仅仅是一个函数,这意味着你可以递归调用它。

考虑改变handleInput签名也返回(Model, Cmd Msg),就像update功能:

handleInput : Int -> Model -> (Model, Cmd Msg) 
handleInput keyCode model = 
    case Char.fromCode keyCode of 
     ' ' -> 
      update UpdateWorld model 
     'a' -> 
      { model | snake = changeSnakeDirection model.snake West } ! [] 
     ... 

可以摆脱updateWorld功能和移动代码到UpdateWorld消息处理程序:

update : Msg -> Model -> (Model, Cmd Msg) 
update msg model = 
    case msg of 
     UpdateWorld -> 
      ({ model | snake = updateSnake model.snake }, Cmd.none) 

     ChangeDirection newDirection -> 
      ({ model | snake = changeSnakeDirection model.snake newDirection }, Cmd.none) 

     KeyPress keyCode -> 
      handleInput keyCode model 
+0

感谢,这正是解决我的问题。我正在看错了角落。 – DanEEStar

+0

我必须拿掉验收标志。在思考了一些关于这个问题后,我仍然对原始问题感兴趣...... – DanEEStar

+0

我偶然发现了你的这个答案:https://stackoverflow.com/a/42703561/669561。 这似乎是我有同样的问题?! – DanEEStar

相关问题