回答編集履歴

1

改行削除

2024/03/04 09:30

投稿

TN8001
TN8001

スコア9350

test CHANGED
@@ -1,145 +1,72 @@
1
1
  大変素晴らしいコードなのですが、クラスが多くProcessingは内部クラスになる仕様上アクセス修飾子が意味がなくなるので、ちょっとコードが追いにくいですね。
2
-
3
2
  しかし順番に落ち着いて読んでいくと、案外すぐ目的のものに行き当たりました。
4
3
 
5
-
6
-
7
4
  まず要件をまとめると、
8
-
9
5
  1. どこでクリックしても拡散する
10
-
11
6
  2. クリックしたら描画されている円を全て拡散する
12
-
13
7
  3. クリックをしなくてもランダムな色の円がランダムな場所に描画され続ける
14
-
15
-
16
8
 
17
9
  ですね。
18
10
 
11
+ ---
19
12
 
13
+ **[注意]**
14
+ これ以降同名のメソッドが多いので、本体?PApplet?直に置かれてるsetup()やdraw()をApp.setup()と書き、class Noteのdraw()をNote.draw() と書くこととします。
20
15
 
21
16
  ---
22
17
 
23
-
24
-
25
- **[注意]**
26
-
27
- これ以降同名のメソッドが多いので、本体?PApplet?直に置かれてるsetup()やdraw()をApp.setup()と書き、class Noteのdraw()をNote.draw() と書くこととします。
28
-
29
-
30
-
31
- ---
32
-
33
-
34
-
35
18
  1. 2.はクリックに関連するでしょうから、`App.mouseClicked()`を見ます。
36
-
37
19
  `NoteController.mouseClicked()`に任せています。
38
-
39
20
  ちゃんと読んでもいいんですが、きっと`find()`でnoteのindexを探し、なければ何もせずあれば`Note.toggle()`ってことでしょう。
40
21
 
41
-
42
-
43
22
  まずここで全部拡散なので、findする必要はなくなります。
44
-
45
23
  ```Processing
46
-
47
24
  void mouseClicked() {
48
-
49
25
  for (Note note : notes) {
50
-
51
26
  note.toggle();
52
-
53
27
  }
54
-
55
28
  }
56
-
57
29
  ```
58
-
59
30
  実行します。
60
-
61
31
  はい、もう1.2.は終わってしまいました。
62
32
 
63
-
64
-
65
33
  実は問題は3.です。
66
-
67
34
  拡散した後一瞬でパララと10個円が出たと思いますが、追加のペースが遅いと全部消えた後寂しいですし、早すぎるとあっという間に画面中覆いつくされそうです。
68
-
69
- どういうイメージなのかがわからないので、調整ポイントを押さえて
35
+ どういうイメージなのかがわからないので、調整ポイントを押さえて細かい調整はmswさんに任せます。
70
-
71
- 細かい調整はmswさんに任せます。
72
-
73
-
74
36
 
75
37
  では追加部分を見てみます。
76
38
 
77
-
78
-
79
39
  起点はApp.draw()内の`controller.add(playerIn);`です。
80
-
81
40
  `NoteController.add()`を見ます。
82
-
83
41
  `if (notes.size() > 10) return;` 円の最大個数ですね。
84
-
85
42
  `if (playerIn < 20) return;` 音量が小さすぎる場合は無視するようです。
86
-
87
43
  `notes.add(new Note(x, y, playerIn));` 円を追加してるんでしょう。
88
44
 
89
-
90
-
91
45
  なるほど。ここは毎フレーム呼ばれるので拡散した後、一気に増えたわけですね。
92
-
93
46
  一気に増えないように、
94
-
95
47
  ```Processing
96
-
97
48
  void add(final float playerIn) {
98
-
99
49
  if (notes.size() > 100) return;//check
100
-
101
50
  if (playerIn < 20) return;
102
-
103
51
  if (frameCount % 30 != 0) return;
104
52
 
105
-
106
-
107
53
  final float x = random(xmin, xmax);
108
-
109
54
  final float y = random(ymin, ymax);
110
-
111
55
  notes.add(new Note(x, y, playerIn));
112
-
113
56
  }
114
-
115
57
  ```
116
-
117
58
  としてみましたが規則的過ぎていけませんね。
118
-
119
59
  `if (frameCount % (int)random(10, 30) != 0) return;`私はこんなもんかな?と思いましたが、今ある円の個数によって変えるとか方法はいろいろありそうです。お好きなように調整してください。
120
60
 
121
61
 
122
-
123
-
124
-
125
- あとやってるうちに気が付いたんですが、一回拡散した後、円が水色系統だけになりませんか?
62
+ あとやってるうちに気が付いたんですが、一回拡散した後、円が水色系統だけになりませんか
126
-
127
63
  そういう仕様ならいいのですがなんか色が減って寂しいので、どうにかならないかと試行錯誤したところ、`Note.draw()`
128
-
129
64
  ```Processing
130
-
131
65
  void draw() {
132
-
133
66
  noStroke();
134
-
135
67
  colorMode(HSB, 360, 100, 100, 100);
136
-
137
68
  fill(col);
138
-
139
69
  ellipse(x, y, w, h);
140
-
141
70
  }
142
-
143
71
  ```
144
-
145
72
  で色が戻りました。ここはそれでよいのか自信ありません。