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

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

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

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

Q&A

解決済

1回答

479閲覧

Processingにて,特定の場面で画像が表示されない

yukatii

総合スコア5

Processing

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

1グッド

0クリップ

投稿2023/03/10 05:09

実現したいこと

場合に応じて画像を表示したい

前提

タスク0,タスク1を10回ずつ行うプログラムを作成しています。どちらのタスクが指示されるかはランダムで実装したいので,最初にランダムでタスク0,1を選択。選択回数をカウントしておいて,片方が10回に達した場合はもう片方のタスクを表示させる。それぞれのタスクは必ず10回ずつで,全タスク選択が計20回になるとプログラムを終了する。といった流れです。

そこで,タスクが選択された際に特定の画像を表示したいのですが,画像が表示されません。タスク選択の待機時間&タスク終了後の休憩時間に表示させるのがdefo.jpg, タスク0の指示タイミングで表示するのがimg0, タスク1の指示タイミングで表示するのがimg1として設定しています。
※画像表示を関数内で行っているのは,本来画像表示以外にも動作が存在するためです。

発生している問題・エラーメッセージ

エラーは出ませんが,ずっとdefo.jpgのまま画面が変わりません。

該当のソースコード

Processing

1// 定義 2PImage defo, img0, img1; // 画像データ 3 4int count = 0; // Loop回数計測変数 5int count_0 = 0, count_1 = 0; // クラスカウント変数 6int max = 10; // タスク上限回数 7int crass; // 8float result; // 9int delay_time; // 休憩時間のランダム用 10 11/* --- setup --- */ 12void setup(){ 13 // 画面設定 14 fullScreen(); 15 background(0); 16 17 // 画像読み込み 18 defo = loadImage("defo.jpg"); 19 img0 = loadImage("right.jpg"); 20 img1 = loadImage("left.jpg"); 21 22 image(defo, 0, 0); 23} 24 25/* --- draw --- */ 26void draw(){ 27 background(0); 28 println("start"); 29 count ++; // Loop回数 (2 * max回になる) 30 31 if (count_0 < max && count_1 < max) { 32 result = random(0,1); // 0 or 1をランダムで選択 33 crass = int( round(result) ); // resultを四捨五入してint型に変換 34 35 // タスク0 36 if(crass == 0) { 37 println(crass); 38 count_0 ++; 39 task_0(); 40 } 41 // タスク1 42 else { 43 println(crass); 44 count_1 ++; 45 task_1(); 46 } 47 } 48 // count_0 or count_1 がmaxまで達した場合の処理 49 else if (count_0 < max){ 50 println("0"); 51 count_0 ++; 52 task_0(); 53 } 54 else { 55 println("1"); 56 count_1 ++; 57 task_1(); 58 } 59 // ここから休憩 60 breaktime(); 61 62 // x回ループで終了 63 if(count == 2 * max){ 64 exit(); 65 } 66} 67 68void task_0() { 69 image(defo, 0, 0); 70 image(img0, 0, 0); 71 delay(5000); // タスク時間 72} 73 74void task_1() { 75 image(defo, 0, 0); 76 image(img1, 0, 0); 77 delay(5000); // タスク時間 78} 79 80void breaktime() { 81 image(defo, 0, 0); 82 println("wait"); 83 delay(1500); 84 delay_time = round( random(500,2000) ); // 休憩時間をランダムで決定0.5 ~ 2s 85 delay( delay_time ); // delay_timeをintに変形した 86}

試したこと

画像を変えてみたり,画像ではなく音を鳴らしたりしてみました。音による合図に変えると正常に動作しました。

補足情報(FW/ツールのバージョンなど)

Processing3.5.4

TN8001👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーは出ませんが,ずっとdefo.jpgのまま画面が変わりません。

描画はdrawの最後に更新されるため、残念ながらyukatiiさんの意図通りには動きません。

The screen only updates when the end of draw() is reached, so delay() cannot be used to slow down drawing.
画面は draw() の最後に到達したときにのみ更新されるため、delay() を使用して描画を遅くすることはできません。

delay() / Reference / Processing.org

一般的にはmillisとかframeCountとかで自前管理することが多いです。

Processing

1final int MAX = 10; 2 3PImage defo, img0, img1; 4int count_0, count_1; 5String mode; 6int time; 7 8 9void setup() { 10 //fullScreen(); 11 size(400, 300); 12 background(0); 13 14 //defo = loadImage("defo.jpg"); 15 //img0 = loadImage("right.jpg"); 16 //img1 = loadImage("left.jpg"); 17 defo = createImage(200, 200, RGB); 18 defo.loadPixels(); 19 for (int i = 0; i < defo.pixels.length; i++) defo.pixels[i] = color(0, 90, 102); 20 defo.updatePixels(); 21 img0 = loadImage("https://teratail-v2.storage.googleapis.com/uploads/avatars/u15/159598/rY7KVihT_thumbnail.jpg"); 22 img1 = loadImage("https://teratail-v2.storage.googleapis.com/uploads/avatars/u13/132786/KnkDDC5A_thumbnail.jpg"); 23 24 image(defo, 0, 0); 25 26 mode = "task_" + int(random(2)); 27 time = millis(); 28} 29 30void draw() { 31 if(millis() < time) return; 32 33 background(0); 34 35 switch(mode) { 36 case "task_0": 37 task_0(); 38 mode = "wait"; 39 break; 40 case "task_1": 41 task_1(); 42 mode = "wait"; 43 break; 44 default: 45 breaktime(); 46 if (count_0 < MAX && count_1 < MAX) { 47 mode = "task_" + int(random(2)); 48 } else if (count_0 < MAX) { 49 mode = "task_0"; 50 } else { 51 mode = "task_1"; 52 } 53 break; 54 } 55 56 if (count_0 + count_1 == 2 * MAX) { 57 exit(); 58 } 59} 60 61void task_0() { 62 println("start"); 63 println("0"); 64 count_0++; 65 66 image(defo, 0, 0); 67 image(img0, 0, 0); 68 69 //delay(5000); 70 time = millis() + 5000; 71} 72 73void task_1() { 74 println("start"); 75 println("1"); 76 count_1++; 77 78 image(defo, 0, 0); 79 image(img1, 0, 0); 80 81 //delay(5000); 82 time = millis() + 5000; 83} 84 85void breaktime() { 86 println("wait"); 87 88 image(defo, 0, 0); 89 90 int delay_time = round(random(500, 2000)) + 1500; 91 //delay(delay_time); 92 time = millis() + delay_time; 93}

millis() / Reference / Processing.org


あるいはframeRateを変えるほうが元の意図に近いでしょうか?(大差ないけどw

Processing

1final int MAX = 10; 2 3PImage defo, img0, img1; 4int count_0, count_1; 5String mode; 6 7 8void setup() { 9 //fullScreen(); 10 size(400, 300); 11 background(0); 12 13 //defo = loadImage("defo.jpg"); 14 //img0 = loadImage("right.jpg"); 15 //img1 = loadImage("left.jpg"); 16 defo = createImage(200, 200, RGB); 17 defo.loadPixels(); 18 for (int i = 0; i < defo.pixels.length; i++) defo.pixels[i] = color(0, 90, 102); 19 defo.updatePixels(); 20 img0 = loadImage("https://teratail-v2.storage.googleapis.com/uploads/avatars/u15/159598/rY7KVihT_thumbnail.jpg"); 21 img1 = loadImage("https://teratail-v2.storage.googleapis.com/uploads/avatars/u13/132786/KnkDDC5A_thumbnail.jpg"); 22 23 image(defo, 0, 0); 24 25 mode = "task_" + int(random(2)); 26} 27 28void draw() { 29 background(0); 30 31 switch(mode) { 32 case "task_0": 33 task_0(); 34 mode = "wait"; 35 break; 36 case "task_1": 37 task_1(); 38 mode = "wait"; 39 break; 40 default: 41 breaktime(); 42 if (count_0 < MAX && count_1 < MAX) { 43 mode = "task_" + int(random(2)); 44 } else if (count_0 < MAX) { 45 mode = "task_0"; 46 } else { 47 mode = "task_1"; 48 } 49 break; 50 } 51 52 if (count_0 + count_1 == 2 * MAX) { 53 exit(); 54 } 55} 56 57void task_0() { 58 println("start"); 59 println("0"); 60 count_0++; 61 62 image(defo, 0, 0); 63 image(img0, 0, 0); 64 65 //delay(5000); 66 frameRate(1000f / 5000); 67} 68 69void task_1() { 70 println("start"); 71 println("1"); 72 count_1++; 73 74 image(defo, 0, 0); 75 image(img1, 0, 0); 76 77 //delay(5000); 78 frameRate(1000f / 5000); 79} 80 81void breaktime() { 82 println("wait"); 83 84 image(defo, 0, 0); 85 86 int delay_time = round(random(500, 2000)) + 1500; 87 //delay(delay_time); 88 frameRate(1000f / delay_time); 89}

frameRate() / Reference / Processing.org

投稿2023/03/10 09:13

TN8001

総合スコア9421

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

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

TN8001

2023/03/10 09:13

実際には`delay`ではなく「何か重い処理」ということであれば、別スレッドに逃がすなりが必要でしょうね。
yukatii

2023/03/11 15:18

delayは使えないのですね。おかげさまで画像切り替えができるようになりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問