2012-11-19 73 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