我正在制作一个简单的 Java 游戏,并且有一个很棒的想法,将我的输入处理分离到一个单独的类,然后是主游戏。我无法让我的 InputHandler 类实际接收输入。
主游戏类 (DrawPanel.java)
package com.eriksaulnier.DesignedToFail;
import java.awt.*;
import java.awt.image.*;
import com.eriksaulnier.DesignedToFail.InputHandler;
import javax.swing.*;
public class DrawPanel extends JPanel {
private static final long serialVersionUID = 1L;
BufferedImage buffer;
InputHandler inputHandler;
Entity player;
Entity enemy;
public boolean spawnBullet = false;
public DrawPanel () {
setIgnoreRepaint(true);
setVisible(true);
setFocusable(true);
addKeyListener(inputHandler);
addMouseListener(inputHandler);
new InputHandler();
}
public void initialize() {
buffer = new BufferedImage(800,600,BufferedImage.TYPE_INT_RGB);
player = new Entity(370, 270);
enemy = new Entity(100, 100);
}
public void update() {
player.move();
}
public void checkCollisions() {
if (player.getBounds().intersects(enemy.getBounds()))
player.collision = true;
else
player.collision = false;
}
public void drawBuffer() {
Graphics2D b = buffer.createGraphics();
b.setColor(Color.white);
b.fillRect(0, 0, 800, 600);
if (player.collision == false) {
b.setColor(Color.blue);
b.fillRect(player.getX(), player.getY(), player.getWidth(), player.getHeight());
b.setColor(Color.red);
b.fillRect(enemy.getX(), enemy.getY(), enemy.getWidth(), enemy.getHeight());
b.dispose();
}
else {
b.setColor(Color.black);
b.drawString("Collision!", 350, 300);
b.dispose();
}
}
public void drawScreen() {
Graphics2D g = (Graphics2D)this.getGraphics();
g.drawImage(buffer, 0, 0, this);
Toolkit.getDefaultToolkit().sync();
g.dispose();
}
public void startGame() {
initialize();
while(true) {
try {
update();
checkCollisions();
drawBuffer();
drawScreen();
Thread.sleep(15);
}
catch(Exception e) {
e.printStackTrace();
}
}
}
}
输入处理程序(输入处理程序.java)
package com.eriksaulnier.DesignedToFail;
import java.awt.event.KeyListener;
import java.awt.event.MouseListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import javax.swing.JPanel;
public class InputHandler extends JPanel implements KeyListener, MouseListener {
public boolean isShooting = false;
Entity player;
public InputHandler () {
System.out.println("Listener Works!");
}
public void mouseClicked(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
int button = e.getButton();
if (button == MouseEvent.BUTTON1)
isShooting = true;
System.out.println("Shooting!");
}
public void mouseReleased(MouseEvent e) {
int button = e.getButton();
if (button == MouseEvent.BUTTON1)
isShooting = false;
System.out.println("Not Shooting!");
}
public void mouseEntered(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_W)
player.up = true;
if (key == KeyEvent.VK_S)
player.down = true;
if (key == KeyEvent.VK_A)
player.left = true;
if (key == KeyEvent.VK_D)
player.right = true;
}
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_W)
player.up = false;
if (key == KeyEvent.VK_S)
player.down = false;
if (key == KeyEvent.VK_A)
player.left = false;
if (key == KeyEvent.VK_D)
player.right = false;
}
}
最佳答案
您似乎将空处理程序传递到您的 GUI 中。例如,您在使用 inputHandler 变量之前在哪里实例化它?
例如:
public class DrawPanel extends JPanel {
//...
InputHandler inputHandler; // here you declare the variable
//...
public DrawPanel () {
setIgnoreRepaint(true); // why this line?
setVisible(true); // not needed in a JPanel's code
setFocusable(true);
addKeyListener(inputHandler); // here you use a null variable
addMouseListener(inputHandler); // ditto, here you use a null variable
new InputHandler(); // I don't know what you're doing here
}
在上面的代码中,在使用它之前,我没有看到任何地方有 inputHandler = new InputHandler()
。您似乎创建了一个新的 InputHandler 的行,您没有将该对象分配给任何变量或使用它,因此这行代码似乎是徒劳的,因此我对我不确定该行应该是什么的评论实现。请注意,这些问题与 Swing 无关,而与基本核心 Java 有关。
还有:
- 您的处理程序类不应扩展 Swing 组件,例如 JPanel。他们应该只实现监听器接口(interface)。
- 您应该避免将 KeyListeners 与 Swing GUI 一起使用,而应尽可能使用键绑定(bind)。请谷歌搜索并查看键绑定(bind)教程以获取更多相关信息。
- 处理程序的使用在 Oracle Swing 教程中有很好的解释。再次,请谷歌这些并研究它们。我可以证明它们的用处,因为它们是我学习 Swing 编码的地方。
关于java - KeyListener 和 MouseListener 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14149204/