@@ -6,17 +6,20 @@ import Foreign.JavaScript
6import Signal.Keyboard.Raw
6import Signal.Keyboard.Raw
7import Signal.Input
7import Signal.Input
9−
9+(drop,dFPS) = dropDown
10−foreign import jsevent "trigger" (castIntToJSNumber 0)
16+desiredFPS = lift castIntToJSNumber dFPS
11− jsTime :: Signal JSNumber
13−foreign export jsevent "finished"
14− done :: Signal JSBool
16foreign export jsevent "desiredFPS"
17foreign export jsevent "desiredFPS"
17 desiredFPS :: Signal JSNumber
18 desiredFPS :: Signal JSNumber
19−desiredFPS = constant (castIntToJSNumber 30)
21+foreign import jsevent "trigger" (castIntToJSNumber 0)
22+ jsTime :: Signal JSNumber
21time = lift castJSNumberToFloat jsTime
24time = lift castJSNumberToFloat jsTime
@@ -26,7 +29,6 @@ time = lift castJSNumberToFloat jsTime
26getFPS ts =
29getFPS ts =
27 let len = length ts in
30 let len = length ts in
28 if len > 1 then (len-1) / (head ts - last ts) else 0
31 if len > 1 then (len-1) / (head ts - last ts) else 0
29−truncate n = castJSNumberToInt (castFloatToJSNumber $ 100 * n) / 100
30fps = lift (truncate . getFPS) (foldp (\t ts -> take 10 (t:ts)) [0] time)
32fps = lift (truncate . getFPS) (foldp (\t ts -> take 10 (t:ts)) [0] time)
@@ -45,7 +47,7 @@ velocity = lift (foldl addKey (0,0)) keysDown
46timestep = lift snd $ foldp (\t1 (t0,d) -> (t1, t1-t0)) (0,0) time
48timestep = lift snd $ foldp (\t1 (t0,d) -> (t1, t1-t0)) (0,0) time
48−delta = dropIf (\(x,y) -> x == 0 && y == 0) (0,0) $
50+delta = dropIf (\(x,y) -> x == 0 && y == 0) (0,0) . sampleOn timestep $
49 lift (scaleBy 100) (lift2 scaleBy timestep velocity)
51 lift (scaleBy 100) (lift2 scaleBy timestep velocity)
51position = foldp addVecs (0,0) delta
53position = foldp addVecs (0,0) delta
@@ -53,15 +55,18 @@ position = foldp addVecs (0,0) delta
54-- Display moving square and FPS on screen.
56-- Display moving square and FPS on screen.
56−screen pos actual desired =
58+screen pos actual =
57 flow down [ collage 400 400 [ outlined black (rect 40 40 pos) ]
59 flow down [ collage 400 400 [ outlined black (rect 40 40 pos) ]
58 , plainText "Move the square around with the arrow keys."
60 , plainText "Move the square around with the arrow keys."
59 , text $ toText "Actual frames per second: " ++ show actual
61 , text $ toText "Actual frames per second: " ++ show actual
60− , text $ toText "Desired frames per second: " ++ show desired
62+ , plainText "Desired frames per second: " `beside` drop
64−game = lift3 screen position fps desiredFPS
66+game = lift2 screen position fps
65done = lift (\_ -> castBoolToJSBool True) game
68done = lift (\_ -> castBoolToJSBool True) game
69+foreign export jsevent "finished"
70+ done :: Signal JSBool
67main = game
72main = game