我正在尝试使用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中很容易,但我想学习函数式编程。
更新
如果您对我最终做的事情感兴趣,请参阅迷你小齿轮。
博客文章 http://stevelosh.com/blog/2012/07/caves-of-clojure-02/描述了一个我认为在这里可以很好地工作的设计。游戏 UI 是记录的堆栈(向量)。在该博客文章中,他们没有实现协议,而是在UI类型(主屏幕,指令等)上调度draw-ui多方法。但是,您可以根据需要修改此设置。设计使用记录对状态进行建模。
请记住,并不总是需要达到引用类型(var,atom,ref,agent)来在Clojure中建模状态。