diff options
-rw-r--r-- | Spear/App/Input.hs | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/Spear/App/Input.hs b/Spear/App/Input.hs index 07e7189..c8def3a 100644 --- a/Spear/App/Input.hs +++ b/Spear/App/Input.hs | |||
@@ -8,7 +8,7 @@ module Spear.App.Input | |||
8 | , Mouse(..) | 8 | , Mouse(..) |
9 | , Input(..) | 9 | , Input(..) |
10 | , ButtonDelay | 10 | , ButtonDelay |
11 | , DelayedMouseState | 11 | , DelayedMouse |
12 | -- * Input state querying | 12 | -- * Input state querying |
13 | , newKeyboard | 13 | , newKeyboard |
14 | , getKeyboard | 14 | , getKeyboard |
@@ -20,7 +20,8 @@ module Spear.App.Input | |||
20 | , toggledMouse | 20 | , toggledMouse |
21 | , toggledKeyboard | 21 | , toggledKeyboard |
22 | -- * Delayed input | 22 | -- * Delayed input |
23 | , newDMS | 23 | , newDM |
24 | , updateDM | ||
24 | , delayedMouse | 25 | , delayedMouse |
25 | ) | 26 | ) |
26 | where | 27 | where |
@@ -168,31 +169,31 @@ type ButtonDelay = MouseButton -> Float | |||
168 | 169 | ||
169 | 170 | ||
170 | -- | Accumulated delays for each mouse button. | 171 | -- | Accumulated delays for each mouse button. |
171 | newtype DelayedMouseState = DelayedMouseState (V.Vector Float) | 172 | data DelayedMouse = DelayedMouse |
173 | { delayedMouse :: Mouse | ||
174 | , delay :: ButtonDelay | ||
175 | , accum :: V.Vector Float | ||
176 | } | ||
172 | 177 | ||
173 | 178 | ||
174 | newDMS :: DelayedMouseState | 179 | newDM :: ButtonDelay -- ^ Delay configuration for each button. |
175 | newDMS = DelayedMouseState $ V.replicate (fromEnum (maxBound :: MouseButton)) 0 | 180 | -> DelayedMouse |
181 | newDM delay = DelayedMouse newMouse delay $ | ||
182 | V.replicate (fromEnum (maxBound :: MouseButton)) 0 | ||
176 | 183 | ||
177 | 184 | ||
178 | delayedMouse :: ButtonDelay -- ^ Delay configuration for each button. | 185 | updateDM :: DelayedMouse -- ^ Current mouse state. |
179 | -> Mouse -- ^ Current mouse state. | 186 | -> Float -- ^ Time elapsed since last udpate. |
180 | -> Float -- ^ Time elapsed since last udpate. | 187 | -> DelayedMouse |
181 | -> DelayedMouseState | ||
182 | -> (Mouse, DelayedMouseState) | ||
183 | 188 | ||
184 | delayedMouse delay mouse dt (DelayedMouseState dms) = | 189 | updateDM (DelayedMouse mouse delay accum) dt = |
185 | let | 190 | let |
186 | dms' | 191 | accum' = V.map (+dt) accum |
187 | = V.fromList | 192 | time x = accum' V.! fromEnum x |
188 | . fmap ((+dt) . (V.!) dms) | 193 | active x = time x >= delay x |
189 | $ [0 .. fromEnum (maxBound :: MouseButton)] | ||
190 | |||
191 | accum x = dms' V.! fromEnum x | ||
192 | active x = accum x >= delay x | ||
193 | button' x = active x && button mouse x | 194 | button' x = active x && button mouse x |
194 | in | 195 | in |
195 | (mouse { button = button' }, DelayedMouseState dms') | 196 | DelayedMouse mouse { button = button' } delay accum' |
196 | 197 | ||
197 | 198 | ||
198 | 199 | ||