有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

对象不会出现在java swing中的按键上

因此,我尝试使用swing在Java中制作一个非常简单的游戏。这是一个太空入侵者类型的游戏,我已经成功地在太空船上编码,它可以左右移动。然而,我有很多麻烦让“镜头”出现

我现在还不想定位它,我真的只是想在按键上创建一个对象来让它工作。我假设,因为它最初不是在“绘制”方法中,所以它不会出现。但我不知道怎么让它出现!有什么想法吗

以下是当前代码供参考:

public void keyPressed(KeyEvent e) {
    if (KeyEvent.VK_RIGHT == e.getKeyCode()) {
        moveRight();
    }
    if (KeyEvent.VK_LEFT == e.getKeyCode()) {

        moveLeft();
    }
    if (KeyEvent.VK_SPACE == e.getKeyCode()) {
        shoot();

    }
}

public void shoot() {
    Laser laser = new Laser(new Point(200, 200));
    this.repaint();
}

public void moveLeft() {
    if (player.getCentre().getX() <= 20) {
        player.setX(20);
    } else {
        double movement = player.getCentre().getX();
        movement -= 10;
        player.setX(movement);
    }
    this.repaint();
}

@Override
public void paint(Graphics g) {
    setBackground(Color.black);
    super.paint(g);
    player.draw(g);

}

我只想让shoot()成功创建一个对象,并让它显示在我的面板中


共 (1) 个答案

  1. # 1 楼答案

    问题/建议:

    • 您的拍摄方法创建的对象很好,但完全忽略了它。您不会将新创建的Laser对象添加到任何内容、类的字段、任何ArrayList以及任何其他集合中,因此该类将不知道该对象是否存在,并且一旦创建该对象的方法结束,该对象将准备进行垃圾收集,因为它仅在该方法中本地存在
    • 我们不知道你的KeyListener是否正常工作。你用println语句调试过这个部分吗?如果不是,我会这么做
    • 一般来说,我会避免使用Key Bindings键听器,因为后者对焦点要求不那么烦躁
    • 一般来说,不要重写JPanel的paint方法,而是它的paintComponent方法,并确保在重写中调用super的方法
    • 你的GUI只会绘制你让它绘制的内容,目前你的绘制方法只是要求绘制玩家的状态,而不是其他。如果你想要一个激光爆炸绘制,那么绘制方法,也就是应该是protected void paintComponent(Graphics g)覆盖而不是public void paint(Graphics g)覆盖,应该包含这样做的代码

    由于您发布了一个我们无法编译或运行的代码片段,所以我们提供的任何建议都有点有限。如果这些建议不能让你找到答案,那么请创建并发布一个小而简单的完整程序来说明你的问题,一个MCVE。请查看链接以了解这个非常有用的工具的详细信息