1

如何创建所有内容都是用 png 序列生成的动画的窗口?

我找不到任何适合这个主题的文章。或者,如果我打算在 Clojure 中做一些小游戏,那么使用任何 java 游戏引擎可能会更好吗?你会用什么来实现这个目标?

4

1 回答 1

5

让我们改编一个来自 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 更新为新图像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

于 2012-11-19T18:28:31.007 回答