🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Processing

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

Q&A

解決済

2回答

1614閲覧

状態が遷移した時に、他の処理を止めずに表示だけ変化(点灯・点滅・フェードイン・フェードアウト)させたい

P5_USER

総合スコア73

Processing

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

0グッド

0クリップ

投稿2019/11/07 07:28

いつもお世話になっています。

前提・実現したいこと

状態遷移によって表示を変えることのできるコードを作りたいと思っています。

  1. C#で0~2の3つの整数のうち1つを送信

(適宜値を変更でき、次の変更があるまでその値を保持しながら送信)
0. データを受信@processing
イメージ説明
0. 受信した状態量(値)をもとに、background()を変更
イメージ説明

今悩んでいるのは、3. のところです。

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

先の図のように状態量や状態遷移に応じて表示に変化を持たせられるような
書き方を教えていただければと思います。

例えば、状態量(値)が
1
1
2
2
2
のようになってたとすると、
1|点滅
1|点滅
2|255から0へフェードアウト開始(G = 255)
2|上の途中(例えば、G = 254)
2|上の途中(例えば、G = 253)
の様になってほしいです。

並列処理で
メインスレッド|background(0, G, 0);
サブスレッド |受信した状態量に応じてGの値を変えてメインスレッドに渡す
のが良いのでしょうか。

該当のソースコード

フェードアウト・インについては
こちら
を参考にしています。
※マウスクリックの関数は動作確認のために抜いていません。

processing

1//import hypermedia.net.*; 2//UDP udp; 3 4int nowState = 0; 5int beforeState = 0; 6float gValue = 255; 7boolean cngAlpha; //変化開始FLG 8boolean fadeMode; //フェードイン・アウト切り替えFLG 9 10void receive (byte[] data, String ip, int port) 11{ 12 String message = new String(data); 13 String[] rcvMSG = splitTokens(message, " "); 14 //state1 = float(rcvMSG[0]); 15} 16 17void setup() { 18 //透明度の変化は「停止」にしておく 19 cngAlpha = false; 20 21 //最初はフェードアウトから始めたいので 22 //現在の状態を「フェードイン」に仮設定する 23 fadeMode = true; 24 25 size(500, 500, FX2D); 26 27 //udp = new UDP (this, 60000); 28 //udp.listen(true); 29} 30 31void draw() { 32 background(0, gValue, 0); 33 34 //透明度を変化させる場合 35 if ( cngAlpha == true ) { 36 //モードに応じて処理する 37 if ( fadeMode == true ) { 38 //フェードイン 39 fadeIn(); 40 } else { 41 //フェードアウト 42 fadeOut(); 43 } 44 } 45} 46 47//フェードイン処理関数 48void fadeIn() { 49 //徐々に濃くする 50 gValue = gValue + 4f; 51 52 //不透明になったら変化終了 53 if ( gValue > 255f ) { 54 gValue = 255f; 55 cngAlpha = false; 56 } 57} 58 59//フェードアウト処理関数 60void fadeOut() { 61 //徐々に薄くする 62 gValue = gValue - 4f; 63 64 //透明になったら変化終了 65 if ( gValue < 0f ) { 66 gValue = 0f; 67 cngAlpha = false; 68 } 69} 70 71void mouseClicked() { 72 //マウスクリックで変化開始 73 cngAlpha = true; 74 75 //クリックされるごとにフェードイン・アウトを 76 //切り替える 77 if ( fadeMode == true ) { 78 //今フェードインなら、次はフェードアウト 79 gValue = 255f; 80 fadeMode = false; 81 } else { 82 //今フェードアウトなら、次はフェードイン 83 gValue = 0f; 84 fadeMode = true; 85 } 86} 87

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

processing3.5.3

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

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

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

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

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

guest

回答2

0

Processingでマルチスレッドがまともに使えるのかどうか、私は知らないけど。提案するならやってみせて欲しい...
それはともかく。
background()に透明度は効かなかったと思うし、実際そのプログラムで透明度は使ってないように見えるけど?
というか、今の動作で何が不満なのかよくわかりません。

マルチスレッドでなければ、自前でdraw()の繰り返しの中に各々の仕事を散りばめて「マルチタスク」をやることになるのでは。その場合は「他の処理」も長時間そこに留まるようではいけません。

投稿2019/11/07 14:28

thkana

総合スコア7703

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

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

0

ベストアンサー

その処理というのをUIとは別のスレッドで実行させればよろしい。

まあ、その別スレッドからUI(GUI)を変化させる場合にはちと工夫が必要なので注意。

投稿2019/11/07 08:13

y_waiwai

総合スコア88038

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問