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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

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

Q&A

解決済

1回答

651閲覧

Processingでカーソルが図形に重なると色と音が変わるプログラムで、1つ目の図形と2つ目の図形の音を変えたい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

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

0グッド

0クリップ

投稿2017/07/09 00:37

編集2017/07/09 00:37

###前提・実現したいこと
Processingでカーソルが図形に重なると色が変わるプログラムで、1つ目の図形と2つ目の図形の色を変えた上で、流れる音も変えようとしています。例えば、カーソルが図形に重なる、と図形1は赤色で「ド」の音が、図形2は青色で「レ」の音がなるようにしたいです。minimライブラリを使って音源ファイルを読み込んでいます。

###発生している問題・エラーメッセージ
以下がそのコードですが、現状では全ての図形で「ド」がなってしまいます。

###該当のソースコード

Processing

1import ddf.minim.*; 2import ddf.minim.signals.*; 3import ddf.minim.analysis.*; 4import ddf.minim.effects.*; 5 6ArrayList<MyShape> shapes = new ArrayList<MyShape>(); 7 8void setup() { 9 size(720, 720); 10 background(125); 11 frameRate(100); 12 //1 13 MyShape ichi; 14 ichi = new MyRect(70, 140, 32, 200); 15 ichi.selectedFill = #CE2828; 16 shapes.add(ichi); 17 18 //2 19 MyShape ni; 20 ni = new MyRect(170, 150, 100, 32); 21 ni.selectedFill = #1318F0; 22 shapes.add(ni); 23 ni = new MyRect(238, 182, 32, 43); 24 ni.selectedFill = #1318F0; 25 shapes.add(ni); 26 ni = new MyRect(170, 225, 100, 32); 27 ni.selectedFill = #1318F0; 28 shapes.add(ni); 29 ni = new MyRect(170, 257, 32, 43); 30 ni.selectedFill = #1318F0; 31 shapes.add(ni); 32 ni = new MyRect(170, 300, 100, 32); 33 ni.selectedFill = #1318F0; 34 shapes.add(ni); 35} 36 37void draw() { 38 update(mouseX, mouseY); 39 rect (310, 310, 100, 100); 40 line(360, 0, 360, 720); 41 line(0, 360, 720, 360); 42 noStroke(); 43 44 background(102); 45 46 for (MyShape shape: shapes) { 47 if (shape.contains(mouseX, mouseY)) { 48 49 fill(shape.selectedFill); 50 Minim minim=new Minim(this); 51 AudioSample sample=minim.loadSample("do.wav"); 52 delay(1000); 53 sample.trigger(); 54 } else { 55 fill(204); 56 } 57 shape.draw(); 58 } 59} 60 61// 長方形を表すクラス 62class MyRect extends MyShape { 63 float x, y, w, h; 64 65 MyRect(float x, float y, float w, float h) { 66 this.x = x; 67 this.y = y; 68 this.w = w; 69 this.h = h; 70 } 71 72 void draw() { 73 rect(x, y, w, h); 74 } 75 76 boolean contains(float mx, float my) { 77 return mx >= x && mx <= (x + w) && my >= y && my <= (y + h); 78 } 79} 80 81// 任意の図形を表す抽象クラス 82abstract class MyShape { 83 int selectedFill; 84 // 画面上へこの図形を描画するメソッド 85 abstract void draw(); 86 87 // 指定位置がこの図形に含まれるかどうか判定するメソッド 88 abstract boolean contains(float x, float y); 89}

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

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

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

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

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

guest

回答1

0

ベストアンサー

図形ごとに選択時の色をMyShapeクラスの属性としたように、鳴らすべき音もMyShapeクラスの属性(フィールド)として追加すればよいと思います。現在のコードに従うなら音はサンプリングファイル名で決まりますのでMyShapeクラスの属性にString型の「サンプリングファイル名」を持たせればよいと思います。

この辺りのプログラミングをするにはProcessingからちょっと離れて、Javaのクラスの定義の仕方について少し勉強してみるとよいと思います。

java

1abstract class MyShape { 2 int selectedFill; 3 String soundFile; 4} 5 6class MyRect extends MyShape { 7 float x, y, w, h; 8 9 MyRect(float x, float y, float w, float h) {...} 10}

のように定義していると、MyRectのインスタンスを作成してselectedFillやsoundFileを設定するのに一々以下のように3行かかなくてはなりません。

java

1ni = new MyRect(238, 182, 32, 43); 2ni.selectedFill = #1318F0; 3ni.soundFile = "do.wav";

しかし、Javaのクラスの勉強をちょっとだけすると、「コンストラクターを定義すればインスタンス生成時に必要な情報が一度に指定できて便利」ということに気づくと思います。その方法を用いるなら次のように書けます。

java

1abstract class MyShape { 2 int selectedFill; 3 String soundFile; 4 5 MyShape() { // 何も指定しない場合は選択色が黒で、音のファイルは無し(=null)とする 6 this(#000000, null); 7 } 8 9 MyShape(int selectedFill, String soundFile) { 10 this.selectedFill = selectedFill; 11 this.soundFile = soundFile; 12 } 13} 14 15class MyRect extends MyShape { 16 float x, y, w, h; 17 18 MyRect(float x, float y, float w, float h, int selectedFill, String soundFile) { 19 super(selectedFill, soundFile); 20 ... 21 } 22} 23 24void setup() { 25 ... 26 ni = new MyRect(10, 20, 30, 30, #FF0000, "do.wav"); 27 ... 28} 29 30... 31void draw() { 32 ... 33 for (MyShape shape: shapes) { 34 if (shape.contains(mouseX, mouseY)) { 35 fill(shape.selectedFill); 36 if (shape.soundFile != null) { 37 Minim minim=new Minim(this); 38 AudioSample sample = minim.loadSample(shape.soundFile); 39 delay(1000); 40 sample.trigger(); 41 } 42 } else { 43 fill(204); 44 } 45 shape.draw(); 46 } 47} 48

投稿2017/07/09 04:10

編集2017/07/09 04:41
KSwordOfHaste

総合スコア18392

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

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

KSwordOfHaste

2017/07/09 04:42

すみません。コンストラクターを定義すると便利といっておきながらそのコンストラクターを利用したコードを書き忘れました。setupメソッドにその例を書いておきましたのでご覧ください。 To:質問者さん
退会済みユーザー

退会済みユーザー

2017/07/09 04:58

ご回答と追記ありがとうございました。とても勉強になりました。 授業ではあまり理解できていなかったのですが、実際に作りたいものを作るときにこのようにクラスやコンストラクタが役に立つことがわかり、大変嬉しく思います。
退会済みユーザー

退会済みユーザー

2017/07/09 05:01

// 任意の図形を表す抽象クラス abstract class MyShape { int selectedFill; String soundFile; MyShape() { // 何も指定しない場合は選択色が白で、音のファイルは無し(=null)とする this(#FFFFFF, null); } 一点、解決していないことはカーソルが触れる前にも図形の形がわかるように色を付けておきたいのですが、現状だと何も指定しない場合の選択色を変えても図形部分も背景色と同じ色で区別がつかないことです。
KSwordOfHaste

2017/07/09 07:00 編集

それはcontainsがfalseになった場合にfillに指定している色(102)が背景色と同じだからです。どちらかを違う色にすればよいです。 ==>失礼、本コメントは勘違いでした。
退会済みユーザー

退会済みユーザー

2017/07/09 06:32

お返事ありがとうございます。 以下のbackground()ともう一つの色(102)は存在しないのですが、具体的にご指摘いただけると助かります。 void draw() { update(mouseX, mouseY); rect (310, 310, 100, 100); line(360, 0, 360, 720); line(0, 360, 720, 360); noStroke(); background(102);
KSwordOfHaste

2017/07/09 07:01

> カーソルが触れる前にも図形の形がわかるように色を付けておきたいのですが、現状だと何も指定しない場合の選択色を変えても図形部分も背景色と同じ色で区別がつかない これは本質問のコードで再現することでしょうか?それとも本コードへ修正を入れたときの話でしょうか?
退会済みユーザー

退会済みユーザー

2017/07/09 07:54

混乱させてしまい、申し訳ございません。改めて新しい質問させていただきます。今回の質問ではお答えいただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問