我正在学习Java,并尝试为我做一些测试来创建一个小小的Pong游戏,但是我无法在代码中使左右箭头键起作用,因此我遵循了一些教程,但仍然不起作用。
我的敌人和游戏中的球工作正常,一切都发生了碰撞,但是我仍然无法使控件/按键起作用。
这是我正在使用的代码以及我的类Player(我认为错误在这里,但是我仍然不知道如何找到它)。
代码
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_RIGHT)
player.right = true;
else if(e.getKeyCode() == KeyEvent.VK_LEFT)
player.left = true;
}
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_RIGHT)
player.right = false;
else if(e.getKeyCode() == KeyEvent.VK_LEFT)
player.left = false;
}
类“玩家”
public class Player {
public boolean right,left;
public int x,y;
public int width,height;
public Player(int x, int y) {
this.x = x;
this.y = y;
this.width = 40;
this.height = 10;
}
public void tick() {
if(right) {
x++;
}
else if(left) {
x--;
}
if(x+width > Game.WIDTH) {
x = Game.WIDTH - width;
}
else if(x < 0) {
x = 0;
}
}
public void Render(Graphics g) {
g.setColor(Color.blue);
g.fillRect(x, y, width,height);
}
}
这个小例子有一个KeyListener
可行的方法。播放器不会移动,因为Player.tick
未调用该方法。
// Pong.java
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
public class Pong {
public static void main(String[] arguments) {
SwingUtilities.invokeLater(() -> new Pong().createAndLaunchGui());
}
private void createAndLaunchGui() {
JFrame frame = new JFrame("Pong");
frame.setBounds(240, 160, Game.WIDTH, Game.HEIGHT);
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
frame.setContentPane(new Game());
frame.setVisible(true);
}
}
// Game.java
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JPanel;
public class Game extends JPanel {
public static int WIDTH = 800;
public static int HEIGHT = 600;
private final Player player = new Player(400, 300);
public Game() {
setFocusable(true);
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent keyEvent) {
System.out.println("Game.keyPressed -- event: " + keyEvent);
if (keyEvent.getKeyCode() == KeyEvent.VK_RIGHT) {
player.right = true;
} else if (keyEvent.getKeyCode() == KeyEvent.VK_LEFT) {
player.left = true;
}
}
@Override
public void keyReleased(KeyEvent keyEvent) {
System.out.println("Game.keyReleased -- event: " + keyEvent);
player.right = false;
player.left = false;
}
});
}
@Override
protected void paintComponent(Graphics graphics) {
super.paintComponent(graphics);
player.render(graphics);
}
}
解决问题的关键可能是setFocusable(true)
在Game
类的构造函数中调用方法。如此堆栈溢出答案中所述,事件仅分派给具有焦点的组件。有关更多详细信息,请参见该答案,并提供带有详细说明的博客文章链接。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句