質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2249閲覧

p5.jsのtriangleの座標移動

退会済みユーザー

退会済みユーザー

総合スコア0

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2018/03/13 09:00

編集2018/03/25 11:33

Javaのp5.jsを使って、

triangleを用いて
底辺のライン(50, 250, 350, 250)は変えずに三角形の1つの頂点(x,y)をvarで指定。

①y座標が250→100のところに上移動
②xが350→250のところに真左移動
③xが250→50、yが100→250のところに左下に斜め移動させ
最後は一本線に戻るようにしたいです。
xとyはグローバル関数で既に指定してます。

function draw{

triangle(50, 250, 350, 250, x, y);

if (y >= 100) { y--; } else if (x >= 250) { x--; } else if (x >= 50 && y <= 250) { x--; ★y++; //++だとなぜ動かないの }

★この辺りをどう変えれば最後左下斜めに移動させもとの(50, 250)の線に戻すことが出来るのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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/17 01:16

編集2018/03/17 01:26
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/21 11:41

帰省していたためパソコンが使えず、返事が遅くなってしまいました。申し訳ないです(TT) 解決しました。感謝致します! ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問