52700.fb2 Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 335

Учебник по Haskell - читать онлайн бесплатно полную версию книги . Страница 335

, dirtyMouse

:: 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