1

此代码正确构建,一切似乎都可以正常工作,但关键是什么都不做。我认为要么是动作侦听器,要么是椭圆没有更新。我正在尝试通过初学者Java游戏编程来工作。我相信这很容易,但我没有抓住它。如果这有所作为,我正在使用 sublime text 2 的 mac。

package javagame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class JavaGame extends JFrame {

int x, y;

public class AL extends KeyAdapter {

    public void keyPressed(KeyEvent e) {
        int keycode = e.getKeyCode();
        if(keycode == e.VK_LEFT); {
            x-= 3;
        }
        if(keycode == e.VK_RIGHT); {
            x+= 3;
        }
        if(keycode == e.VK_UP); {
            y-= 3;
        }
        if(keycode == e.VK_DOWN); {
            y+= 3;
        }
    }


    public void keyReleased(KeyEvent e) {

    }
}

public JavaGame() {
    addKeyListener(new AL());
    setTitle("Jave Game");
    setSize(700, 700);
    setResizable(false);
    setVisible(true);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    x = 350;
    y = 350;
}

public void paint(Graphics g) {
    g.fillOval(x, y, 15, 15);

    repaint();
}

public static void main(String[] args) {
    new JavaGame();
}

}
4

2 回答 2

6

if您需要从语句中删除分号:

if (keycode == e.VK_LEFT)
{
   x-= 3;
}

if目前,随着分号终止这些语句,您的语句后面的代码块将独立呈现。


一些Swing特定的注释:

  • 最好paintComponent从子类中使用以JComponent获得更好的油漆性能。
  • 使用键绑定KeyListener改进键事件管理。这是一个例子
于 2012-12-08T21:52:44.733 回答
2

即使有建议的更正,您仍然会遇到可能的问题。

首先,JFrame实际上在其顶部包含许多组件,根窗格,其中包含内容和分层窗格以及玻璃窗格(通常是不可见的)。如果这些组件中的任何一个因任何原因获得键盘焦点,则您的 key listener 很可能会被忽略。

更好的解决方案是使用键绑定API,它可以更好地控制焦点问题。

你也违反了油漆合同。在大多数情况下,您需要调用super.paint,事实上,不鼓励您重写顶级容器的绘制方法,相反,您可以从类似的东西扩展JPanel并重写它的paintComponent方法。

这些绘制方法执行非常重要的工作,您不应轻易忽略/跳过它们。查看AWT 中的绘画和 Swing中的绘画以及Swing 中的自定义绘画以获取更多信息

于 2012-12-08T22:11:12.913 回答