在Quil上使用if更新状态

时间:2017-09-30 02:55:01

标签: clojure processing quil

我正在尝试使用Quil创建10 PRINT代码。我尝试从使用luna

的twitter帖子https://twitter.com/ACharLuk/status/913094845505445890转换此代码

enter image description here

这是我的代码

(ns tenprint.core
  (:require [quil.core :as q]
            [quil.middleware :as m]))

(defn setup []
  (q/frame-rate 30)
  (q/color-mode :hsb)
  {:x 0
   :y 0
   :scale 20
   }
  )

(defn update-state [state]

  (let [x (:x state) y (:y state) s (:scale state)]
    {
     :x (do (+ x s) ((if (>= x q/width) 0)))
     :y (do (if (>= x q/width) (+ y s)) (if (>= x q/height) (+ y s)))
     :scale (+ s 0)
     }
    )
  )

(defn draw-state [state]
  (q/background 0)

  (q/stroke 255)

  ;(q/line 0 10 10 0)

  (let [x (:x state) y (:y state) s (:scale state)]
    (if (> (rand) 0.5)
      (q/line x y (+ x s) (+ y s))
      (q/line x (+ y s) (+ x s) y)
      )
    )
  )

(q/defsketch tenprint
             :title "10PRINT"
             :size [500 500]
             :setup setup
             :update update-state
             :draw draw-state
             :settings #(q/smooth 2)
             :features [:keep-on-top]
             :middleware [m/fun-mode]
             )

它就像这样。我试图拆分状态的更新,但它说你不能有重复的变量来更新

enter image description here

谢谢。

1 个答案:

答案 0 :(得分:4)

您的代码方向正确,您设法绘制第一行。调用update-state时崩溃了。为了修复代码,我做了以下事情:

  • Clojure适用于纯粹的功能,你无法设置"您似乎想要在update-state中执行的值(使用do仅返回最后一个表达式,而不是两个值)。要update-state,你需要返回一个全新的状态。
  • q/heightq/widths是返回高度和宽度的函数,因此请调用它们(用括号括起来)以获取数字。
  • 当您在update-state中重新绘制背景时,较旧的行已消失,因此将(q/background 0)放入setup
    • (q/no-loop)update-state移至该计划的draw-state入口点。

风格上我改变了这个:

工作版本下方:

(ns tenprint.core
  (:require [quil.core :as q]
            [quil.middleware :as m]))

(defn setup []
  (q/background 0) ; move setting background to setup, otherwise the state is overwritten
  (q/frame-rate 30)
  (q/stroke 255)
  (q/color-mode :hsb)
  {:x 0
   :y 0
   :scale 20})

(defn update-state [{:keys [x y scale] :as state}] ; destructure
  ;; height and width are functions you need to `(call)` to get the value
  {:x (if (>= x (q/width)) 0 (+ x scale)) ; fix if-statements
   :y (if (>= x (q/width)) (+ y scale) y) ; 'do' does something different than you think
   :scale scale}) ; no need to add 0

(defn draw-state [{:keys [x y scale] :as state}] ; destructure
  (if (>= y (q/height))
    (q/no-loop)
    (if (> (rand) 0.5)
      (q/line x y (+ x scale) (+ y scale))
      (q/line x (+ y scale) (+ x scale) y))))      

(q/defsketch tenprint
  :title "10 PRINT"
  :size [500 500]
  :setup setup
  :draw draw-state
  :update update-state
  :features [:keep-on-top]
  :middleware [m/fun-mode])

10PRINT