2012-11-19 72 views
1

如何创建窗口的所有内容都是用png序列生成的动画?在Clojure中渲染png图像序列

我找不到任何适合此主题的文章。或者如果我打算在Clojure上做一些小游戏,也许它会更好地使用任何Java游戏引擎?你会用什么来实现这个目标?

+0

http://stackoverflow.com/questions/233171/what-is-the-best-way-to-do-guis-in-clojure? – noahlz

+0

它比gui编程更关于微不足道的游戏。 – proofit404

回答

5

让我们来适应an example from Wikibooks

(import '(javax.swing JFrame JPanel) 
     '(java.awt Dimension Toolkit) 
     '(java.net URL)) 

(def url 
    (URL. "http://www.gravatar.com/avatar/70fa7ca20ce9cbf4c97bb9538034cef7?s=200&d=identicon&r=PG")) 

(def avatar 
    (ref (-> (Toolkit/getDefaultToolkit) (.getImage url)))) 

(defn image 
    [] 
    @avatar) 

(defn make-panel [] 
    (let [panel (proxy [JPanel] [] 
       (paintComponent [g] 
        (.drawImage g (image) 0 0 this)))] 
    (doto panel 
     (.setPreferredSize (Dimension. 200 200))))) 

(defn make-frame [panel] 
    (doto (new JFrame) 
    (.add panel) 
    .pack 
    .show)) 

(def frame 
    (make-frame (make-panel))) 

现在更新avatar裁判使用ref-set一个新的形象。记得在之后重新画框。

(dosync 
    (ref-set avatar (-> (Toolkit/getDefaultToolkit) (.getImage "image.png")))) 

(.repaint frame) 

现在让我们给它制作动画。

(def images 
    (cycle (map #(-> (Toolkit/getDefaultToolkit) (.getImage %)) 
       ["1.png" "2.png" "3.png"]))) 

(loop [coll images] 
    (when (.isVisible frame) 
    (dosync (ref-set avatar (first coll))) 
    (.repaint frame) 
    (Thread/sleep 100) 
    (recur (rest coll)))) 

我希望这是足够多的让你开始。

说到Java生态系统的游戏引擎,你可能想看看lwjgl

+0

非常感谢。工作正常。 – proofit404