Opengl 强制内置到其GL等效项
我刚刚在哈斯凯尔写了一篇康威的《生活游戏》,我想我现在应该把它制作成动画 我想使用GLUT+OpenGL,几秒钟后用谷歌搜索,我有了一个例子,准备好了。示例中的不同之处在于,它定义了一个函数,该函数返回一些点作为Opengl 强制内置到其GL等效项,opengl,haskell,types,casting,functional-programming,Opengl,Haskell,Types,Casting,Functional Programming,我刚刚在哈斯凯尔写了一篇康威的《生活游戏》,我想我现在应该把它制作成动画 我想使用GLUT+OpenGL,几秒钟后用谷歌搜索,我有了一个例子,准备好了。示例中的不同之处在于,它定义了一个函数,该函数返回一些点作为myPoints::[(GLfloat,GLfloat,GLfloat)],而我将Coord定义为data Coord=Coord{x::Int,y::Int}派生(Show,Eq)。这一切都很好和整洁,游戏似乎在其简单的形式工作,但有问题,当我试图画它。即我应该将点传递给渲染器的部分:
myPoints::[(GLfloat,GLfloat,GLfloat)]
,而我将Coord
定义为data Coord=Coord{x::Int,y::Int}派生(Show,Eq)
。这一切都很好和整洁,游戏似乎在其简单的形式工作,但有问题,当我试图画它。即我应该将点传递给渲染器的部分:
renderPrimitive Points$mapM\(\(x,y,z)->顶点$Vertex3 x y z)myPoints
如果myPoints
包含类型为GLfloat
的值,但renderPrimitive Points$mapM\(\(坐标x y)->顶点$Vertex2 x y)mycords
抱怨:
No instance for (VertexComponent Int)
arising from a use of `vertex'
Possible fix: add an instance declaration for (VertexComponent Int)
我尝试了类似于积分x的和添加一个类型签名::GLfloat
或GLint
的方法,但它似乎总是抱怨它不能接受类型,或者不能进入Int->GLfloat/GLint
我的问题是,如何让我的Coord类型使用OpenGL类型?我在网上找不到任何提示,我也不想做Coord=Coord{x::GLfloat,y::GLfloat}
,原因很简单,所有其他代码都不能很好地使用GLfloat,因为它们都需要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
主模块
哪里
导入Graphics.Rendering.OpenGL
导入Graphics.UI.GLUT
数据坐标=坐标{x::Int,y::Int}派生(Show,Eq)
someCoords=[Coord11,Coord12,Coord427]
main=do
(progName,)顶点$Vertex2 x y)某些坐标
在与我家的另一位程序员进行了较长时间的搜索之后,我们发现了一段代码,可以让我们从int中生成GLfloat,即from integral x::GLfloat
将产生所需的结果。类似地,fromRational
可用于Float->GLfloat
fromrintegral
可用于整数类型之间的转换,如Int
、Integer
、Word
等。realToFrac
可能是在Float
之间转换的最优化函数,Double
,GLfloat
等。