質問編集履歴

3

ソースコード1を修正しました。

2021/06/13 06:18

投稿

cretter
cretter

スコア91

test CHANGED
File without changes
test CHANGED
@@ -38,15 +38,173 @@
38
38
 
39
39
  int x=50,y=50;//xとy座標
40
40
 
41
+ JPanel panel;
42
+
43
+ public static void main(String[] args){
44
+
45
+ Test cl = new Test("Test");
46
+
47
+ }
48
+
49
+ Test(String title){
50
+
51
+ setTitle(title);
52
+
53
+ setSize(600,400);
54
+
55
+ setLocationRelativeTo(null);
56
+
57
+ setResizable(false);
58
+
59
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
60
+
61
+ setLayout(null);
62
+
63
+
64
+
65
+ panel = new JPanel();
66
+
67
+ panel.setBackground(Color.BLACK);
68
+
69
+ panel.setBounds(x,y,50,50);
70
+
71
+
72
+
73
+ add(panel);
74
+
75
+ setVisible(true);
76
+
77
+
78
+
79
+ addKeyListener(this);//KeyListener
80
+
81
+ }
82
+
83
+ @Override
84
+
85
+ public void keyTyped(KeyEvent e){/*何かのキー(aなど)を押した場合の処理*/}
86
+
87
+ @Override
88
+
89
+ public void keyPressed(KeyEvent e){/*キーを入力した際の処理*/
90
+
91
+ switch(e.getKeyCode()){
92
+
93
+ case KeyEvent.VK_UP://上キー 上移動
94
+
95
+ y-=SPEED;
96
+
97
+ break;
98
+
99
+ case KeyEvent.VK_DOWN://下キー 下移動
100
+
101
+ y+=SPEED;
102
+
103
+ break;
104
+
105
+ case KeyEvent.VK_LEFT://左キー 左移動
106
+
107
+ x-=SPEED;
108
+
109
+ break;
110
+
111
+ case KeyEvent.VK_RIGHT://右キー 右移動
112
+
113
+ x+=SPEED;
114
+
115
+ break;
116
+
117
+ }
118
+
119
+ panel.setBounds(x,y,50,50);
120
+
121
+ }
122
+
123
+ @Override
124
+
125
+ public void keyReleased(KeyEvent e){/*キーを離した際の処理*/}
126
+
127
+ }
128
+
129
+ ```
130
+
131
+
132
+
133
+ ###ソースコード2
134
+
135
+ ```
136
+
137
+ import javax.swing.*;
138
+
139
+ import java.awt.*;
140
+
141
+ import java.awt.event.*;
142
+
143
+ public class Main{
144
+
145
+ public static void main(String[] args){
146
+
147
+ Test cl=new Test("Test");
148
+
149
+ try{
150
+
151
+ while(true){
152
+
153
+ long s_Time = System.currentTimeMillis();//計測開始
154
+
155
+
156
+
157
+ for(int i=0;i<4;i++){
158
+
159
+ cl.movePanel(i,cl.wsad[i]);
160
+
161
+ }
162
+
163
+
164
+
165
+ cl.repaint();
166
+
167
+
168
+
169
+ long e_Time = System.currentTimeMillis();//計測終了
170
+
171
+ //FPS制御
172
+
173
+ try{
174
+
175
+ Thread.sleep(1000/cl.FPS-(e_Time-s_Time));
176
+
177
+ }catch(Exception e){
178
+
179
+ System.out.println("<Error>"+cl.FPS+"FPSの許容範囲を超えています ["+(1000/cl.FPS-(e_Time-s_Time))+"ms必要]");
180
+
181
+ }
182
+
183
+ }
184
+
185
+ }catch(Exception ee){
186
+
187
+ ee.printStackTrace();
188
+
189
+ }
190
+
191
+ }
192
+
193
+ }
194
+
195
+ class Test extends JFrame implements KeyListener{
196
+
197
+ final int SPEED=2;
198
+
199
+ final int FPS=60;
200
+
201
+ int x=50,y=50;//xとy座標
202
+
41
203
  JPanel panel,ball;
42
204
 
43
- boolean go = false;
205
+ boolean[] wsad = new boolean[4];
44
-
45
- public static void main(String[] args){
206
+
46
-
47
- Test cl = new Test("Test");
207
+
48
-
49
- }
50
208
 
51
209
  Test(String title){
52
210
 
@@ -94,37 +252,115 @@
94
252
 
95
253
  case KeyEvent.VK_UP://上キー 上移動
96
254
 
97
- y-=SPEED;
255
+ wsad[0]=true;
98
256
 
99
257
  break;
100
258
 
101
259
  case KeyEvent.VK_DOWN://下キー 下移動
102
260
 
103
- y+=SPEED;
261
+ wsad[1]=true;
104
262
 
105
263
  break;
106
264
 
107
265
  case KeyEvent.VK_LEFT://左キー 左移動
108
266
 
109
- x-=SPEED;
267
+ wsad[2]=true;
110
268
 
111
269
  break;
112
270
 
113
271
  case KeyEvent.VK_RIGHT://右キー 右移動
114
272
 
115
- x+=SPEED;
273
+ wsad[3]=true;
116
-
274
+
117
- break;
275
+ break;
118
-
276
+
119
- }
277
+ }
120
-
121
- panel.setBounds(x,y,50,50);
278
+
122
-
123
- }
279
+ }
124
-
280
+
125
- @Override
281
+ @Override
126
-
282
+
127
- public void keyReleased(KeyEvent e){/*キーを離した際の処理*/}
283
+ public void keyReleased(KeyEvent e){/*キーを離した際の処理*/
284
+
285
+ switch(e.getKeyCode()){
286
+
287
+ case KeyEvent.VK_UP://上キー 上移動
288
+
289
+ wsad[0]=false;
290
+
291
+ break;
292
+
293
+ case KeyEvent.VK_DOWN://下キー 下移動
294
+
295
+ wsad[1]=false;
296
+
297
+ break;
298
+
299
+ case KeyEvent.VK_LEFT://左キー 左移動
300
+
301
+ wsad[2]=false;
302
+
303
+ break;
304
+
305
+ case KeyEvent.VK_RIGHT://右キー 右移動
306
+
307
+ wsad[3]=false;
308
+
309
+ break;
310
+
311
+ }
312
+
313
+ }
314
+
315
+ void movePanel(int c,boolean go){
316
+
317
+ if(!go) return;
318
+
319
+ int x,y;
320
+
321
+ switch(c){
322
+
323
+ case 0:
324
+
325
+ x=0;
326
+
327
+ y=-1;
328
+
329
+ break;
330
+
331
+ case 1:
332
+
333
+ x=0;
334
+
335
+ y=1;
336
+
337
+ break;
338
+
339
+ case 2:
340
+
341
+ x=-1;
342
+
343
+ y=0;
344
+
345
+ break;
346
+
347
+ default:
348
+
349
+ x=1;
350
+
351
+ y=0;
352
+
353
+ break;
354
+
355
+ }
356
+
357
+ this.x+=x*SPEED;
358
+
359
+ this.y+=y*SPEED;
360
+
361
+ panel.setLocation(this.x,this.y);
362
+
363
+ }
128
364
 
129
365
  }
130
366
 
@@ -132,244 +368,6 @@
132
368
 
133
369
 
134
370
 
135
- ###ソースコード2
136
-
137
- ```
138
-
139
- import javax.swing.*;
140
-
141
- import java.awt.*;
142
-
143
- import java.awt.event.*;
144
-
145
- public class Main{
146
-
147
- public static void main(String[] args){
148
-
149
- Test cl=new Test("Test");
150
-
151
- try{
152
-
153
- while(true){
154
-
155
- long s_Time = System.currentTimeMillis();//計測開始
156
-
157
-
158
-
159
- for(int i=0;i<4;i++){
160
-
161
- cl.movePanel(i,cl.wsad[i]);
162
-
163
- }
164
-
165
-
166
-
167
- cl.repaint();
168
-
169
-
170
-
171
- long e_Time = System.currentTimeMillis();//計測終了
172
-
173
- //FPS制御
174
-
175
- try{
176
-
177
- Thread.sleep(1000/cl.FPS-(e_Time-s_Time));
178
-
179
- }catch(Exception e){
180
-
181
- System.out.println("<Error>"+cl.FPS+"FPSの許容範囲を超えています ["+(1000/cl.FPS-(e_Time-s_Time))+"ms必要]");
182
-
183
- }
184
-
185
- }
186
-
187
- }catch(Exception ee){
188
-
189
- ee.printStackTrace();
190
-
191
- }
192
-
193
- }
194
-
195
- }
196
-
197
- class Test extends JFrame implements KeyListener{
198
-
199
- final int SPEED=2;
200
-
201
- final int FPS=60;
202
-
203
- int x=50,y=50;//xとy座標
204
-
205
- JPanel panel,ball;
206
-
207
- boolean[] wsad = new boolean[4];
208
-
209
-
210
-
211
- Test(String title){
212
-
213
- setTitle(title);
214
-
215
- setSize(600,400);
216
-
217
- setLocationRelativeTo(null);
218
-
219
- setResizable(false);
220
-
221
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
222
-
223
- setLayout(null);
224
-
225
-
226
-
227
- panel = new JPanel();
228
-
229
- panel.setBackground(Color.BLACK);
230
-
231
- panel.setBounds(x,y,50,50);
232
-
233
-
234
-
235
- add(panel);
236
-
237
- setVisible(true);
238
-
239
-
240
-
241
- addKeyListener(this);//KeyListener
242
-
243
- }
244
-
245
- @Override
246
-
247
- public void keyTyped(KeyEvent e){/*何かのキー(aなど)を押した場合の処理*/}
248
-
249
- @Override
250
-
251
- public void keyPressed(KeyEvent e){/*キーを入力した際の処理*/
252
-
253
- switch(e.getKeyCode()){
254
-
255
- case KeyEvent.VK_UP://上キー 上移動
256
-
257
- wsad[0]=true;
258
-
259
- break;
260
-
261
- case KeyEvent.VK_DOWN://下キー 下移動
262
-
263
- wsad[1]=true;
264
-
265
- break;
266
-
267
- case KeyEvent.VK_LEFT://左キー 左移動
268
-
269
- wsad[2]=true;
270
-
271
- break;
272
-
273
- case KeyEvent.VK_RIGHT://右キー 右移動
274
-
275
- wsad[3]=true;
276
-
277
- break;
278
-
279
- }
280
-
281
- }
282
-
283
- @Override
284
-
285
- public void keyReleased(KeyEvent e){/*キーを離した際の処理*/
286
-
287
- switch(e.getKeyCode()){
288
-
289
- case KeyEvent.VK_UP://上キー 上移動
290
-
291
- wsad[0]=false;
292
-
293
- break;
294
-
295
- case KeyEvent.VK_DOWN://下キー 下移動
296
-
297
- wsad[1]=false;
298
-
299
- break;
300
-
301
- case KeyEvent.VK_LEFT://左キー 左移動
302
-
303
- wsad[2]=false;
304
-
305
- break;
306
-
307
- case KeyEvent.VK_RIGHT://右キー 右移動
308
-
309
- wsad[3]=false;
310
-
311
- break;
312
-
313
- }
314
-
315
- }
316
-
317
- void movePanel(int c,boolean go){
318
-
319
- if(!go) return;
320
-
321
- int x,y;
322
-
323
- switch(c){
324
-
325
- case 0:
326
-
327
- x=0;
328
-
329
- y=-1;
330
-
331
- break;
332
-
333
- case 1:
334
-
335
- x=0;
336
-
337
- y=1;
338
-
339
- break;
340
-
341
- case 2:
342
-
343
- x=-1;
344
-
345
- y=0;
346
-
347
- break;
348
-
349
- default:
350
-
351
- x=1;
352
-
353
- y=0;
354
-
355
- break;
356
-
357
- }
358
-
359
- this.x+=x*SPEED;
360
-
361
- this.y+=y*SPEED;
362
-
363
- panel.setLocation(this.x,this.y);
364
-
365
- }
366
-
367
- }
368
-
369
- ```
370
-
371
-
372
-
373
371
  ### 補足情報(FW/ツールのバージョンなど)
374
372
 
375
373
  java version "16.0.1" 2021-04-20

2

ソースコードを追加しました。

2021/06/13 06:18

投稿

cretter
cretter

スコア91

test CHANGED
File without changes
test CHANGED
@@ -14,6 +14,362 @@
14
14
 
15
15
 
16
16
 
17
+ 追伸:
18
+
19
+ ソースコードを追加しました。
20
+
21
+ ソースコード1が一番最初の案でソースコード2が一番新しいものです。
22
+
23
+
24
+
25
+ ###ソースコード1
26
+
27
+ ```
28
+
29
+ import javax.swing.*;
30
+
31
+ import java.awt.*;
32
+
33
+ import java.awt.event.*;
34
+
35
+ public class Test extends JFrame implements KeyListener{
36
+
37
+ final int SPEED=5;
38
+
39
+ int x=50,y=50;//xとy座標
40
+
41
+ JPanel panel,ball;
42
+
43
+ boolean go = false;
44
+
45
+ public static void main(String[] args){
46
+
47
+ Test cl = new Test("Test");
48
+
49
+ }
50
+
51
+ Test(String title){
52
+
53
+ setTitle(title);
54
+
55
+ setSize(600,400);
56
+
57
+ setLocationRelativeTo(null);
58
+
59
+ setResizable(false);
60
+
61
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
62
+
63
+ setLayout(null);
64
+
65
+
66
+
67
+ panel = new JPanel();
68
+
69
+ panel.setBackground(Color.BLACK);
70
+
71
+ panel.setBounds(x,y,50,50);
72
+
73
+
74
+
75
+ add(panel);
76
+
77
+ setVisible(true);
78
+
79
+
80
+
81
+ addKeyListener(this);//KeyListener
82
+
83
+ }
84
+
85
+ @Override
86
+
87
+ public void keyTyped(KeyEvent e){/*何かのキー(aなど)を押した場合の処理*/}
88
+
89
+ @Override
90
+
91
+ public void keyPressed(KeyEvent e){/*キーを入力した際の処理*/
92
+
93
+ switch(e.getKeyCode()){
94
+
95
+ case KeyEvent.VK_UP://上キー 上移動
96
+
97
+ y-=SPEED;
98
+
99
+ break;
100
+
101
+ case KeyEvent.VK_DOWN://下キー 下移動
102
+
103
+ y+=SPEED;
104
+
105
+ break;
106
+
107
+ case KeyEvent.VK_LEFT://左キー 左移動
108
+
109
+ x-=SPEED;
110
+
111
+ break;
112
+
113
+ case KeyEvent.VK_RIGHT://右キー 右移動
114
+
115
+ x+=SPEED;
116
+
117
+ break;
118
+
119
+ }
120
+
121
+ panel.setBounds(x,y,50,50);
122
+
123
+ }
124
+
125
+ @Override
126
+
127
+ public void keyReleased(KeyEvent e){/*キーを離した際の処理*/}
128
+
129
+ }
130
+
131
+ ```
132
+
133
+
134
+
135
+ ###ソースコード2
136
+
137
+ ```
138
+
139
+ import javax.swing.*;
140
+
141
+ import java.awt.*;
142
+
143
+ import java.awt.event.*;
144
+
145
+ public class Main{
146
+
147
+ public static void main(String[] args){
148
+
149
+ Test cl=new Test("Test");
150
+
151
+ try{
152
+
153
+ while(true){
154
+
155
+ long s_Time = System.currentTimeMillis();//計測開始
156
+
157
+
158
+
159
+ for(int i=0;i<4;i++){
160
+
161
+ cl.movePanel(i,cl.wsad[i]);
162
+
163
+ }
164
+
165
+
166
+
167
+ cl.repaint();
168
+
169
+
170
+
171
+ long e_Time = System.currentTimeMillis();//計測終了
172
+
173
+ //FPS制御
174
+
175
+ try{
176
+
177
+ Thread.sleep(1000/cl.FPS-(e_Time-s_Time));
178
+
179
+ }catch(Exception e){
180
+
181
+ System.out.println("<Error>"+cl.FPS+"FPSの許容範囲を超えています ["+(1000/cl.FPS-(e_Time-s_Time))+"ms必要]");
182
+
183
+ }
184
+
185
+ }
186
+
187
+ }catch(Exception ee){
188
+
189
+ ee.printStackTrace();
190
+
191
+ }
192
+
193
+ }
194
+
195
+ }
196
+
197
+ class Test extends JFrame implements KeyListener{
198
+
199
+ final int SPEED=2;
200
+
201
+ final int FPS=60;
202
+
203
+ int x=50,y=50;//xとy座標
204
+
205
+ JPanel panel,ball;
206
+
207
+ boolean[] wsad = new boolean[4];
208
+
209
+
210
+
211
+ Test(String title){
212
+
213
+ setTitle(title);
214
+
215
+ setSize(600,400);
216
+
217
+ setLocationRelativeTo(null);
218
+
219
+ setResizable(false);
220
+
221
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
222
+
223
+ setLayout(null);
224
+
225
+
226
+
227
+ panel = new JPanel();
228
+
229
+ panel.setBackground(Color.BLACK);
230
+
231
+ panel.setBounds(x,y,50,50);
232
+
233
+
234
+
235
+ add(panel);
236
+
237
+ setVisible(true);
238
+
239
+
240
+
241
+ addKeyListener(this);//KeyListener
242
+
243
+ }
244
+
245
+ @Override
246
+
247
+ public void keyTyped(KeyEvent e){/*何かのキー(aなど)を押した場合の処理*/}
248
+
249
+ @Override
250
+
251
+ public void keyPressed(KeyEvent e){/*キーを入力した際の処理*/
252
+
253
+ switch(e.getKeyCode()){
254
+
255
+ case KeyEvent.VK_UP://上キー 上移動
256
+
257
+ wsad[0]=true;
258
+
259
+ break;
260
+
261
+ case KeyEvent.VK_DOWN://下キー 下移動
262
+
263
+ wsad[1]=true;
264
+
265
+ break;
266
+
267
+ case KeyEvent.VK_LEFT://左キー 左移動
268
+
269
+ wsad[2]=true;
270
+
271
+ break;
272
+
273
+ case KeyEvent.VK_RIGHT://右キー 右移動
274
+
275
+ wsad[3]=true;
276
+
277
+ break;
278
+
279
+ }
280
+
281
+ }
282
+
283
+ @Override
284
+
285
+ public void keyReleased(KeyEvent e){/*キーを離した際の処理*/
286
+
287
+ switch(e.getKeyCode()){
288
+
289
+ case KeyEvent.VK_UP://上キー 上移動
290
+
291
+ wsad[0]=false;
292
+
293
+ break;
294
+
295
+ case KeyEvent.VK_DOWN://下キー 下移動
296
+
297
+ wsad[1]=false;
298
+
299
+ break;
300
+
301
+ case KeyEvent.VK_LEFT://左キー 左移動
302
+
303
+ wsad[2]=false;
304
+
305
+ break;
306
+
307
+ case KeyEvent.VK_RIGHT://右キー 右移動
308
+
309
+ wsad[3]=false;
310
+
311
+ break;
312
+
313
+ }
314
+
315
+ }
316
+
317
+ void movePanel(int c,boolean go){
318
+
319
+ if(!go) return;
320
+
321
+ int x,y;
322
+
323
+ switch(c){
324
+
325
+ case 0:
326
+
327
+ x=0;
328
+
329
+ y=-1;
330
+
331
+ break;
332
+
333
+ case 1:
334
+
335
+ x=0;
336
+
337
+ y=1;
338
+
339
+ break;
340
+
341
+ case 2:
342
+
343
+ x=-1;
344
+
345
+ y=0;
346
+
347
+ break;
348
+
349
+ default:
350
+
351
+ x=1;
352
+
353
+ y=0;
354
+
355
+ break;
356
+
357
+ }
358
+
359
+ this.x+=x*SPEED;
360
+
361
+ this.y+=y*SPEED;
362
+
363
+ panel.setLocation(this.x,this.y);
364
+
365
+ }
366
+
367
+ }
368
+
369
+ ```
370
+
371
+
372
+
17
373
  ### 補足情報(FW/ツールのバージョンなど)
18
374
 
19
375
  java version "16.0.1" 2021-04-20

1

追加

2021/06/13 06:16

投稿

cretter
cretter

スコア91

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,16 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
3
  矢印キーを押している間、画像が任意の方向に上下左右に動くプログラムを作っています。そこで初めは矢印キーを押した瞬間にすこし反応し、一瞬反応しなくなった後に連続で反応するようになっていました。しかし、初めに少し止まるのはあまりよくなかったので、次は`while`文を使って`FPS`制御にし、矢印キーを押すと押した方向に進むメソッドを有効にする方法に変えました。しかし、それだと矢印キーを離しても動き続けてしまいました。なので次は、矢印キーを離したときに進むメソッドを無効にするようにしようとしていますが、これが最適なのでしょうか。教えてください。理想はマインクラフトやマリオなどのボタンから手を離した時に止まる動きです。
4
+
5
+
6
+
7
+ 追伸:
8
+
9
+ 画像は`swing`の`JFrame`に色付き`JPanel`を表示しています。
10
+
11
+ 矢印キーの読み込みは`KeyListener`を使用しています。
12
+
13
+ サンプルコードは少し待ってください。
4
14
 
5
15
 
6
16