ClojureのQuilでflappy bird。第2回
「Nature of Code -Processingではじめる自然現象のシミュレーション」という本を入手して、1章完了まで進めたので、おさらいに、フラッピーバードを作成中。
Clojureを勉強中なので、こうした方がいいよとかあれば、ツッコミお願いします。
前回は、プロジェクトを作成しました。今回は、自機を移動させる処理を作成します。
ベクトルの演算を作る
Nature of Code にならって、移動に関する値はベクトルとして扱おうと思います。
本家Processingにはベクトルを表すPVectorをいうクラスがあり、ベクトルの加算などのメソッドも用意されています。
でも、Quilには、なぜかベクトルに関する関数は用意されていないので、まずベクトルの演算関数を作ります。
データは既存のベクタを使い、第一要素をx、第二要素をyとして扱います。
まず先に、テストを作るので、testフォルダを作成し、その中にqvector_test.cljを作成。
;qvector_test.clj
(ns flappy-bird.qvector-test
(:require [clojure.test :as t]
[flappy-bird.qvector :as qv]))
(t/deftest qvector-test
(t/testing "足し算"
(t/is (= [5 10] (qv/add [1 2] [4 8])))))
srcフォルダにqvector.cljを作成して、空のadd関数を作ります。
(ns flappy-bird.qvector)
(defn add [v1 v2])
テストを実行してみて、失敗を確認
clj꞉qvector-test꞉>
(clojure.test/run-tests)
Testing qvector-test
FAIL in (qvector-test) (qvector_test.clj:7)
足し算
expected: (= [5 10] (qv/add [1 2] [4 8]))
actual: (not (= [5 10] nil))
Ran 1 tests containing 1 assertions.
1 failures, 0 errors.
{:test 1, :pass 0, :fail 1, :error 0, :type :summary}
add関数の中身を作成してテスト。引き算、掛け算、割り算も作成しておきます。本家Processingでも何もしてないようなので、0除算については対応なし。
テストを実行して結果を確認します。
;; qvector_test.clj
(t/deftest qvector-test
(t/testing "足し算"
(t/is (= [5 10] (qv/add [1 2] [4 8])))))
(t/testing "引き算"
(t/is (= [3 6] (qv/sub [4 8] [1 2]))))
(t/testing "掛け算"
(t/is (= [3 12] (qv/mult [1 4] 3))))
(t/testing "割り算"
(t/is (= [4 1] (qv/div [8 2] 2)))))
(ns flappy-bird.qvector)
(defn add [v1 v2]
(map #(+ %1 %2) v1 v2))
(defn sub [v1 v2]
(map #(- %1 %2) v1 v2))
(defn mult [v n]
(map #(* % n) v))
(defn div [v n]
(map #(/ % n) v))
テストを実行
clj꞉qvector-test꞉>
(clojure.test/run-tests)
Testing qvector-test
Ran 1 tests containing 4 assertions.
0 failures, 0 errors.
{:test 1, :pass 4, :fail 0, :error 0, :type :summary}
自機を動かす
テストが成功したので、update-stateを変更して、birdに下向きのベクトルを加算した値を返すように変更します。
(defn update-state [status]
status) ;;何もしない
;; ↓変更
(defn update-state [{:keys [bird]}] ;;分配束縛でbirdにベクタを束縛
{:bird (qv/add bird [0 1])}) ;;下向きのベクトルを加算して返す
写真ではわからないけど、等速で下に移動するようになりました。

まとめ
今回は、今後のためにベクトルの演算する関数を作成しました。
次回は、落下を作成します。
ディスカッション
コメント一覧
まだ、コメントがありません