Skip to content

Commit d3ed069

Browse files
author
Julien Dehos
committed
handle pointer event
1 parent a81e080 commit d3ed069

File tree

2 files changed

+39
-11
lines changed

2 files changed

+39
-11
lines changed

src/Component.hs

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,16 @@ import GeneratedWorlds (allWorlds)
2828
assetsUrl :: MisoString
2929
assetsUrl = "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

6469
updateModel (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
192215
mkComponent =
193216
(component initialModel updateModel viewModel)
194217
{ subs = [ keyboardSub ActionKey ]
218+
, events = defaultEvents <> pointerEvents
195219
, initialAction = Just ActionAskTime
196220
-- , logLevel = DebugAll
197221
}

src/Game.hs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ module Game
33
( World.assetSize
44
, World.Cell(..)
55
, Move(..)
6-
, Game(..)
6+
, Game
77
, mkGame
88
, playMove
99
, forGame
1010
, getNiNj
11+
, getPlayer
1112
, computeBoxes12
1213
, computeRunning
1314
, computeTerminated
@@ -51,6 +52,9 @@ playMove m g =
5152
getNiNj :: Game -> (Int, Int)
5253
getNiNj g = g ^. gameWorld . worldNiNj
5354

55+
getPlayer :: Game -> Position
56+
getPlayer g = g ^. gamePlayer
57+
5458
forGame :: (Monad m) => Game -> ((Int, Int) -> Cell -> m ()) -> m ()
5559
forGame g f =
5660
let nj = g ^. gameWorld . worldNiNj . _2

0 commit comments

Comments
 (0)