Arantium Maestum

プログラミング、囲碁、読書の話題

ClojureとQuilで"The Matrix"の文字列を作ってみた

例によってProcessing Advent CalendarからQuilで作るネタを漁っている。

今回はこの記事:

Proce55ing.walker,blog » Blog Archive » マトリックスのアレを作ってみよう

このかたは2011年のProcessing Advent Calendar記事の大半を書いていてすごい。今後もお手本にさせていただきたい記事がいくつもある。

Quilでの実装:

Quil -L7utSnDMJjnnJK8gaYg

おおまかにコードを解説していく。

世界の状態の作成

世界の状態は:char-grid, :transparency-grid, :head-positionsの三つのデータ構造を持つmapに保持されている:

(defn setup []
  (q/frame-rate 10)
  (q/color-mode :hsb)
  {:char-grid (make-char-grid)
   :transparency-grid (make-transparency-grid) 
   :head-positions (make-head-positions)})

:char-gridは横40、縦30のグリッドにランダムに文字があてがわれている。データ構造としてはVector of 40 Vectors of 30 Character Strings。

:transparency-grid:char-gridと同じ形のVector of 40 Vectors of 30 Integers range 10~200。各文字の透明度。

:head-positionsVector of 40 Integers range -1~30。各列のどこが最先端かを表す。-1だと最先端は画面外という意味になる。

各フレームごとの状態更新

各フレームごとに世界の状態をアップデートしていく:

(defn update-state [state]
  (-> state
      modify-transparency-grid
      modify-head-positions
      modify-heads-transparencies))

まず:transparency-gridの各列の各要素を10ずつ下げる(10以下になる場合は10のまま残す)。

:head-positionsの各要素が画面内なら+1、画面から出るなら-1、-1なら一定確率で0にする。

最後に各列のheadのtransparencyを200に変更する。

各フレームごとの描画

そして描画:

(defn draw-state [state]
  (q/background 0)
  (draw-grid
    (:char-grid state)
    (:transparency-grid state)))

この関数はあまり気の利いたことはしていない。transparencyとchar情報に従って描画しているだけ。transparencyが200の場合のみ、ちょっとずらした白い文字を表示することでアクセントを出している。

感想

文字をところどころランダムで入れ替えるのはやっていない。そんなに難しくはないと思うが力尽きた。

二、三行の関数が多いな・・・ 命名規則をもうちょっとちゃんとしたほうがいいと思った。

あとやはりquil.infoでコードを書くのはめんどくさい。vimでできるように、またちゃんと環境を整えるべきだろう。