java - 在面板上移动一个矩形

标签 java events graphics

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

这是我目前的代码:

屏幕.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) {}
}

BodyPart.java

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);
    }
}

框架.java

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> , 是否可以将此程序与 linkedlist<> 混合使用?或者我必须更改我的代码才能使用 linkedlist<>

谢谢

最佳答案

您的问题如下:

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

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

向您的绘制方法添加 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);
}

关于java - 在面板上移动一个矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31497895/

相关文章:

java - java中进程间文件锁定抛出异常

vb.net 进程类未到达 process.exited 事件

c# - 制作不传递任何信息的事件的标准是什么?

c++ - 使用 PCL 的浊点可视化流

java - 使用 JPA 2.1 生成元模型类

java - Tic-Tac-Toe 打印游戏树搜索中最佳移动的路径?

graphics - 在Stata中,如何组合不同宽度的箱线图?

r - 使用路径的弯曲矢量图形

Java覆盖现有的输出文件

php - PayPal REST API - 取消付款时没有 Webhook 事件?