3

我刚刚在 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 那很好:myPointsGLfloatrenderPrimitive 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 一起使用,因为它是所有预期的NumInt诸如此类的东西。

下面是说明问题并且我希望能够编译的最小场景:

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 回答