bitterharvest’s diary

A Bitter Harvestは小説の題名。作者は豪州のPeter Yeldham。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語

物理的なモデルに基づいてゲームを開発する:将来の発展のために

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)