在面板上移动一个矩形

时间:2015-07-19 04:05:00

标签: java events graphics

我正在创建一个蛇游戏,我想从最基本的开始,在屏幕上移动一个三角形。但我在如何在屏幕上移动矩形方面遇到麻烦

这是我到目前为止的代码:

Screen.java

0

BodyPart.java

>> k = 2;
>> isAssigned = ~isempty(whos(char(f(k))))
isAssigned =
     0

>> k = 3;
>> isAssigned = ~isempty(whos(char(f(k))))
isAssigned =
     1

Frame.java

public class Screen extends JPanel implements ActionListener, KeyListener {
    public static final JLabel statusbar = new JLabel("Default");
    public static final int WIDTH = 800, HEIGHT = 800;
    Timer t = new Timer(50, this);
    int x = 400;
    int y = 400;
    int velx = 0;
    int vely = 0;

    private BodyPart b;

    public Screen(){

        b = new BodyPart(x, y);
        t.start();
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
    }

    public static void main(String[] args) {

    }

    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.setColor(new Color(10, 50, 0));
        g.fillRect(0, 0, WIDTH, HEIGHT);

        g.setColor(Color.BLACK);
        for(int i = 0; i < WIDTH / 10; i++) {
            g.drawLine(i * 10, 0, i * 10, HEIGHT);
        }

        for(int i = 0; i < HEIGHT / 10; i++) {
            g.drawLine(0, i * 10, WIDTH, i * 10);
        }

        b.draw(g);
    }

    public void up(){
        vely = -10;
        velx = 0;
    }
    public void down(){
        vely = 10;
        velx = 0;
    }
    public void left(){
        vely = 0;
        velx = -10;
    }
    public void right(){
        vely = 0;
        velx = 10;
    }


    @Override
    public void actionPerformed(ActionEvent e) {
        repaint();
        x += velx;
        y += vely;
    }

    @Override
    public void keyTyped(KeyEvent e) {}

    @Override
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        switch(key){
        case KeyEvent.VK_DOWN: down();
            System.out.println("Down");
            break;
        case KeyEvent.VK_UP: up();
            System.out.println("up");
            break;
        case KeyEvent.VK_LEFT: left();
            System.out.println("left");
            break;
        case KeyEvent.VK_RIGHT: right();
            System.out.println("right");
            break;
        }        
    }

    @Override
    public void keyReleased(KeyEvent e) {}
}

因此,当我运行代码时,矩形仅显示在我设置的中心,并且它不会移动。无论如何要解决它吗?此外,状态栏也不会移动。 (有一些奇怪的东西,当我把所有东西放在一个文件中时,它确实有效)

另外,我打算使用public class BodyPart { int x; int y; public BodyPart(int x, int y) { this.x = x; this.y = y; } public void draw(Graphics g) { g.setColor(Color.red); g.fillRect(x, y, 10, 10); g.setColor(Color.white); g.drawRect(x, y, 10, 10); } } ,是否可以将此程序与public class Frame extends JPanel { private static JLabel statusbar = new JLabel("Default"); public Frame(){ statusbar = Screen.statusbar; } public static void main(String[] args) { JFrame f = new JFrame(); Screen s = new Screen(); BodyPart b = new BodyPart(400,400); f.add(s); f.add(statusbar, BorderLayout.SOUTH); f.setSize(800, 800); f.setVisible(true); f.setLocationRelativeTo(null); f.setResizable(false); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } 混合使用?或者我必须更改我的代码才能使用linkedlist<Point>

谢谢

2 个答案:

答案 0 :(得分:2)

我对Java不太熟悉,但似乎你从未调用BodyPart.draw()方法更新BodyPart。每当您想要更新BodyPart b的位置时,请致电b.draw(g)并传递Graphics g对象。

对于状态栏,我认为它会帮助您了解main(String[] args)方法仅在main /起始类中运行。它旨在为您的计划提供一个起点。因此,您应该在Frame类中重命名该方法并调用它,或者您可以将代码移动到Frame类的构造函数,它将在Frame初始化时运行

我不知道你为什么不能使用LinkedList<>

答案 1 :(得分:2)

您的问题如下:

您创建的BodyPart对象x = 400且y = 400,此时您只更改了Screen类中变量x和y的值,这是错误的,因为Screen.x与BodyPart.x不同,所以当您执行类似Screen.x + = 10的操作时,您还需要从BodyPart更新x变量。

您的问题的快速解决方案可能是这样的:

向draw方法添加2个参数并传递图形对象,x和y更新值。

@Override
public void paintComponent(Graphics g){
    super.paintComponent(g);
    g.setColor(new Color(10, 50, 0));
    g.fillRect(0, 0, WIDTH, HEIGHT);

    g.setColor(Color.BLACK);
    for(int i = 0; i < WIDTH / 10; i++) {
        g.drawLine(i * 10, 0, i * 10, HEIGHT);
    }

    for(int i = 0; i < HEIGHT / 10; i++) {
        g.drawLine(0, i * 10, WIDTH, i * 10);
    }

    b.draw(g, x, y);
}

接收x和y更新值并更新BodyPart x和y变量。

  public void draw(Graphics g, int x, int y) {
    this.x = x;
    this.y = y;

    g.setColor(Color.red);
    g.fillRect(x, y, 10, 10);
    g.setColor(Color.white);
    g.drawRect(x, y, 10, 10);
}