2009-08-25 20 views
4

我正在通过限制自己不使用set!来学习Gambit-C Scheme中的函数式编程。我认为使用这种环境编写一个小型的OpenGL游戏可能很有趣,这似乎很适合游戏开发。功能GLUT?

但是,使用OpenGL和GLUT时,似乎很难坚持功能风格并避免全局状态。我不认为这是游戏编程本身的根本限制,但是基于回调的API(如GLUT)在功能编程方面似乎不太适用。

例如,我试图将世界视为变异状态向量的流,这是一个时间步和用户输入事件交错列表的函数。这个想法似乎没有问题,但对于异步编程似乎并不容易。例如,我必须为GLUT的显示功能注册一个回调函数,它应该以某种方式访问​​此流中的“当前”项目。与此同时,没有任何东西可以通过从中推动流向前进。在理想情况下,我需要一些“外部”GLUT,一种主要功能,它在某种程度上取决于(或者一次)各种GLUT功能。如何在GLUT周围开发这样一种风格的游戏引擎,或者另一种问题是我怎样才能最成功地将GLUT与我的引擎隔离开来?是否有可能让GLUT生成这样一个交错的事件列表到外部程序?比如,Haskell如何处理这个问题?

回答

3

你将很难实现一个功能图形系统。甚至连GLUT的Haskell绑定都使用命令式编程,通过IO monad。我听过的最接近的东西是Functional Reactive Programming,但是图书馆还没有准备好黄金时段,现在却严重缺乏现实世界的教程。

1

对于像状态机这样的状态机来说,它具有状态非常有趣!

当副作用将东西集合到屏幕上时,我不知道如何使用副作用免费函数式编程。

+0

这里的问题并不是太多的副作用,而是如何处理GLUT在需要完成某些操作时异步回调的事实,而不是建立功能依赖关系。我想知道是否有一种方法可以让GLUT从某种外部GLUT的角度出现,但也许这不是一个非常明确的想法。 – Steve 2009-08-26 00:07:55

+0

对不起,我没有使用GLUT超出字体插件的OpenGL。我正在考虑openGL弹出/推送状态。 不能真的帮助你。 – 2009-08-26 15:05:02

+0

>当副作用将一些东西绘制到屏幕上时,我看不出如何进行无副作用的函数式编程。 虽然最终的输出步骤吸引了一些东西(“打印”),但我们用纯数字方式编程。同样,功能图形的关键在于提供一种数据类型,它具有丰富有用的代数,其中组合(编程模型)发生,具有精确和易处理的语义并且没有副作用。然后不要担心绘画比你担心如何打印数字更多。 – Conal 2010-04-01 00:16:16

2

你可以看看FieldTrip函数库的一些想法。

0

写完这个问题让我想起了一点,我开始怀疑答案是否在利用共同例程。如果游戏是由GLUT空闲和显示调用触发的功能协同例程,这将非常好地将游戏逻辑从GLUT的架构中分离出来。例如,它很可能是这样设置的!无法避免,但如果使用GLUT回调设置!只是为了修改正在输入协同例程的流,这可能会创建一个非常好的边界。对此有何想法?在知道更多信息之前,我必须得到更多的经验。

+0

从我记得使用call/cc读取协程的实现时,我认为你仍然必须在你的协程库中使用'set!'方法。我不会让它打扰你。 :)尽可能多地隐藏状态变化仍然可能会清理你的代码。 – 2009-08-26 04:52:02

+0

是的,我想我开始喜欢这个想法。如果我无法摆脱set!,那么下一个最好的办法就是尽可能地将它与GLUT保持接近,同时通过将它表示为看起来像懒惰列表的单个函数来疏远我的代码。 GLUT部分就是一个懒惰事件列表的生成器。处理它,无论如何.. :) – Steve 2009-08-26 12:32:50