我刚刚在 Haskell 中快速写了一个 Conway 的生命游戏进行练习,我认为我现在应该为它制作动画。
我想使用 GLUT + OpenGL 和几秒钟后的谷歌搜索,我有一个示例并准备启动。该示例的不同之处在于它定义了一个返回一些点的函数,myPoints :: [(GLfloat,GLfloat,GLfloat)]
而我将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 类型一起使用?我在网上找不到任何提示,我宁愿不这样做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