module Idle (idle) where import Graphics.Rendering.OpenGL import Graphics.UI.GLUT import Data.IORef import ProgEnd import States import MainState import DisplayState import System.Random idle :: (IORef MState) -> (IORef KState) -> (IORef DState) -> IO() idle mst kst dst = do mst' <- readIORef mst kst' <- readIORef kst dst' <- readIORef dst if (endD mst' kst') == True then actionOnWindowClose $=! Exit else do --dst $=! (newDState mst' kst' dst') mst $=! (newMState mst' kst' dst') kst $=! (changeKeyS kst') postRedisplay Nothing -----Key情報の更新 changeKeyS :: KState -> KState changeKeyS kst = changeKStateKeyS kst (newKStateKeyS kst) newKStateKeyS :: KState -> KeyS newKStateKeyS kst = let ks = keyS kst in newKeySCount (changeKeySCP (keyS kst) (downKey kst) (cKey ks)) newKeySCount :: KeyS -> KeyS newKeySCount ks = changeKeySDownKeyCount ks (keyPushCount ks) -------キー連続入力の判定 keyPushConti :: KeyS -> Bool keyPushConti ks = (cKey ks) == (pKey ks) -------キーの連続入力カウント keyPushCount :: KeyS -> GLint keyPushCount ks = if keyPushConti ks then (downKeyCount ks) + 1 else 0