52700.fb2
:: Sensor H.Position
}
data Obj = Obj
{ objType
:: BallType
, objShape
:: H.Shape
, objBody
:: H.Body
}
type Sensor a = IORef (Maybe a)
Особая структура IxMap отвечает за хранение значений вместе с индексами. Пока остановимся на самом
простом представлении:
type IxMap a = [(Id, a)]
20.4 Структура проекта
Наметим структуру проекта. У нас уже есть модуль Types. hs. Основной цикл игры будет описан в модуле
Loop. hs. Общие функции обновления состояния будут определены в World. hs, также у нас будет два модуля
отвечающие за обновление чистых и грязных данных – Pure. hs и Dirty. hs. Мы выделим отдельный модуль
для описания всех констант игры (Inits. hs). Так нам будет удобно настроить игру, когда мы закончим с
кодом. Отдельный модуль Utils будет содержать все функции общего назначения, преобразования между
типами OpenGL и Hipmunk.
302 | Глава 20: Императивное программирование
20.5 Детализируем функции обновления состояния игры
Начнём с восприятия:
module World where
import qualified Physics.Hipmunk as H
import Data.Maybe
import Types
import Utils
import Pure
import Dirty
percept :: Dirty -> IO (Sense, [Event])
percept a = do
hero
<- obj2hero $ dirtyHero a
balls
<- mapM (uncurry obj2ball) $ setIds dirtyObjs a
evts1
<- fmap maybeToList $ getTouch (dirtyTouchVar a) $ dirtyObjs a
evts2
<- fmap maybeToList $ getClick $ dirtyMouse a
return $ (Sense hero balls, evts1 ++ evts2)
where setIds = zip [0.. ]
-- в Dirty.hs
obj2hero
:: Obj -> IO HeroBall
obj2ball
:: Id -> Obj -> IO Ball
getTouch