2017-05-25 36 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

相關問題