スタック オーバーフローの皆さん、こんにちは。私のプログラムには、ドライバー クラス Frogger()、すべてを計算し、必要なすべてのパネルをまとめ、FroggerPanel() と呼ばれる keyListener を実装する JPanel クラス、および要素に基づいてすべてを描画する別の JPanel クラスがあります。 FroggerPanel() が FroggerDisplayPanel() を呼び出しました。
完全なコードを含むペーストビンは次のとおりです: http://pastebin.com/Axrbjej6。
タイマーが開始されていない場合、keyListener は正確に機能しますが、タイマーが開始されるとすぐに応答しなくなります。
これは、Frogger() クラスで keyListener が追加され、注目されている場所です。
public static void main(String[]args) throws IOException
{
frame = new JFrame("CS125 Frogger");
Frogger startPanel = new Frogger();
FroggerPanel panel = new FroggerPanel();
frame.addKeyListener(panel);
frame.setFocusable(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.pack();
frame.setVisible(true);
}
これは FroggerPanel() の stepGame() メソッドで、タイマーの遅延が切れたときに呼び出され、主にすべての車の移動に関係しています。setLocations() メソッドの Frog Rectangle は、keyListener に応答するために必要なものです。
private int current_x_step = 0;
private int lane_bounds = 0;
private int new_pos = 0;
private void stepGame() {
for (int i = 0; i < laneAmt; i++) {
if(i == 0 || i % 2 == 0){
current_x_step = X_STEP_SIZE;
lane_bounds = display.getWidth()+rUnit;
new_pos = -rUnit;
}else if((i-1) == 0 || (i-1) % 2 == 0){
current_x_step = -X_STEP_SIZE;
lane_bounds = -rUnit;
new_pos = DISPLAY_DIM + rUnit;
}
for(int j = 0; j < cars.get(i).size(); j++){
cars.get(i).get(j).x += current_x_step;
if (cars.get(i).get(j).x == lane_bounds) {
cars.get(i).get(j).x = new_pos;
}
if(cars.get(i).get(j).intersects(Frog)){
timer.stop();
startPause.setText("Retry?");
break;
}
}
}
display.setLocations(cars, Frog);
if(Frog.y == 0){
stepLevel();
}
}
これは FroggerPanel() クラスの keyListener コードです。
public void keyPressed(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_W: Frog.y -= rUnit; break;
case KeyEvent.VK_S: Frog.y += rUnit; break;
case KeyEvent.VK_A: Frog.x -= rUnit; break;
case KeyEvent.VK_D: Frog.x += rUnit; break;
}
display.setLocations(cars, Frog);
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
switch(e.getKeyCode()){
case KeyEvent.VK_W: Frog.y -= rUnit; break;
case KeyEvent.VK_S: Frog.y += rUnit; break;
case KeyEvent.VK_A: Frog.x -= rUnit; break;
case KeyEvent.VK_D: Frog.x += rUnit; break;
}
display.setLocations(cars, Frog);
}
どんな提案でも大歓迎です、助けてくれてありがとう!