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

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

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

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

1562閲覧

Processingで線がきちんと描画されず、プログラムもうまく動きません

ameshikou

総合スコア8

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

1グッド

1クリップ

投稿2020/05/24 21:03

Processingを使ってミュラーリヤー錯視の実験に使うプログラムを作っています。

プログラムの内容は以下のとおりです。

  1. スタートボタンを押したら画面が表示され、「<->-<」のような線が描画されます。
  2. 真ん中から、右側の線はfキー、jキーで長さが調節できるようになっています。
  3. スペースキーを押したら線の一番右端のその地点のx座標がCSVファイルに出力され、新しい線が描画されます。
  4. これを10回繰り返し、10回終わったら、プログラムを閉じます。

上記のようなプログラムになるように作ったつもりだったのですが、
実際に起動してみると、ランダムに線の一部が消えたものが表示されるだけで、fキー、jキー、スペースキーも反応しませんでした。

エラーも出ないのでどこが間違っているのかわかりません。
宜しくお願いします。

環境は「processing-3.5.4-windows64」です。

スクリプトは以下のとおりです。

PrintWriter file; int k = 1; void setup(){ size(800,400); file = createWriter("tyouseihou.csv");// CSVファイル } void draw(){ do{ //繰り返し処理(do-while文) background(255); int R = int(random(410,620)); int x1 = R; line(200,height/2,400,height/2); //横線 line(200,height/2,252,height/2+30); //矢羽 line(200,height/2,252,height/2-30); line(400,height/2,348,height/2-30); line(400,height/2,348,height/2+30); line(400,height/2,x1,height/2); line(x1,height/2,x1+52,height/2-30); line(x1,height/2,x1+52,height/2+30); if(keyPressed){ if(key == 'f'){ //fキー x1 -= 1; } else if(key == 'j'){ //jキー x1 += 1; } else if(key == ' '){ //スペースキー k += 1; file.println(x1-400); //ファイル出力 if(k == 10){ //10回繰り返したらファイルを閉じて終了 file.flush(); file.close(); exit(); } } } strokeWeight(5); } while(k < 10); //10回になるまで繰り返す }
TN8001👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

draw()は1秒間に60回(デフォルト設定)自動的に呼ばれるので、中でループする必要はありません。

スペースキーの判定をdraw()内でやると一瞬で複数回判定されてしまいますので、keyReleased()でやるのがよいでしょう。

Processing

1PrintWriter file; 2int k = 1; // 試行回数 3int x1; // 横線右位置 4 5void setup() { 6 size(800, 400); 7 file = createWriter("tyouseihou.csv"); // CSVファイル 8 x1 = int(random(410, 620)); 9} 10 11void draw() { 12 background(255); 13 strokeWeight(5); 14 fill(0); 15 16 text("fキーjキーで長さ変更", 10, 20); 17 text("スペースキーで確定", 10, 40); 18 text("あと" + (11 - k) + "回", 10, 60); 19 20 line(200, height / 2, 400, height / 2); // 横線左 21 22 line(200, height / 2, 252, height / 2 + 30); // 矢羽左 23 line(200, height / 2, 252, height / 2 - 30); 24 25 line(400, height / 2, 348, height / 2 - 30); // 矢羽中央 26 line(400, height / 2, 348, height / 2 + 30); 27 28 line(400, height / 2, x1, height / 2); // 横線右 29 30 line(x1, height / 2, x1 + 52, height / 2 - 30); // 矢羽右 31 line(x1, height / 2, x1 + 52, height / 2 + 30); 32 33 if (keyPressed) { 34 if (key == 'f') { // 短くする 35 x1 -= 1; 36 } else if (key == 'j') { // 長くする 37 x1 += 1; 38 } 39 } 40} 41 42void keyReleased() { 43 if (key == ' ') { 44 file.println(x1 - 400); // ファイル出力 45 46 if (k == 10) { // 10回繰り返したらファイルを閉じて終了 47 file.flush(); 48 file.close(); 49 exit(); 50 } 51 52 x1 = int(random(410, 620)); 53 k += 1; 54 } 55}

錯視は知ってはいましたがあまりのひどさに、どこか間違えてるのでは?と確認してしまいました^^;

投稿2020/05/24 22:36

TN8001

総合スコア9321

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

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

ameshikou

2020/05/24 22:49

回答ありがとうございます。 私の実力不足、勉強不足もあり、大変勉強になりました。 ありがとうございました!
ameshikou

2020/05/31 04:11

前回教えていただいたプログラムから、改変を加えて、 x1に420,760のどちらか一つをランダムに出すプログラムを組んでいるのですが、 8行目と52行目を int[] a = {420,760}; int index = int(random(a.length)); x1 = index; に改編したのですが、横線右の右端の座標が、毎回画面の一番左に行ってしまいます。 何が違うのでしょうか。 宜しくお願いします。
TN8001

2020/05/31 04:36

もう解決しているかもしれませんが int index = int(random(a.length)); x1 = a[index]; ですよね。
ameshikou

2020/05/31 04:42

回答ありがとうございます。 上記と同じ改編でできました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問