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

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

t1 <- get G. elapsedTime

return (World pure’ dirty’, t1 - t0)

where dirty = worldDirty world

pure

= worldPure

world

drawWorld :: World -> IO ()

drawWorld = draw . picture . worldPure

20.3 Определяемся с типами

Давайте подумаем, из чего состоят типы Dirty и Pure. Начнём с Pure. Там точно будет вся информация

необходимая нам для рисования картинки (ведь функция picture определена на Pure). Для рисования нам

необходимо знать положения всех шаров и их типы (они определяют цвет). На картинке мы будем показывать

разную статистику (данные о жизнях, бонусные очки). Также из типа Pure мы будем управлять созданием

шаров. Так мы приходим к типу:

data Pure = Pure

{ pureScores

:: Scores

, pureHero

:: HeroBall

, pureBalls

:: [Ball]

, pureStat

:: Stat

, pureCreation

:: Creation

}

Что нам нужно знать о шаре героя? Нам нужно его положение для отрисовки и модуль вектора скорости

(он понадобится нам при обновлении вектора скорости шара игрока):

data HeroBall = HeroBall

{ heroPos

:: H.Position

, heroVel

:: H.CpFloat

}

Для остальных шаров нам нужно знать только тип шара, его положение и идентификатор шара. По иден-

тификатору потом мы сможем понять какой шар удалить из грязных данных:

data Ball = Ball

{ ballType

:: BallType

, ballPos

:: H.Position

, ballId

:: Id

}

data BallType = Hero | Good | Bad | Bonus

deriving (Show, Eq, Enum)

type Id = Int

Статистика игры состоит из числа жизней и бонусных очков:

data Scores = Scores

{ scoresLives :: Int