回答編集履歴

2

見直しキャンペーン中

2023/07/25 14:21

投稿

TN8001
TN8001

スコア9326

test CHANGED
@@ -1,237 +1,118 @@
1
1
  「クラスを定義し,オブジェクトを生成」しただけでは「クラスを活用」したとは言えませんよね。
2
2
 
3
-
4
-
5
3
  過去に同じクイズゲームで回答したので、見てみてください。
6
-
7
4
  thkanaさんの回答や私の回答、合わせて3パターンあるのでヒントにはなると思います。
8
-
9
-
10
5
 
11
6
  [オブジェクト - processingのオブジェクトの考え方|teratail](https://teratail.com/questions/275897)
12
7
 
13
-
14
-
15
8
  わからない点があればコメントください。
16
-
17
9
  どれかピンときたのがあれば、より質問の仕様に近く書き直すことも致します。
18
-
19
-
20
10
 
21
11
  ---
22
12
 
23
-
24
-
25
13
  まずは既存クラスのオブジェクトを、使うことからやりましょう。
26
-
27
14
  それがわからないと、自分でクラスを作ることもできませんからね。
28
15
 
29
-
30
-
31
16
  メニューの「スケッチ」ー「ライブラリをインポート...」ー「ライブラリを追加...」から「G4P | Provides a set of 2D GUI controls and multiple window support.」をインストールします。
32
-
33
17
  ![ライブラリを追加](010b1bcde6dd534f3a0a89c2a2e4d7cd.png)
34
18
 
35
-
36
-
37
19
  とりあえず1問だけのクイズです。
38
-
39
20
  ```Processing
40
-
41
21
  import g4p_controls.*; // GButton等を使用できるようにする
42
22
 
43
-
44
-
45
23
  GLabel label; // ラベル(文字の表示)
46
-
47
24
  GButton button1; // ボタン
48
-
49
25
  GButton button2;
50
-
51
26
  GButton button3;
52
-
53
27
  GButton button4;
54
-
55
28
  GButton nextButton;
56
29
 
57
-
58
-
59
30
  void setup() {
60
-
61
31
  size(400, 400);
62
-
63
-
64
32
 
65
33
  G4P.setDisplayFont("MS Gothic", G4P.PLAIN, 24); // GButton等で使用するフォントの設定
66
34
 
67
-
68
-
69
35
  // GLabelクラスのオブジェクトを生成し、label変数に代入
70
-
71
36
  label = new GLabel(this, 20, 20, 360, 170, "■世界で1番高い山は?");
72
-
73
37
  label.setTextAlign(GAlign.CENTER, GAlign.MIDDLE); // 上下左右中央ぞろえ
74
38
 
75
-
76
-
77
39
  // GButtonクラスのオブジェクトを生成し、button1変数に代入(以下くりかえし)
78
-
79
40
  button1 = new GButton(this, 20, 190, 360, 40, "富士山");
80
-
81
41
  button2 = new GButton(this, 20, 240, 360, 40, "キリマンジャロ");
82
-
83
42
  button3 = new GButton(this, 20, 290, 360, 40, "エベレスト");
84
-
85
43
  button4 = new GButton(this, 20, 340, 360, 40, "アコンカグア");
86
44
 
87
-
88
-
89
45
  nextButton = new GButton(this, 20, 340, 360, 40, "もういちど");
90
-
91
46
  // nextButtonはほかのボタンと処理内容がが違うので、呼ばれるメソッドを別個に設定
92
-
93
47
  nextButton.addEventHandler(this, "handleNextButton");
94
-
95
48
  nextButton.setVisible(false); // 最初は非表示
96
-
97
49
  }
98
50
 
99
-
100
-
101
51
  void draw() {
102
-
103
52
  background(220);
104
-
105
53
  }
106
54
 
107
-
108
-
109
55
  // GButtonを押したときは、これが呼ばれることになっている(void draw()が毎フレーム呼ばれるのと同じ)
110
-
111
56
  // addEventHandlerしてあるボタンは、そちらが呼ばれてこれは呼ばれない、
112
-
113
57
  void handleButtonEvents(GButton button, GEvent event) {
114
58
 
115
-
116
-
117
59
  // 押されたボタンのテキストを取得
118
-
119
60
  String answer = button.getText();
120
61
 
121
-
122
-
123
62
  if ("エベレスト".equals(answer)) {
124
-
125
63
  label.setText("正解!"); // ラベルのテキストを変更
126
-
127
64
  } else {
128
-
129
65
  label.setText("不正解!\n正解は エベレスト でした");
130
-
131
66
  }
132
67
 
133
-
134
-
135
68
  // 邪魔なボタンを非表示
136
-
137
69
  button1.setVisible(false);
138
-
139
70
  button2.setVisible(false);
140
-
141
71
  button3.setVisible(false);
142
-
143
72
  button4.setVisible(false);
144
73
 
145
-
146
-
147
74
  // nextButtonを表示
148
-
149
75
  nextButton.setVisible(true);
150
-
151
76
  }
152
77
 
153
-
154
-
155
78
  // nextButton専用の処理
156
-
157
79
  void handleNextButton(GButton button, GEvent event) {
158
-
159
80
  label.setText("■世界で1番高い山は?");
160
81
 
161
-
162
-
163
82
  button1.setVisible(true);
164
-
165
83
  button2.setVisible(true);
166
-
167
84
  button3.setVisible(true);
168
-
169
85
  button4.setVisible(true);
170
86
 
171
-
172
-
173
87
  nextButton.setVisible(false);
174
-
175
88
  }
176
-
177
89
  ```
178
-
179
90
  ![アプリ画像](4ca7e19a849e021091ee6a63268cadf4.png)
180
91
 
181
-
182
-
183
92
  詳細は分からなくても、やっていることは単純なのでご理解いただけると思います。
184
-
185
93
  配列や`int`等を使って状態を管理すれば、これを複数問題にすることも容易でしょう。
186
-
187
-
188
94
 
189
95
  そのオブジェクトとメソッドが何をするかがわかっていれば、その裏でどんなことが起きているかを気にする必要はありません。
190
96
 
191
-
192
-
193
97
  例えば`GButton`は`new`しただけで、その位置サイズで表示されます。
194
-
195
98
  マウスオーバーやクリックで色が変わり、押されたら`handleButtonEvents`を呼び出します。
196
-
197
-
198
99
 
199
100
  中では複雑なことが行われているかもしれませんが、(自分でも他人でも)いったん作ってしまえばいつでも簡単に使えます。
200
101
 
201
-
202
-
203
102
  ---
204
-
205
-
206
103
 
207
104
  そのうえで自作クラスですが、まず何をクラスで表すかですよね。
208
105
 
209
-
210
-
211
106
  lisalweaponさんは画面をクラスで表しました。系統としてはこちら寄りですよね。
212
-
213
107
  [thkanaさん回答](https://teratail.com/questions/275897#reply-393308)
214
-
215
108
  [私2個目](https://teratail.com/questions/275897#reply-394578)
216
109
 
217
-
218
-
219
110
  目に見えるものだけでなく、問題クラスのようなものもあり得ます。
220
-
221
111
  [私1個目](https://teratail.com/questions/275897#reply-393563)
222
-
223
-
224
-
225
-
226
112
 
227
113
  うまく使えば複雑だったものが劇的に単純化できますが、失敗すればかえって複雑になるだけということもあります。
228
114
 
229
-
230
-
231
115
  簡単なものの場合かえって冗長になっただけに見えることもあります。
232
116
 
233
-
234
-
235
117
  難しいことはどこまでも難しさは変わらないこともあります(ボタンのようなものは、ごちゃごちゃした条件になるのは避けられません)
236
-
237
118
  そういうのが面倒で、私はライブラリを使いました^^;

1

追記

2020/12/19 08:32

投稿

TN8001
TN8001

スコア9326

test CHANGED
@@ -15,3 +15,223 @@
15
15
  わからない点があればコメントください。
16
16
 
17
17
  どれかピンときたのがあれば、より質問の仕様に近く書き直すことも致します。
18
+
19
+
20
+
21
+ ---
22
+
23
+
24
+
25
+ まずは既存クラスのオブジェクトを、使うことからやりましょう。
26
+
27
+ それがわからないと、自分でクラスを作ることもできませんからね。
28
+
29
+
30
+
31
+ メニューの「スケッチ」ー「ライブラリをインポート...」ー「ライブラリを追加...」から「G4P | Provides a set of 2D GUI controls and multiple window support.」をインストールします。
32
+
33
+ ![ライブラリを追加](010b1bcde6dd534f3a0a89c2a2e4d7cd.png)
34
+
35
+
36
+
37
+ とりあえず1問だけのクイズです。
38
+
39
+ ```Processing
40
+
41
+ import g4p_controls.*; // GButton等を使用できるようにする
42
+
43
+
44
+
45
+ GLabel label; // ラベル(文字の表示)
46
+
47
+ GButton button1; // ボタン
48
+
49
+ GButton button2;
50
+
51
+ GButton button3;
52
+
53
+ GButton button4;
54
+
55
+ GButton nextButton;
56
+
57
+
58
+
59
+ void setup() {
60
+
61
+ size(400, 400);
62
+
63
+
64
+
65
+ G4P.setDisplayFont("MS Gothic", G4P.PLAIN, 24); // GButton等で使用するフォントの設定
66
+
67
+
68
+
69
+ // GLabelクラスのオブジェクトを生成し、label変数に代入
70
+
71
+ label = new GLabel(this, 20, 20, 360, 170, "■世界で1番高い山は?");
72
+
73
+ label.setTextAlign(GAlign.CENTER, GAlign.MIDDLE); // 上下左右中央ぞろえ
74
+
75
+
76
+
77
+ // GButtonクラスのオブジェクトを生成し、button1変数に代入(以下くりかえし)
78
+
79
+ button1 = new GButton(this, 20, 190, 360, 40, "富士山");
80
+
81
+ button2 = new GButton(this, 20, 240, 360, 40, "キリマンジャロ");
82
+
83
+ button3 = new GButton(this, 20, 290, 360, 40, "エベレスト");
84
+
85
+ button4 = new GButton(this, 20, 340, 360, 40, "アコンカグア");
86
+
87
+
88
+
89
+ nextButton = new GButton(this, 20, 340, 360, 40, "もういちど");
90
+
91
+ // nextButtonはほかのボタンと処理内容がが違うので、呼ばれるメソッドを別個に設定
92
+
93
+ nextButton.addEventHandler(this, "handleNextButton");
94
+
95
+ nextButton.setVisible(false); // 最初は非表示
96
+
97
+ }
98
+
99
+
100
+
101
+ void draw() {
102
+
103
+ background(220);
104
+
105
+ }
106
+
107
+
108
+
109
+ // GButtonを押したときは、これが呼ばれることになっている(void draw()が毎フレーム呼ばれるのと同じ)
110
+
111
+ // addEventHandlerしてあるボタンは、そちらが呼ばれてこれは呼ばれない、
112
+
113
+ void handleButtonEvents(GButton button, GEvent event) {
114
+
115
+
116
+
117
+ // 押されたボタンのテキストを取得
118
+
119
+ String answer = button.getText();
120
+
121
+
122
+
123
+ if ("エベレスト".equals(answer)) {
124
+
125
+ label.setText("正解!"); // ラベルのテキストを変更
126
+
127
+ } else {
128
+
129
+ label.setText("不正解!\n正解は エベレスト でした");
130
+
131
+ }
132
+
133
+
134
+
135
+ // 邪魔なボタンを非表示
136
+
137
+ button1.setVisible(false);
138
+
139
+ button2.setVisible(false);
140
+
141
+ button3.setVisible(false);
142
+
143
+ button4.setVisible(false);
144
+
145
+
146
+
147
+ // nextButtonを表示
148
+
149
+ nextButton.setVisible(true);
150
+
151
+ }
152
+
153
+
154
+
155
+ // nextButton専用の処理
156
+
157
+ void handleNextButton(GButton button, GEvent event) {
158
+
159
+ label.setText("■世界で1番高い山は?");
160
+
161
+
162
+
163
+ button1.setVisible(true);
164
+
165
+ button2.setVisible(true);
166
+
167
+ button3.setVisible(true);
168
+
169
+ button4.setVisible(true);
170
+
171
+
172
+
173
+ nextButton.setVisible(false);
174
+
175
+ }
176
+
177
+ ```
178
+
179
+ ![アプリ画像](4ca7e19a849e021091ee6a63268cadf4.png)
180
+
181
+
182
+
183
+ 詳細は分からなくても、やっていることは単純なのでご理解いただけると思います。
184
+
185
+ 配列や`int`等を使って状態を管理すれば、これを複数問題にすることも容易でしょう。
186
+
187
+
188
+
189
+ そのオブジェクトとメソッドが何をするかがわかっていれば、その裏でどんなことが起きているかを気にする必要はありません。
190
+
191
+
192
+
193
+ 例えば`GButton`は`new`しただけで、その位置サイズで表示されます。
194
+
195
+ マウスオーバーやクリックで色が変わり、押されたら`handleButtonEvents`を呼び出します。
196
+
197
+
198
+
199
+ 中では複雑なことが行われているかもしれませんが、(自分でも他人でも)いったん作ってしまえばいつでも簡単に使えます。
200
+
201
+
202
+
203
+ ---
204
+
205
+
206
+
207
+ そのうえで自作クラスですが、まず何をクラスで表すかですよね。
208
+
209
+
210
+
211
+ lisalweaponさんは画面をクラスで表しました。系統としてはこちら寄りですよね。
212
+
213
+ [thkanaさん回答](https://teratail.com/questions/275897#reply-393308)
214
+
215
+ [私2個目](https://teratail.com/questions/275897#reply-394578)
216
+
217
+
218
+
219
+ 目に見えるものだけでなく、問題クラスのようなものもあり得ます。
220
+
221
+ [私1個目](https://teratail.com/questions/275897#reply-393563)
222
+
223
+
224
+
225
+
226
+
227
+ うまく使えば複雑だったものが劇的に単純化できますが、失敗すればかえって複雑になるだけということもあります。
228
+
229
+
230
+
231
+ 簡単なものの場合かえって冗長になっただけに見えることもあります。
232
+
233
+
234
+
235
+ 難しいことはどこまでも難しさは変わらないこともあります(ボタンのようなものは、ごちゃごちゃした条件になるのは避けられません)
236
+
237
+ そういうのが面倒で、私はライブラリを使いました^^;