Clojure中的游戏UI屏幕建模

Clojure中的游戏UI屏幕建模,clojure,functional-programming,lisp,state,quil,Clojure,Functional Programming,Lisp,State,Quil,我正在尝试用Clojure编写一个游戏 (我可以使用(def position(atom 0))和(swap!position inc)和@position制作一个移动球,但我不知道如何缩放。) 请注意,我为草图提供了一个用于绘图(和输入处理程序)的函数。如果我只是做一个快速的草图,一个draw函数就可以了 但在我的游戏中,我需要根据主菜单、指令、关卡选择器或游戏是活动视图来绘制不同的内容。其中一些(主要是游戏视图)需要与之关联的数据,这些数据将在每次平局中更新 我该怎么办?我读的关于Cloju

我正在尝试用Clojure编写一个游戏

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

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

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

我该怎么办?我读的关于Clojure的书越多,我就越困惑。(每个视图应该是一个符合协议的记录吗?它们应该存储为原子吗?它们的内部状态应该存储为原子吗?或者游戏模拟状态应该是一个单独的原子吗?除非我不希望它在激活游戏视图之前占用内存…)这在OOP中非常简单,但是我想学习函数式编程

更新

如果你对我最后做的事情感兴趣,请参阅。

这篇博客文章描述了一个我认为在这里很有用的设计。游戏UI是记录的堆栈(向量)。在那篇博文中,他们没有实现协议,而是在某种ui(主屏幕、指令等)上调度一个DrawUI多方法。但是,您可以根据自己的喜好进行修改。该设计使用记录对状态进行建模

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

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