javascriptも逐次実行型の言語の御多分にもれず「書いてある順番に上から下へ実行される」というのが基本的な動きです。p5.jsはProcessingのjavascript版ですね。Processingはアニメーションを簡単に実装できるよう、draw関数をある間隔で自動的に呼び出してくれます。呼び出される度にdraw関数の定義内容は「上から下へ順番に実行される」という点を把握しておかなければならないのが本件のポイントかなと思います。
最後のif文の条件が成立したときのx, yの動きを考えてみてください。
初めてこのif文が実行される際にはx = 250, y = 100になっているはずです。ここでx--, y++とするとx = 249, y = 101になります。それゆえ次のdrawの実行では最初のif文の判定が成立してしまい意図した動きにはなりません。
こういう論理を作る際には
「まず第一段階ではyを100へ移動」その段階が終わったら次の段階へ進む
「第二段階ではxを250へ移動」その段階が終わったら次の段階へ進む
・・・
という具合に「段階を進めながらその段階ですべきことだけをする」と考えます。
コーディングの仕方は様々ですが一例を挙げます。(switch文のbreakの書き方が気持ち悪いと感じる向きが多いと思います。我ながら気持ち悪いです)
javascript
1// requies p5.min.js
2let x, y, stage
3
4function setup() {
5 createCanvas(400, 400);
6 [x, y] = [50, 250]
7 stage = 1
8}
9
10function draw() {
11 if (stage <= 3) {
12 // 背景をクリア
13 fill(220)
14 noStroke()
15 rect(0, 0, 400, 400)
16
17 // 三角形を描画
18 stroke(0)
19 triangle(50, 250, 350, 250, x, y)
20
21 // 頂点座標を段階に応じて移動
22 switch (stage) {
23 case 1:
24 if (y >= 100) {
25 y--
26 break
27 }
28 stage++
29 case 2:
30 if (x <= 200) {
31 x++
32 break
33 }
34 stage++
35 case 3:
36 if (x >= 50 && y <= 250) {
37 x--
38 y++
39 break
40 }
41 stage++
42 }
43 }
44}
(ES2015前提)
なお元のコードのif文の条件では「もとの(50, 250)の線に戻す」というふうにはならないので、移動の仕方を適当に変えてます。
switch文は使わず各段階ですべきことを関数にすると考えた方がスッキリする場合もあると思います。
javascript
1const operations = [stage1, stage2, stage3]
2let x, y, stage = 0
3
4...
5
6function draw() {
7 if (stage < operations.length) {
8 // 描画など
9 ...
10 if (!operations[stage]()) {
11 stage++
12 }
13 }
14}
15
16function stage1() {
17 if (y >= 100) {
18 y--
19 return false // 現在の段階がまだ続くならfalse
20 } else {
21 return true // 次の段階へ移行するならtrue
22 }
23}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/03/21 11:41