Моделирование игровых интерфейсов в Clojure
Я пытаюсь написать игру на Clojure, используя Quil.
(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, тем больше путаюсь. (Должно ли каждое представление быть записью, удовлетворяющей протоколу? Должны ли они храниться в виде атомов или их внутреннее состояние должно храниться в виде атомов? Или состояние симуляции игры должно быть отдельным атомом - за исключением того, что я не хочу, чтобы он занимал память пока не активируется вид игры...) Это было бы так просто в ООП, но я хочу научиться функциональному программированию.
Обновить
Если вы заинтересованы в том, что я в конечном итоге сделал, см. Мини-шестерни.
1 ответ
В блоге http://stevelosh.com/blog/2012/07/caves-of-clojure-02/ описывается дизайн, который, я думаю, будет хорошо работать здесь. Игровые интерфейсы - это стек (вектор) записей. В этом сообщении в блоге они не реализуют протокол, вместо этого мультиметод от Draw-Ui отправляет информацию о типе пользовательского интерфейса (главный экран, инструкции и т. Д.). Однако вы можете изменить это, как вам угодно. Проект использует записи для моделирования состояния.
Помните, что не всегда необходимо обращаться к ссылочному типу (var, atom, ref, agent) для моделирования состояния в Clojure.