@@ -28,6 +28,16 @@ import GeneratedWorlds (allWorlds)
2828assetsUrl :: MisoString
2929assetsUrl = " assets/"
3030
31+ -------------------------------------------------------------------------------
32+ -- helpers
33+ -------------------------------------------------------------------------------
34+
35+ xy2ij :: (Double , Double ) -> (Int , Int )
36+ xy2ij (x, y) = (floor y `div` assetSize, floor x `div` assetSize)
37+
38+ ij2xy :: (Int , Int ) -> (Double , Double )
39+ ij2xy (i, j) = (fromIntegral (assetSize* j), fromIntegral (assetSize* i))
40+
3141-------------------------------------------------------------------------------
3242-- actions
3343-------------------------------------------------------------------------------
@@ -38,6 +48,7 @@ data Action
3848 | ActionAskLevel MisoString
3949 | ActionAskTime
4050 | ActionSetTime Double
51+ | ActionPointer PointerEvent
4152
4253-------------------------------------------------------------------------------
4354-- update
@@ -54,12 +65,6 @@ updateModel (ActionKey keys)
5465 | IS. member 39 keys = doPlayMove $ playMove MoveRight
5566 | IS. member 40 keys = doPlayMove $ playMove MoveDown
5667 | otherwise = pure ()
57- where
58- doPlayMove f = do
59- mg <- f <$> use modelGame
60- forM_ mg $ \ g -> do
61- modelGame .= g
62- modelNbMoves += 1
6368
6469updateModel (ActionAskLevel lStr) = do
6570 case fromMisoStringEither lStr of
@@ -75,6 +80,26 @@ updateModel (ActionSetTime t) = do
7580 modelTime .= t
7681 issue ActionAskTime
7782
83+ updateModel (ActionPointer event) = do
84+ when (button event == 0 ) $ do
85+ (ip, jp) <- getPlayer <$> use modelGame
86+ let
87+ (ie, je) = xy2ij $ offset event
88+ di = ie - ip
89+ dj = je - jp
90+ case (abs di > abs dj, di > 0 , dj > 0 ) of
91+ (True , True , _) -> doPlayMove $ playMove MoveDown
92+ (True , False , _) -> doPlayMove $ playMove MoveUp
93+ (False , _, True ) -> doPlayMove $ playMove MoveRight
94+ (False , _, False ) -> doPlayMove $ playMove MoveLeft
95+
96+ doPlayMove :: (Game -> Maybe Game ) -> Transition Model Action
97+ doPlayMove f = do
98+ mg <- f <$> use modelGame
99+ forM_ mg $ \ g -> do
100+ modelGame .= g
101+ modelNbMoves += 1
102+
78103-------------------------------------------------------------------------------
79104-- resources
80105-------------------------------------------------------------------------------
@@ -130,6 +155,7 @@ viewModel m@Model{..} =
130155 [ width_ $ ms $ show w
131156 , height_ $ ms $ show h
132157 , CSS. style_ [ CSS. border " 1px solid black" ]
158+ , onPointerUp ActionPointer
133159 ]
134160 initCanvas
135161 (drawCanvas m w h)
@@ -178,12 +204,9 @@ drawCanvas Model{..} w h Resources{..} = do
178204 in drawImage (_resBox2, x, y)
179205
180206 -- draw player
181- let (xp, yp) = _modelGame & _gamePlayer & ij2xy
207+ let (xp, yp) = _modelGame & getPlayer & ij2xy
182208 drawImage (_resPlayer, xp, yp)
183209
184- ij2xy :: (Int , Int ) -> (Double , Double )
185- ij2xy (i, j) = (fromIntegral (assetSize* j), fromIntegral (assetSize* i))
186-
187210-------------------------------------------------------------------------------
188211-- component
189212-------------------------------------------------------------------------------
@@ -192,6 +215,7 @@ mkComponent :: App Model Action
192215mkComponent =
193216 (component initialModel updateModel viewModel)
194217 { subs = [ keyboardSub ActionKey ]
218+ , events = defaultEvents <> pointerEvents
195219 , initialAction = Just ActionAskTime
196220 -- , logLevel = DebugAll
197221 }
0 commit comments