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

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

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

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

Processing

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

Q&A

解決済

2回答

6343閲覧

カーソルがある物体(四角形など)に触れた時に色を変えるプログラムを

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Processing

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

0グッド

0クリップ

投稿2017/07/01 07:06

現在、Processingのexampleで紹介されていたSpringというコードを改良して、様々な図形の色がそれぞれ、カーソルが触れた時に色を変えるというプログラムを書いています。

参考コードのSpring:https://processing.org/examples/spring.html

現状では以下の様になっており、四角形の物体に触れた時のみ、全ての図形の色が変わる様になっています。それぞれの物体を制御するにはどうしたら良いでしょうか。

// Spring drawing constants for top bar int springHeight = 32; // Height int left; // Left position int right; // Right position boolean over = false; // If mouse over boolean move = false; // If mouse down and over float R = 150; // Rest position // Spring simulation variables float ps = R; // Position void setup() { size(640, 360); rectMode(CORNERS); noStroke(); left = width/2 - 100; right = width/2 + 100; } void draw() { background(102); updateSpring(); drawSpring(); } void drawSpring() { // Set color and draw top bar if(over || move) { fill(#CE2828); } else { fill(204); } rect(left, ps, right, ps + springHeight); ellipse(30,30, 50,50); ellipse(100, 50, 80, 80); } void updateSpring() { // Test if mouse is over the top bar if(mouseX > left && mouseX < right && mouseY > ps && mouseY < ps + springHeight) { over = true; } else { over = false; } }

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

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

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

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

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

guest

回答2

0

こんな感じかな

void drawSpring() { // Set color and draw top bar if (over || move) { fill(#CE2828); } else { fill(204); } rect(left, ps, right, ps + springHeight); if (dist(mouseX, mouseY, 30, 30)<25)fill(#CE2828); ellipse(30, 30, 50, 50); fill(204); if (dist(mouseX, mouseY, 100, 50)<40||over || move)fill(#CE2828); ellipse(100, 50, 80, 80); }

投稿2017/07/01 17:41

unirou2

総合スコア37

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

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

退会済みユーザー

退会済みユーザー

2017/07/02 04:56

ご回答いただきましてありがとうございます! すでに書いてあったコードを元にご提案くださったので大変分りやすかったです。
guest

0

ベストアンサー

Processingには暗いので良い例かどうか微妙ですが、とりあえず書いてみたという例を挙げてみます。

Processingの該当サンプルですが、変数があれこれ沢山あって分かりにくいです。多分サンプルではオブジェクト指向的な要素を排除しているのだろうと思います。しかしながら、オブジェクト指向的な思考にある程度なれてくると、それを排除してコードを書くことは(変数がばらばらに多数できるきたりすることが乱雑に感じるため)非常に苦痛になってきます。そこで本サンプルではオブジェクト指向をややこしくない程度に用いています。(ただしコード量は多少大きくなっています)

Processing

1// 任意の図形を表す抽象クラス 2abstract class MyShape { 3 // 画面上へこの図形を描画するメソッド 4 abstract void draw(); 5 6 // 指定位置がこの図形に含まれるかどうか判定するメソッド 7 abstract boolean contains(float x, float y); 8} 9 10// 長方形を表すクラス 11class MyRect extends MyShape { 12 float x, y, w, h; 13 14 MyRect(float x, float y, float w, float h) { 15 this.x = x; 16 this.y = y; 17 this.w = w; 18 this.h = h; 19 } 20 21 void draw(){ 22 rect(x, y, w, h); 23 } 24 25 boolean contains(float mx, float my) { 26 return mx >= x && mx <= (x + w) && my >= y && my <= (y + h); 27 } 28} 29 30// 楕円を表すクラス 31class MyEllipse extends MyShape { 32 float x, y, w, h; 33 34 MyEllipse(float x, float y, float w, float h) { 35 this.x = x; 36 this.y = y; 37 this.w = w; 38 this.h = h; 39 } 40 41 void draw() { 42 ellipse(x, y, w, h); 43 } 44 45 boolean contains(float mx, float my) { 46 float dx = 2 * (mx - x) / w; 47 float dy = 2 * (my - y) / h; 48 return sqrt(dx * dx + dy * dy) <= 1.0; 49 } 50} 51 52ArrayList<MyShape> shapes = new ArrayList<MyShape>(); 53 54void setup(){ 55 size(640, 360); 56 noStroke(); 57 MyShape s; 58 s = new MyRect(width/2-100, 150, 200, 32); 59 shapes.add(s); 60 s = new MyEllipse(30, 30, 50, 50); 61 shapes.add(s); 62 s = new MyEllipse(100, 50, 80, 80); 63 shapes.add(s); 64} 65 66void draw() { 67 background(102); 68 for (MyShape s : shapes) { 69 if (s.contains(mouseX, mouseY)) { 70 fill(#CE2828); 71 } else { 72 fill(204); 73 } 74 s.draw(); 75 } 76}

なお、rectMode, ellipseModeはいずれもデフォルト、即ち長方形は左上の座標、幅、高さで指定し、楕円は中心の座標、幅、高さで指定するものと仮定しています。

このコードが何をしているかは読み解いてみてください。クラスを定義している部分が難しく感じるかも知れませんが、そこは申し訳ないです。そこについてはJavaの初歩の解説を調べてみてください。またこんな記事も参照してみてください。
Processingでオブジェクト指向プログラミング


蛇足的補足:ProcessingにはPShapeというクラスが既にあるにもかかわらず、なぜわざわざMyShapeというクラスを定義するのか奇妙に感じる向きがいらっしゃると思います。最初PShapeを用いようとしたのですがcontainsメソッドがなかった(正確に言えば定義はされているが実装されてなかった)のでMyShapeなんてものを定義してしまいました。

投稿2017/07/01 09:41

KSwordOfHaste

総合スコア18394

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

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

退会済みユーザー

退会済みユーザー

2017/07/02 04:55

ご丁寧にご回答いただきましてありがとうございます。オブジェクト指向もきちんと勉強したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問