Просто чтобы повозиться с библиотекой Haskell Gloss, я написал:
import Graphics.Gloss
data World = World { worldBugs :: [Picture] }
bug :: Point -> Float -> Picture
bug (x, y) s =
let head = Translate x (y - s) $ Circle (s * 0.8)
body = Translate x (y + s) $ Circle (s * 1.2)
in pictures [head, body]
main = play (InWindow "Animation Test" (400, 400) (100, 100)) white 10
(World . map (\(n,b) -> Translate (n * 20) (n * 20) $ b) $ zip [0..] $ replicate 100 $ bug (0,0) 100)
(\world -> pictures $ worldBugs world)
(\event world -> world)
(\time (World bs) -> World $ map (Rotate (time * 10)) bs)
В котором отображаются некоторые «жуки» (два круга, образующие голову и туловище), которые вращаются с течением времени. Проблема в том, что через пару секунд работы он вылетает с:
Gloss / OpenGL Stack Overflow "after drawPicture."
This program uses the Gloss vector graphics library, which tried to
draw a picture using more nested transforms (Translate/Rotate/Scale)
than your OpenGL implementation supports. The OpenGL spec requires
all implementations to have a transform stack depth of at least 32,
and Gloss tries not to push the stack when it doesn't have to, but
that still wasn't enough.
You should complain to your harware vendor that they don't provide
a better way to handle this situation at the OpenGL API level.
To make this program work you'll need to reduce the number of nested
transforms used when defining the Picture given to Gloss. Sorry.
что, если я правильно понимаю, в основном означает, что в конечном итоге в стек помещается слишком много преобразований, и он переполняется. Он отмечает, что это может быть аппаратное ограничение (у меня Surface 2 Pro), так что я SOL? Он не делает этого при использовании animate
, но это, вероятно, связано с тем, что он не передает состояние каждый тик.
Если я собираюсь сделать игру, мне придется использовать play
для передачи состояния на следующий такт; Я не могу основывать все на времени. Есть ли способ обойти это? Гугление ошибки почти ничего не дает.