私は練習のためにHaskellで簡単なコンウェイのライフゲームを書いたところですが、今はそれをアニメートする必要があります。
GLUT + OpenGLを使用したかったのですが、数秒後にグーグルを使用しました。例を挙げて、起動する準備ができました。この例の違いは、私が定義したのmyPoints :: [(GLfloat,GLfloat,GLfloat)]
に対して、いくつかのポイントを返す関数を定義していることです。それはすべて素晴らしく、きちんとしていて、ゲームはそのプレーンな形で動作しているように見えますが、私がそれを描画しようとすると問題があります。つまり、ポイントをレンダラーに渡すことになっている部分です。type
の値が含まれている
場合は問題ありませんが、次のように文句を言います。Coord
data Coord = Coord {x :: Int, y :: Int} deriving (Show, Eq)
renderPrimitive Points $ mapM_ (\(x, y, z)->vertex$Vertex3 x y z) myPoints
myPoints
GLfloat
renderPrimitive 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
またはGLint
Int-> 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