teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

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

2021/06/13 06:18

投稿

cretter
cretter

スコア91

title CHANGED
File without changes
body CHANGED
@@ -18,8 +18,7 @@
18
18
  public class Test extends JFrame implements KeyListener{
19
19
  final int SPEED=5;
20
20
  int x=50,y=50;//xとy座標
21
- JPanel panel,ball;
21
+ JPanel panel;
22
- boolean go = false;
23
22
  public static void main(String[] args){
24
23
  Test cl = new Test("Test");
25
24
  }

2

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

2021/06/13 06:18

投稿

cretter
cretter

スコア91

title CHANGED
File without changes
body CHANGED
@@ -6,6 +6,184 @@
6
6
  矢印キーの読み込みは`KeyListener`を使用しています。
7
7
  サンプルコードは少し待ってください。
8
8
 
9
+ 追伸:
10
+ ソースコードを追加しました。
11
+ ソースコード1が一番最初の案でソースコード2が一番新しいものです。
12
+
13
+ ###ソースコード1
14
+ ```
15
+ import javax.swing.*;
16
+ import java.awt.*;
17
+ import java.awt.event.*;
18
+ public class Test extends JFrame implements KeyListener{
19
+ final int SPEED=5;
20
+ int x=50,y=50;//xとy座標
21
+ JPanel panel,ball;
22
+ boolean go = false;
23
+ public static void main(String[] args){
24
+ Test cl = new Test("Test");
25
+ }
26
+ Test(String title){
27
+ setTitle(title);
28
+ setSize(600,400);
29
+ setLocationRelativeTo(null);
30
+ setResizable(false);
31
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
32
+ setLayout(null);
33
+
34
+ panel = new JPanel();
35
+ panel.setBackground(Color.BLACK);
36
+ panel.setBounds(x,y,50,50);
37
+
38
+ add(panel);
39
+ setVisible(true);
40
+
41
+ addKeyListener(this);//KeyListener
42
+ }
43
+ @Override
44
+ public void keyTyped(KeyEvent e){/*何かのキー(aなど)を押した場合の処理*/}
45
+ @Override
46
+ public void keyPressed(KeyEvent e){/*キーを入力した際の処理*/
47
+ switch(e.getKeyCode()){
48
+ case KeyEvent.VK_UP://上キー 上移動
49
+ y-=SPEED;
50
+ break;
51
+ case KeyEvent.VK_DOWN://下キー 下移動
52
+ y+=SPEED;
53
+ break;
54
+ case KeyEvent.VK_LEFT://左キー 左移動
55
+ x-=SPEED;
56
+ break;
57
+ case KeyEvent.VK_RIGHT://右キー 右移動
58
+ x+=SPEED;
59
+ break;
60
+ }
61
+ panel.setBounds(x,y,50,50);
62
+ }
63
+ @Override
64
+ public void keyReleased(KeyEvent e){/*キーを離した際の処理*/}
65
+ }
66
+ ```
67
+
68
+ ###ソースコード2
69
+ ```
70
+ import javax.swing.*;
71
+ import java.awt.*;
72
+ import java.awt.event.*;
73
+ public class Main{
74
+ public static void main(String[] args){
75
+ Test cl=new Test("Test");
76
+ try{
77
+ while(true){
78
+ long s_Time = System.currentTimeMillis();//計測開始
79
+
80
+ for(int i=0;i<4;i++){
81
+ cl.movePanel(i,cl.wsad[i]);
82
+ }
83
+
84
+ cl.repaint();
85
+
86
+ long e_Time = System.currentTimeMillis();//計測終了
87
+ //FPS制御
88
+ try{
89
+ Thread.sleep(1000/cl.FPS-(e_Time-s_Time));
90
+ }catch(Exception e){
91
+ System.out.println("<Error>"+cl.FPS+"FPSの許容範囲を超えています ["+(1000/cl.FPS-(e_Time-s_Time))+"ms必要]");
92
+ }
93
+ }
94
+ }catch(Exception ee){
95
+ ee.printStackTrace();
96
+ }
97
+ }
98
+ }
99
+ class Test extends JFrame implements KeyListener{
100
+ final int SPEED=2;
101
+ final int FPS=60;
102
+ int x=50,y=50;//xとy座標
103
+ JPanel panel,ball;
104
+ boolean[] wsad = new boolean[4];
105
+
106
+ Test(String title){
107
+ setTitle(title);
108
+ setSize(600,400);
109
+ setLocationRelativeTo(null);
110
+ setResizable(false);
111
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
112
+ setLayout(null);
113
+
114
+ panel = new JPanel();
115
+ panel.setBackground(Color.BLACK);
116
+ panel.setBounds(x,y,50,50);
117
+
118
+ add(panel);
119
+ setVisible(true);
120
+
121
+ addKeyListener(this);//KeyListener
122
+ }
123
+ @Override
124
+ public void keyTyped(KeyEvent e){/*何かのキー(aなど)を押した場合の処理*/}
125
+ @Override
126
+ public void keyPressed(KeyEvent e){/*キーを入力した際の処理*/
127
+ switch(e.getKeyCode()){
128
+ case KeyEvent.VK_UP://上キー 上移動
129
+ wsad[0]=true;
130
+ break;
131
+ case KeyEvent.VK_DOWN://下キー 下移動
132
+ wsad[1]=true;
133
+ break;
134
+ case KeyEvent.VK_LEFT://左キー 左移動
135
+ wsad[2]=true;
136
+ break;
137
+ case KeyEvent.VK_RIGHT://右キー 右移動
138
+ wsad[3]=true;
139
+ break;
140
+ }
141
+ }
142
+ @Override
143
+ public void keyReleased(KeyEvent e){/*キーを離した際の処理*/
144
+ switch(e.getKeyCode()){
145
+ case KeyEvent.VK_UP://上キー 上移動
146
+ wsad[0]=false;
147
+ break;
148
+ case KeyEvent.VK_DOWN://下キー 下移動
149
+ wsad[1]=false;
150
+ break;
151
+ case KeyEvent.VK_LEFT://左キー 左移動
152
+ wsad[2]=false;
153
+ break;
154
+ case KeyEvent.VK_RIGHT://右キー 右移動
155
+ wsad[3]=false;
156
+ break;
157
+ }
158
+ }
159
+ void movePanel(int c,boolean go){
160
+ if(!go) return;
161
+ int x,y;
162
+ switch(c){
163
+ case 0:
164
+ x=0;
165
+ y=-1;
166
+ break;
167
+ case 1:
168
+ x=0;
169
+ y=1;
170
+ break;
171
+ case 2:
172
+ x=-1;
173
+ y=0;
174
+ break;
175
+ default:
176
+ x=1;
177
+ y=0;
178
+ break;
179
+ }
180
+ this.x+=x*SPEED;
181
+ this.y+=y*SPEED;
182
+ panel.setLocation(this.x,this.y);
183
+ }
184
+ }
185
+ ```
186
+
9
187
  ### 補足情報(FW/ツールのバージョンなど)
10
188
  java version "16.0.1" 2021-04-20
11
189
  Java(TM) SE Runtime Environment (build 16.0.1+9-24)

1

追加

2021/06/13 06:16

投稿

cretter
cretter

スコア91

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