質問編集履歴

2

質問の修正

2016/01/13 10:41

投稿

Puhu
Puhu

スコア31

test CHANGED
File without changes
test CHANGED
@@ -10,7 +10,13 @@
10
10
 
11
11
 
12
12
 
13
- 調べたところ、AWTよりSwingのが動作が軽いことが解りましたが、SwingにはPaintComponentがないようなので、このままAWTで描画処理を作成することになりそうです。
13
+ **(調べたところ、AWTよりSwingのが動作が軽いことが解りましたが、SwingにはPaintComponentがないようなので、このままAWTで描画処理を作成することになりそうです。
14
+
15
+ **
16
+
17
+ ↑は間違いでした、paintComponentはSwingに含まれているものでした。失礼いたしました。
18
+
19
+
14
20
 
15
21
 
16
22
 

1

編集・追記依頼への回答

2016/01/13 10:41

投稿

Puhu
Puhu

スコア31

test CHANGED
File without changes
test CHANGED
@@ -15,3 +15,297 @@
15
15
 
16
16
 
17
17
  javaのGUIプログラムを組むうえで、動作が重くならないためにきをつけるべきことや、私はこうしてるよ、などのことがあればぜひ教えて頂きたいです。
18
+
19
+
20
+
21
+ 補足
22
+
23
+ コメントありがとうございます。現在作成しているのは音楽ゲームで、常にノーツ(譜面のこと)や、判定時のエフェクトを描画させています。
24
+
25
+
26
+
27
+ ```java
28
+
29
+ public void paintComponent(Graphics g) {
30
+
31
+ super.paintComponent(g);
32
+
33
+ //Graphics2D g2 = (Graphics2D)g;
34
+
35
+ //GradientPaint gp = new GradientPaint(vimani.type,10,Color.black,vimani.type,90,Color.cyan);
36
+
37
+
38
+
39
+ // レーン
40
+
41
+ g.setColor(new Color(153,51,51,255));
42
+
43
+ g.fillRect(220,10, 30, 650);
44
+
45
+ g.fillRect(255,10, 30, 650);
46
+
47
+ g.fillRect(290,10, 30, 650);
48
+
49
+ g.fillRect(325,10, 30, 650);
50
+
51
+
52
+
53
+ g.setColor(new Color(255,255,255,255));
54
+
55
+ g.fillRect(250,10, 5, 650);
56
+
57
+ g.fillRect(285,10, 5, 650);
58
+
59
+ g.fillRect(320,10, 5, 650);
60
+
61
+
62
+
63
+ g.setColor(new Color(255,180,0,255));
64
+
65
+ g.fillRect(220,590,135,20);
66
+
67
+ //ノート
68
+
69
+
70
+
71
+ //押されたキーと対応するレーンを光らせる。
72
+
73
+
74
+
75
+ if(vimani.keytypeflg == true){//単押しのみの時はこっち
76
+
77
+ Graphics2D g2 = (Graphics2D)g;
78
+
79
+ GradientPaint gp = new GradientPaint(vimani.type,10,Color.black,vimani.type,90,Color.cyan);
80
+
81
+ g2.setPaint(gp);
82
+
83
+ g2.fillRect(vimani.type,10,30,580);
84
+
85
+ vimani.fuzecount++;
86
+
87
+ if(vimani.fuzecount == 5){
88
+
89
+ vimani.keytypeflg = false;
90
+
91
+ vimani.fuzecount = 0;
92
+
93
+ }
94
+
95
+ }
96
+
97
+ if(vimani.keytypeflg2 == true){//同時押があったら
98
+
99
+ Graphics2D g3 = (Graphics2D)g;
100
+
101
+ GradientPaint gp2 = new GradientPaint(vimani.type2,10,Color.black,vimani.type2,90,Color.cyan);
102
+
103
+ g3.setPaint(gp2);
104
+
105
+ g3.fillRect(vimani.type2,10,30,580);
106
+
107
+ vimani.fuzecount2++;
108
+
109
+ if(vimani.fuzecount2 == 5){
110
+
111
+ vimani.keytypeflg2 = false;
112
+
113
+ vimani.fuzecount2 = 0;
114
+
115
+ }
116
+
117
+ }
118
+
119
+
120
+
121
+ g.setColor(new Color(102,255,204,255));//ノーツの色
122
+
123
+ for(int i=vimani.one+1;i<vimani.y1ic;i++){
124
+
125
+ if(vimani.y1[i] <640){
126
+
127
+ g.fillRoundRect(220, vimani.y1[i], 30, 20, 5, 10);
128
+
129
+ vimani.y1[i]+=vimani.speed;
130
+
131
+ }else{
132
+
133
+ if(vimani.playercombo > vimani.playerhighcombo){
134
+
135
+ vimani.playerhighcombo = vimani.playercombo;
136
+
137
+ }
138
+
139
+ vimani.playercombo = 0;
140
+
141
+ vimani.y1[i] = 990;
142
+
143
+ vimani.one = i;
144
+
145
+ }
146
+
147
+ }
148
+
149
+ for(int i=vimani.two+1;i<vimani.y2ic;i++){
150
+
151
+ if(vimani.y2[i] <640){
152
+
153
+ g.fillRoundRect(255, vimani.y2[i], 30, 20, 5, 10);
154
+
155
+ vimani.y2[i]+=vimani.speed;
156
+
157
+ }else{
158
+
159
+ if(vimani.playercombo > vimani.playerhighcombo){
160
+
161
+ vimani.playerhighcombo = vimani.playercombo;
162
+
163
+ }
164
+
165
+ vimani.playercombo = 0;
166
+
167
+ vimani.y2[i] = 990;
168
+
169
+ vimani.two = i;
170
+
171
+ }
172
+
173
+ }
174
+
175
+ for(int i=vimani.three+1;i<vimani.y3ic;i++){
176
+
177
+ if(vimani.y3[i] <640){
178
+
179
+ g.fillRoundRect(290, vimani.y3[i], 30, 20, 5, 10);
180
+
181
+ vimani.y3[i]+=vimani.speed;
182
+
183
+ }else{
184
+
185
+ if(vimani.playercombo > vimani.playerhighcombo){
186
+
187
+ vimani.playerhighcombo = vimani.playercombo;
188
+
189
+ }
190
+
191
+ vimani.playercombo = 0;
192
+
193
+ vimani.y3[i] = 990;
194
+
195
+ vimani.three = i;
196
+
197
+ }
198
+
199
+ }
200
+
201
+ for(int i=vimani.four+1;i<vimani.y4ic;i++){
202
+
203
+ if(vimani.y4[i] <640){
204
+
205
+ g.fillRoundRect(325, vimani.y4[i], 30, 20, 5, 10);
206
+
207
+ vimani.y4[i]+=vimani.speed;
208
+
209
+ }else{
210
+
211
+ if(vimani.playercombo > vimani.playerhighcombo){
212
+
213
+ vimani.playerhighcombo = vimani.playercombo;
214
+
215
+ }
216
+
217
+ vimani.playercombo = 0;
218
+
219
+ vimani.y4[i] = 990;
220
+
221
+ vimani.four=i;
222
+
223
+ }
224
+
225
+ }
226
+
227
+
228
+
229
+ if(vimani.keyhitflg == true){ //判定があった時
230
+
231
+ try {
232
+
233
+ //URL url = this.getClass().getResource("./hantei/"+vimani.hantei+".png");
234
+
235
+ Graphics2D g2d = (Graphics2D) g;
236
+
237
+ BufferedImage image = ImageIO.read(getClass().getResource("hantei/"+vimani.hantei+".png"));
238
+
239
+
240
+
241
+ g2d.drawImage(image,vimani.type-30,540,100,40,this);
242
+
243
+
244
+
245
+ } catch (IOException e) {
246
+
247
+ e.printStackTrace();
248
+
249
+ }
250
+
251
+ vimani.mikucount++;
252
+
253
+ if(vimani.mikucount == 10){
254
+
255
+ vimani.keyhitflg = false;
256
+
257
+ vimani.mikucount = 0;
258
+
259
+ }
260
+
261
+ }
262
+
263
+ if(vimani.keyhitflg2 == true){ //判定があった時
264
+
265
+ try {
266
+
267
+ Graphics2D g2e = (Graphics2D) g;
268
+
269
+ BufferedImage image2 = ImageIO.read(getClass().getResource("hantei/"+vimani.hantei+".png"));
270
+
271
+
272
+
273
+ g2e.drawImage(image2,vimani.type2-30,540,100,40,this);
274
+
275
+
276
+
277
+ } catch (IOException e) {
278
+
279
+ e.printStackTrace();
280
+
281
+ }
282
+
283
+ vimani.mikucount2++;
284
+
285
+ if(vimani.mikucount2 == 10){
286
+
287
+ vimani.keyhitflg2 = false;
288
+
289
+ vimani.mikucount2 = 0;
290
+
291
+ }
292
+
293
+ }
294
+
295
+
296
+
297
+
298
+
299
+
300
+
301
+ }
302
+
303
+ ```
304
+
305
+
306
+
307
+ 譜面の降ってくるレーンを表示し続け、その上に譜面データから読み込んだタイミングでノーツを4つのレーンに降らせ、キーが譜面にあったタイミングで押されたら、判定"good","great","pergect"等のpngの画像を押されたキーに対応したレーンに表示させています。
308
+
309
+ javaのGUIで音ゲー等の常に画面が更新されるものを作ろうとした際に、paintComponentで描画設定をして、repaint();すると良いよ、と見かけたことがあったのでそれを参考にしてプログラムしています。
310
+
311
+ 知識不足、記述不足の質問失礼いたしました。