我刚刚在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 /闪烁。
我的问题是,如何让我的Coord类型与OpenGL类型一起玩?我在Web上找不到任何提示,我宁愿不做Coord = Coord {x :: GLfloat, y :: GLfloat}
,原因很简单,因为很多其他代码都不能很好地与GLfloats一起使用,因为它们都期待Num
或{ {1}}等等。
下面是说明问题并且我希望能够编译的最小情况:
Int
答案 0 :(得分:2)
在与我家中的另一个程序员打猎一段时间之后,我们找到了一段代码,让我们从一个int中创建GLfloat,即fromIntegral x :: GLfloat
将产生所需的结果。同样,fromRational
可用于Float -> GLfloat
。