如何使KeyListener发挥作用?

Azrael_Hellcat

我正在学习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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章