是否存在满足以下要求的 Haskell 图形库或绑定到外部库:
- 可以使用从
ghci
,即我不必链接并重新启动程序。
- 适用于 MacOS X。(与 1 结合使用很棘手!)
- 可以制作简单的矢量图形(线条、多边形、简单的填充和描边)。
- 可以将位图图像放在屏幕上。示例:blit 17x12 .bmp 图像。
?
请包含一个最小的源代码示例或对其的引用(只是屏幕上的一个窗口,可能在里面画了一条绿线),以便我可以特别检查第 1 点和第 2 点。另外,如果这些功能请求之一更详细(例如 OpenGL + 4),请提供一份很好的参考。
PS:关于1和2,我知道enableGUI
我愿意使用它。但是,大多数库都存在无法运行的问题main
多次运行,因此不符合资格。
Edit:为了避免浪费您的时间,这里列出了我尝试过的软件包:
-
wx http://hackage.haskell.org/package/wx- ghci 窒息
libstdc++
-
sdl http://hackage.haskell.org/package/SDL- 重新定义
main
成为一个宏。仅编译时。
-
GLFW http://hackage.haskell.org/package/GLFW(OpenGL) - 无法运行
main
两次,关于“失败,因为它无法安装鼠标事件处理程序”。
编辑:实际上,我不再确定。几个版本之后,GLFW 似乎不再在 OS X 上的 GHCi 中工作。
事实证明,GLFW+OpenGL 满足了所有四个要求!
- 您需要调用 ghci
ghci -framework Carbon
.
- 你需要
EnableGUI.hs
文件,您可以获得here https://hackage.haskell.org/package/Euterpea-1.1.0/src/Euterpea/Examples/EnableGUI.hs。请注意,您无法将其直接加载到 GHCi 中,您必须首先对其进行编译。
- OpenGL 有一个 2D 投影模式,您可以在其中绘制直线和多边形。
- 位图可以作为纹理加载并放置在多边形上。
这是一个将位图放到屏幕上的小示例。位图有一些限制:它的尺寸必须是 2 的幂(这里是 256)并且它必须是.tga
文件(此处"Bitmap.tga"
)。但由于支持透明度,所以这不是什么大问题。
你应该可以打电话main
多次没有问题。关键是你不应该打电话GLFW.terminate
.
import Graphics.Rendering.OpenGL as GL
import qualified Graphics.UI.GLFW as GLFW
import Graphics.Rendering.OpenGL (($=))
import Control.Monad
import EnableGUI
main = do
enableGUI
GLFW.initialize
-- open window
GLFW.openWindow (GL.Size 400 400) [GLFW.DisplayAlphaBits 8] GLFW.Window
GLFW.windowTitle $= "Bitmap Test"
-- enable alpha channel
GL.blend $= GL.Enabled
GL.blendFunc $= (GL.SrcAlpha, GL.OneMinusSrcAlpha)
-- set the color to clear background
GL.clearColor $= GL.Color4 0.8 0.8 0.8 0
-- set 2D orthogonal view inside windowSizeCallback because
-- any change to the Window size should result in different
-- OpenGL Viewport.
GLFW.windowSizeCallback $= \ size@(GL.Size w h) ->
do
GL.viewport $= (GL.Position 0 0, size)
GL.matrixMode $= GL.Projection
GL.loadIdentity
GL.ortho2D 0 (realToFrac w) (realToFrac h) 0
render <- initialize
loop render
GLFW.closeWindow
loop render = do
-- draw the entire screen
render
-- swap buffer
GLFW.swapBuffers
-- check whether ESC is pressed for termination
p <- GLFW.getKey GLFW.ESC
unless (p == GLFW.Press) $ do
-- sleep for 1ms to yield CPU to other applications
GLFW.sleep 0.001
-- only continue when the window is not closed
windowOpenStatus <- GLFW.getParam GLFW.Opened
unless (windowOpenStatus == False) $
loop render
-- rendering
initialize = do
-- load texture from file
GL.texture GL.Texture2D $= Enabled
[textureName] <- GL.genObjectNames 1
GL.textureBinding GL.Texture2D $= Just textureName
GL.textureFilter GL.Texture2D $= ((GL.Nearest, Nothing), GL.Nearest)
GLFW.loadTexture2D "Bitmap.tga" []
return $ do
GL.clear [GL.ColorBuffer]
GL.renderPrimitive GL.Quads $ do
GL.texCoord $ texCoord2 0 0
GL.vertex $ vertex3 (0) 256 0
GL.texCoord $ texCoord2 0 1
GL.vertex $ vertex3 (0) (0) 0
GL.texCoord $ texCoord2 1 1
GL.vertex $ vertex3 256 (0) 0
GL.texCoord $ texCoord2 1 0
GL.vertex $ vertex3 256 256 0
-- type signatures to avoid ambiguity
vertex3 :: GLfloat -> GLfloat -> GLfloat -> GL.Vertex3 GLfloat
vertex3 = GL.Vertex3
texCoord2 :: GLfloat -> GLfloat -> GL.TexCoord2 GLfloat
texCoord2 = GL.TexCoord2
color3 :: GLfloat -> GLfloat -> GLfloat -> GL.Color3 GLfloat
color3 = GL.Color3
这是一个示例位图(您需要将其转换为.tga
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)