3

私は練習のためにHaskellで簡単なコンウェイのライフゲームを書いたところですが、今はそれをアニメートする必要があります。

GLUT + OpenGLを使用したかったのですが、数秒後にグーグルを使用しました。例を挙げて、起動する準備ができました。この例の違いは、私が定義したのmyPoints :: [(GLfloat,GLfloat,GLfloat)]に対して、いくつかのポイントを返す関数を定義していることです。それはすべて素晴らしく、きちんとしていて、ゲームはそのプレーンな形で動作しているように見えますが、私がそれを描画しようとすると問題があります。つまり、ポイントをレンダラーに渡すことになっている部分です。type の値が含まれている 場合は問題ありませんが、次のように文句を言います。Coorddata Coord = Coord {x :: Int, y :: Int} deriving (Show, Eq)renderPrimitive Points $ mapM_ (\(x, y, z)->vertex$Vertex3 x y z) myPointsmyPointsGLfloatrenderPrimitive Points $ mapM_ (\(Coord x y)->vertex$Vertex2 x y) myCoords

No instance for (VertexComponent Int)
  arising from a use of `vertex'
Possible fix: add an instance declaration for (VertexComponent Int)

fromIntegral x型シグネチャを追加するなどのことを試しましたが、型を取得できない、:: GLfloatまたはGLintInt-> GLfloat/GLintに移動できないと常に不平を言っているようです。

私の質問は、CoordタイプをOpenGLタイプで再生するにはどうすればよいですか?Webでヒントを見つけることができずCoord = Coord {x :: GLfloat, y :: GLfloat}、他の多くのコードがGLfloatsでうまく機能しないという単純な理由で、それがすべて期待されているNumかどうかにかかわらず、作成したくありませんInt

以下は、問題が示されている最小のシナリオであり、コンパイルできるようにしたいと思います。

module Main
where

import Graphics.Rendering.OpenGL
import Graphics.UI.GLUT

data Coord = Coord {x :: Int, y :: Int} deriving (Show, Eq)

someCoords = [Coord 1 1, Coord 1 2, Coord 42 7]

main = do
  (progName, _) <- getArgsAndInitialize
  createWindow "Please compile."
  displayCallback $= display
  mainLoop

display = do
  clear [ColorBuffer]
  renderPrimitive Points $ mapM_ (\(Coord x y) -> vertex $ Vertex2 x y) someCoords
4

1 に答える 1

2

私の家族の別のプログラマーと長い間探した後、intからGLfloatを作成できるコードのスニペットを見つけました。つまりfromIntegral x :: GLfloat、目的の結果が得られます。同様に、fromRationalに使用できますFloat -> GLfloat

于 2012-08-28T22:21:43.357 に答える