在Clojure中建模游戏UI屏幕

时间:2013-10-19 02:56:18

标签: clojure functional-programming lisp state quil

我正在尝试使用Quil在Clojure中编写游戏。

(qc/defsketch sketch
  :title "My Game"
  :size [800 600]
  :setup #(qc/smooth)
  :draw draw
  :mouse-pressed mouse-pressed
  :key-pressed key-pressed)

(我可以使用(def position (atom 0))(swap! position inc)以及@position制作移动球,但我不知道如何缩放它。)

请注意,我向草图提供了绘图(和输入处理程序)的功能。如果我只是快速草图,一个draw函数就可以了。

但在我的游戏中,我需要根据主菜单,指令,关卡选择器或游戏是否为活动视图来绘制不同的内容。其中一些(主要是游戏视图)需要有与之相关的数据,这些数据将在每次抽奖中更新。

我该如何解决这个问题?我读的关于Clojure越多,我就越困惑。 (每个视图应该是一个满足协议的记录吗?它们应该存储为原子,还是应该将它们的内部状态存储为原子?或者游戏模拟状态应该是一个单独的原子 - 除了我不希望它占用内存直到游戏视图被激活...)这在OOP中会很容易,但我想学习函数式编程。

更新

如果您对我最终做的事情感兴趣,请参阅Mini Pinions

1 个答案:

答案 0 :(得分:1)

博文http://stevelosh.com/blog/2012/07/caves-of-clojure-02/描述了一种我觉得在这里运作良好的设计。游戏UI是记录的堆栈(矢量)。在那篇博客文章中,他们没有实现协议,而是使用draw-ui multimethod调度UI(主屏幕,指令等)。但是您可以根据需要修改它。该设计使用记录来建模状态。

请记住,并不总是需要在Clojure中建立一个引用类型(var,atom,ref,agent)来建模状态。