0

我正在尝试使用 Clojure Quil 库创建加载图像到小程序。当我存储加载图像参考并将其与image调用一起使用时,在加载期间它可以工作。但是,当我加载并在绘图中显示时,它不起作用。

这有效:

(ns img-demo.core
  (:require [quil.core :as q]))

(def img (ref nil))

(def img-url "https://dummyimage.com/100x100/2c3e50/ffffff.png")

(defn setup []
  (q/background 0)
  (dosync (ref-set img (q/load-image img-url))))

(q/defsketch example
  :title "image demo"
  :setup setup
  :draw #(q/image @img 0 0)
  :size [600 600])

这是行不通的,

(ns img-demo.core
  (:require [quil.core :as q]))

(def img-url "https://dummyimage.com/100x100/2c3e50/ffffff.png")


(q/defsketch example
  :title "image demo"
  :draw #(q/image (q/load-image img-url) 0 0)
  :size [600 600])

在后一种情况下,我理解load-image应该调用 inside quil.applet/with-applet。由于它发生在内部defsketch,我希望它会自动处理或至少抛出一个 NPE。为什么它不工作?

4

1 回答 1

0

load-imagedraw异步加载图像,因此它在第二个示例中不起作用的原因是因为调用时图像尚未加载。您可以通过在调用之前使用该loaded?函数进行分支来检查image

(q/defsketch example
             :title "image demo"
             :draw #(let [img (q/load-image img-url)]
                      (if (q/loaded? img)
                        (q/image img 0 0)
                        (q/ellipse 100 100 100 100)))
             :size [600 600])

运行上面的代码,你会看到一个圆圈正在绘制,因为img还没有加载。您也不会得到空指针异常,因为load-image它没有返回- 它只是在调用nil之前没有完成加载图像。draw因此,所发生的只是没有在空白画布上绘制任何内容。

这就是为什么通常建议在其中加载图像setup(以及为什么您的第一个示例有效)。在之前setup执行,这保证了在被调用时已经加载了图像。 drawdraw

于 2020-07-04T16:33:51.103 回答