On May 15, 2010, at 4:56 PM, islon wrote: > I'm working in a simple single-thread console-based rpg game in > clojure (a port from my own scala version) > and didn't want to use any concurrency structure because the game is > single threaded. > I was thinking about a macro like > > (defmacro set!! [s val] > `(def ~s ~val)) > > so I can set my game state without using transactions, agents, etc. > Any comments about it?
I wrote a Pong clone in Clojure just to stretch my mind a bit. Here's what I do: The entire game world is a single struct-map (may become a record at some point), stored in a global ref. When my world-update timer fires, I deref the world and then pass it to my world-updater functions. These updaters return the new world state, which I then set via ref-set. This is almost as simple as the usual global vars approach, and allowed me to trivially split the world-drawing code into another thread that runs on a different schedule. It also permits stuff like printing out or saving the entire world state very easily. Actually, were it not for Swing, I wouldn't even be using mutable structures at all-- I'd be passing the world state from update to update using tail-recursion. You might also be interested in these links: http://nakkaya.com/2009/12/19/cloning-pong-part-1/ (I originally based my Pong game on this code) http://jng.imagine27.com/articles/2009-09-12-122605_pong_in_clojure.html (cloning Pong is apparently pretty popular!) http://briancarper.net/blog/making-an-rpg-in-clojure-part-one-of-many (site down at the moment) http://prog21.dadgum.com/23.html (not Clojure, but interesting for functional games in general) -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en