3

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)

時間の経過とともに回転する「バグ」 (頭と胴体を形成する 2 つの円) が表示されます。問題は、数秒実行した後、次のようにクラッシュすることです。

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、状態を次のティックに渡すために使用する必要があります。すべてを時間に基づいて行うことはできません。これを回避する方法はありますか?エラーをグーグルで調べても、ほとんど何も得られません。

4

1 に答える 1