X-Git-Url: https://git.danieliu.xyz/?p=ekitaihs.git;a=blobdiff_plain;f=Render.hs;h=d6d967efadc0a0b3a5093e3d3b46144409b2868d;hp=fc321f6c46967eeaef1ebde9880a326dcc534956;hb=6720ac28a940ee4cf8ecb556e2e428f63a7ae3fa;hpb=c68579ccc2b03996eec6ac5c1526d6e5d20c3c78 diff --git a/Render.hs b/Render.hs index fc321f6..d6d967e 100644 --- a/Render.hs +++ b/Render.hs @@ -1,17 +1,29 @@ -module Render ( buildInitialState, ekitaiApp ) where +module Render ( ekitaiMain ) where import Brick.AttrMap import Brick.Main import Brick.Types import Brick.Widgets.Core -import Graphics.Vty.Input.Events +import Brick.BChan (newBChan, writeBChan) +import Graphics.Vty + +import Control.Monad (forever, void) +import Control.Monad.IO.Class (liftIO) +import Control.Concurrent (threadDelay, forkIO) + +import qualified Data.Vector as V +import Sim type ResourceName = String -data EkitaiState = - EkitaiState deriving (Show) +data EkitaiState = EkitaiState + { ekitaiStateSim :: Simulation + } deriving (Show) + +-- custom event +data Tick = Tick -ekitaiApp :: App EkitaiState e ResourceName +ekitaiApp :: App EkitaiState Tick ResourceName ekitaiApp = App { appDraw = drawEkitai , appChooseCursor = showFirstCursor @@ -20,18 +32,29 @@ ekitaiApp = App , appAttrMap = const $ attrMap mempty [] } -buildInitialState :: IO EkitaiState -buildInitialState = pure EkitaiState +ekitaiMain sim timestep = do + chan <- newBChan 10 + -- tick game + forkIO $ forever $ do + writeBChan chan Tick + threadDelay timestep + let buildVty = Graphics.Vty.mkVty Graphics.Vty.defaultConfig + initialVty <- buildVty + initialState <- buildInitialState sim + endState <- customMain initialVty buildVty (Just chan) ekitaiApp initialState + return 0 + +buildInitialState :: Simulation -> IO EkitaiState +buildInitialState sim = + pure EkitaiState + { ekitaiStateSim = sim + } drawEkitai :: EkitaiState -> [Widget ResourceName] -drawEkitai state = [] - -handleEkitaiEvent :: EkitaiState -> BrickEvent n e -> EventM n (Next EkitaiState) -handleEkitaiEvent s e = - case e of - VtyEvent vtye -> - case vtye of - EvKey (KChar 'q') [] -> halt s - _ -> continue s - _ -> continue s +drawEkitai state = [ vBox [str $ simToString $ ekitaiStateSim state] ] + +handleEkitaiEvent :: EkitaiState -> BrickEvent n Tick -> EventM n (Next EkitaiState) +handleEkitaiEvent s (VtyEvent (EvKey (KChar 'q') [])) = halt s +handleEkitaiEvent s (AppEvent Tick) = continue s { ekitaiStateSim = physStep $ ekitaiStateSim s } +handleEkitaiEvent s _ = continue s