我创建了一个 KeyL.java 类来监听键盘事件:
package game.listener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
/**
*
* @author paul
*/
public class KeyL extends KeyAdapter implements KeyListener {
private boolean keyPressed[] = new boolean[128];
@Override
public void keyTyped(KeyEvent keyEvent) {System.out.println("test key typed");}
@Override
public void keyPressed(KeyEvent keyEvent) {
System.out.println("test key pressed");
keyPressed[keyEvent.getKeyCode()] = true;
}
@Override
public void keyReleased(KeyEvent keyEvent) {
System.out.println("test key released");
keyPressed[keyEvent.getKeyCode()] = false;
}
public boolean isKeyPressed(int keyCode) {
return keyPressed[keyCode];
}
}
我尝试在我的 Game.java 类中使用这个类:
package game;
import game.listener.KeyL;
import game.listener.MouseL;
import game.listener.WindowL;
import javax.swing.JFrame;
import java.awt.event.KeyEvent;
/**
*
* @author paul
*/
public class Game extends JFrame {
private final KeyL keyListener = new KeyL();
private final MouseL mouseListener = new MouseL();
private final WindowL windowListener = new WindowL();
private boolean isRunning = false;
private long lastTime;
public Game() {
this.setSize(Constants.WINDOW_WIDTH, Constants.WINDOW_HEIGHT);
this.setTitle(Constants.WINDOW_TITLE);
this.setResizable(Constants.IS_RESIZABLE);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.addKeyListener(keyListener);
this.addMouseListener(mouseListener);
this.addMouseMotionListener(mouseListener);
this.addWindowListener(windowListener);
this.setLocationRelativeTo(null);
this.setFocusable(true);
}
public void update(double deltaTime) {
}
public void run() {
this.isRunning = true;
while(this.isRunning) {
long current = System.nanoTime();
double deltaTime = (current - this.lastTime) / 1e9;
this.lastTime = current;
this.update(deltaTime);
if (keyListener.isKeyPressed(KeyEvent.VK_ENTER)) {
this.isRunning = false;
System.out.println("ENTER");
}
}
this.dispose();
}
}
当我按下键盘上的按键时,来自 KeyL 类的测试消息甚至不会出现在控制台中。当我尝试测试运行函数中是否按下“enter”键时,它也不起作用。
这样做是好的做法吗?
package game;
import game.listener.KeyL;
import game.listener.MouseL;
import game.listener.WindowL;
import javax.swing.JFrame;
import javax.swing.Timer;
import java.awt.event.KeyEvent;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
*
* @author paul
*/
public class Game extends JFrame implements ActionListener {
private final KeyL keyListener = new KeyL();
private final MouseL mouseListener = new MouseL();
private final WindowL windowListener = new WindowL();
private Timer timer;
private long lastTime;
public Game() {
this.setSize(Constants.WINDOW_WIDTH, Constants.WINDOW_HEIGHT);
this.setTitle(Constants.WINDOW_TITLE);
this.setResizable(Constants.IS_RESIZABLE);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.addKeyListener(keyListener);
this.addMouseListener(mouseListener);
this.addMouseMotionListener(mouseListener);
this.addWindowListener(windowListener);
this.setLocationRelativeTo(null);
this.setFocusable(true);
timer = new Timer(1000/60, this);
timer.start();
}
@Override
public void actionPerformed(ActionEvent e) {
long current = System.nanoTime();
double deltaTime = (current - this.lastTime)/1e9;
this.lastTime = current;
update(deltaTime);
}
public void update(double deltaTime) {
}
}