2017-09-30 4 views
2

J'essaye de faire le code 10 PRINT avec Quil. J'essaie de transformer ce code du twitter poste https://twitter.com/ACharLuk/status/913094845505445890 qui utilise lunaMettre à jour l'état avec si sur Quil

enter image description here

Ceci est mon code pour elle

(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] 
      ) 

Et il apparaît juste comme ça. J'ai essayé de diviser la mise à jour des états, mais il est dit que vous ne devez pas avoir des variables dupliqués pour être mis à jour

enter image description here

Merci.

+1

projet Great exemple! Vous devriez envisager de soumettre une capture d'écran ou un lien vers https://twitter.com/hashtag/10print – JeremyDouglass

+1

@JeremyDouglass: J'ai fait, mais j'ai oublié de hashtag: D – Ampersanda

Répondre

3

Votre code est dans la bonne direction et vous avez réussi à dessiner la première ligne. Il s'est écrasé quand update-state a été appelé. Pour corriger le code, je l'ai fait les choses suivantes:

  • Clojure travaille avec des fonctions pures où vous ne pouvez pas « régler » les valeurs que vous semblez voulu faire update-state (avec do que la dernière expression est renvoyée, pas deux valeurs). Pour update-state vous devez retourner un nouvel état. Les fonctions
  • et q/widths sont des fonctions qui retournent la hauteur et la largeur, appelez-les (entourez-les par des parenthèses) pour extraire le nombre.
  • Lorsque vous redessinez l'arrière-plan dans update-state, les anciennes lignes ont disparu, mettez (q/background 0) dans setup.
    • Déplacez (q/no-loop) de update-state vers le point d'entrée draw-state du programme.

Et je stylistiquement changé ceci:

Ci-dessous la version de travail:

(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

+0

wow. je vous remercie pour la réponse étonnante .. j'ai appris plus que je ne le pense .. ça marche! J'essaie de comprendre le flux avec le langage fonctionnel dont j'ai besoin pour pratiquer plus. Merci :) – Ampersanda

+0

Merci. Bonne chance! –

+2

Très bien! Il est dommage que cela ne fonctionne pas comme sur Quil.info http://quil.info/sketches/create - Je me demande ce qu'il faudrait pour l'adapter et l'afficher dans la galerie? – JeremyDouglass