1.mainの部分を本格的に
reactimateは簡便で便利な関数だが、落下するボールをマウスで操作したいなどインタラクティブな操作を加えるときは、不向きである。そこで、ここでは将来の拡張に備えて、reactInitとreactを用いて、mainの部分を書き換える。コードは同じようにJekorが動画で用いたものである。
mainSF = (fallingBall 10.0) >>^ (\ (pos, vel)-> putStrLn ("pos: " ++ show pos ++ ", vel: " ++ show vel) >> draw pos) -- | Main, initializes Yampa and sets up reactimation loop main :: IO () main = do oldTime <- newIORef (0 :: Int) rh <- reactInit (initGL) (\_ _ b -> b >> return False) mainSF displayCallback $= return () idleCallback $= Just (idle oldTime rh) oldTime' <- get elapsedTime writeIORef oldTime oldTime' mainLoop -- | Reactimation iteration, supplying the input idle :: IORef Int -> ReactHandle () (IO ()) -> IO () idle oldTime rh = do newTime' <- get elapsedTime oldTime' <- get oldTime let dt = (fromIntegral $ newTime' - oldTime')/1000 react rh (dt, Nothing) writeIORef oldTime newTime' return ()
上記のプログラムで、mainSFはシグナル関数とその出力を与えたものである。mainおよびidleの部分がreactimateをより詳細に記述した部分である。
さらに落下するボールを見やすくするために、zの値を-30にしてrenderPlayerを奥のほうに持ってゆく。
renderPlayer $ vector3 2 (unsafeCoerce pos) (-30)