-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMain.elm
136 lines (99 loc) · 2.9 KB
/
Main.elm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
module Main exposing (main)
--import Math.Vector2 as V2
import Browser
import Browser.Events
import Html exposing (Html, button, div, li, span, ul)
import Html.Attributes exposing (style)
import Html.Events as Events
import Json.Decode as D
import Tools.Game as Game
{- v2P : V2.Vec2 -> Position
v2P v =
( floor (V2.getX v), floor (V2.getY v) )
p2V : Position -> V2.Vec2
p2V ( a, b ) =
V2.vec2 (toFloat a) (toFloat b)
-}
type Msg
= FromGame Game.Msg
| JumpTo Model
type Model
= Menu
| Play Game.GameLevel
init : () -> ( Model, Cmd Msg )
init _ =
( Menu
, Cmd.none
)
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
(\a -> ( a, Cmd.none )) <|
case model of
Play level ->
case msg of
FromGame gMsg ->
if gMsg == Game.Exit then
Menu
else
Play (Game.update gMsg level)
JumpTo Menu ->
Menu
_ ->
model
Menu ->
case msg of
JumpTo (Play level1) ->
Play level1
_ ->
model
view : Model -> Html Msg
view model =
div divGameStyle
[ case model of
Play level ->
Html.map FromGame (Game.gameView level)
Menu ->
div divDefautStyle
(List.concat
[ buttonList "Select the Level" Game.levelList
, buttonList "These are Demos(No goal to win)" Game.myDemos
])
]
divDefautStyle : List (Html.Attribute Msg)
divDefautStyle =
[ style "width" "320px"
, style "margin" "0 auto"
, style "overflow" "auto"
, style "background-color" "white"
]
divGameStyle : List (Html.Attribute Msg)
divGameStyle =
[ style "width" "680px"
, style "height" "480px"
, style "margin" "0 auto"
, style "overflow" "auto"
, style "background-color" "white"
]
buttonList : String -> List Game.GameLevel -> List (Html Msg)
buttonList listName gameList =
[ span [] [ Html.text listName ]
, ul [ style "list-style-type" "none", style "overflow" "auto" ]
(List.map selectLevelButton gameList)
]
selectLevelButton : Game.GameLevel -> Html Msg
selectLevelButton level =
li [] [ button [ Events.onClick (JumpTo (Play level)) ] [ Html.text level.name ] ]
subscriptions : Model -> Sub Msg
subscriptions _ =
Browser.Events.onKeyDown keyDecoder
keyDecoder : D.Decoder Msg
keyDecoder =
D.map (\a -> FromGame (Game.keyboardControls a)) (D.field "code" D.string)
main : Program () Model Msg
main =
Browser.element
{ init = init
, view = view
, update = update
, subscriptions = subscriptions
}