简单的Haskell图形库?

14

我想尝试一下Haskell,并希望写一个小的2D街机游戏(俄罗斯方块或打砖块)。 您能推荐一个简单的图形库,以便我快速入门吗?

顺便说一句,我已经尝试过SDL和wxWidgets,但由于依赖问题,还没有成功运行任何示例,正在处理中...


1
非常重要的一件事是下载Cabal Install。如果没有它,依赖管理将变得非常糟糕。 - Rayne
Cabal很棒 - 你一定要下载它。但它并不能解决缺少底层本地库的问题。许多库(例如wxWidgets,OpenGL,可能是GTK)根本没有包含在Cabal包中。 - rtperson
我刚看了一眼Haskell的GTK2HS,它包含了完整的GTK堆栈(这很好)。不幸的是,它没有Cabal软件包(不太好),而且它的安装程序需要GHC 6.10.3。不是“6.10.3或更高版本”,只是“6.10.3”。虽然很容易解决,但还是有点烦人... :P - rtperson
更好的答案:https://dev59.com/Rm035IYBdhLWcg3wH8Ql - Don Stewart
@Don Stewart:同意——另一个答案更好,甚至超过了这里所说的一切。 - rtperson
3个回答

11

这并不是一个“简单”的库,但是关于OpenGL和GLUT的信息在线上有很多,还有一些非常好的教程和大量的示例代码。

你面临的最大问题是Haskell中的OpenGL和GLUT绑定不包含它们所绑定的库。(wxWidgets也是如此。) 很多Linux发行版都打包了OpenGL二进制文件,但Windows没有。虽然Haskell平台应该可以解决这个问题,但对我来说好像并没有。

因此,假设你正在安装Windows,我建议你尝试以下方法:

  1. 按照这篇博客中的说明进行操作。它们很复杂——涉及到MinGW、MSys的安装以及从SourceForge手动编译GLUT项目,但这是我让OpenGL工作的唯一方法。我已经在三台不同的机器上成功安装过,包括XP和Vista,所以我可以毫不犹豫地说这些指南非常好。
  2. 一旦它工作了,看看这两个令人惊叹的教程。它们真正让我认识到Haskell在图形方面有多么强大。你会发现涉及的代码比你预期的简单得多。
  3. 查看Haskell OpenGL页面上的样例游戏。它们非常实验性——这很好,因为这意味着需要浏览的代码比生产系统中要少——但它们也非常复杂。(是的,已经有不止一个肉眼可以看出来的俄罗斯方块实现了,但不要让这阻止你。)
  • 另一个获取示例代码的好方法是Haskell的GLUT绑定本身。查找示例目录,您会找到许多从OpenGL红书移植的示例代码。
  • OpenGL非常状态化,如果您尚未完全掌握Monad,可能会发现Haskell代码有些令人生畏。我正在利用我的OpenGL实验来激励自己最终理解这个概念。

    祝你好运!


    OpenGL状态全部在IO单子中,因此练习可能有助于处理单子的基础知识,但在尝试推广到执行远比仅跟踪世界状态更有用的其他单子时并没有帮助。 - ephemient
    我并不是要抱怨太多,OpenGL/GLUT似乎是OP的一个不错的起点,尽管它不是非常Haskell-ish。个人而言,我使用带有GtkGlArea绑定的Gtk2Hs,因为它比原始的GLUT更好用,但一旦你深入到OpenGL本身,处理窗口的方式就无关紧要了。 - ephemient
    我还没有尝试过GTK。我先让wxWidgets工作起来,所以我的UI实验都是用它完成的。但是我会根据你的建议去尝试一下。我同意你关于monad的看法——IO monad是一个相当无聊的东西,但这是一个开始的地方。我的最终目标是逐步掌握arrow,以便我可以尝试使用Yampa进行反应式编程。现在所有的概念都在我头顶上飞过,但我正在努力将它们拼凑在一起。 - rtperson
    1
    对于使用较新版本进行简单设置,请查看http://openwires.blogspot.in/2012/10/opengl-glut-in-haskell-on-windows-okay.html。 - FUD
    cabal install gloss,你就有了一个简单的图形库,它可以在opengl之上工作。我认为不需要谈论mingw和cygwin。Gloss在我的Windows上运行良好,安装也没有什么复杂的地方。它只是能够正常工作(在我的Windows 10上)。 - BitTickler
    显示剩余2条评论

    4

    你是否阅读了以下列表:

    Haskell图形库: 这里有相当多的OpenGL、SDL和其他图形库的接口。

    Haskell GUI: 这里也有一些wxWidget库。


    1

    开罗是用C语言编写的,但也有Haskell绑定,或许尝试一下会是个好主意。我只用过它的Python绑定,但那些似乎很好用。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接