【问题标题】:creating squares on event在事件上创建正方形
【发布时间】:2013-03-04 12:23:51
【问题描述】:

我正在尝试使用与蛇相同的系统创建游戏。我创建了一个窗口,上面有一个JPanel,给它一个背景和画线来向用户显示正方形。

Board 为 600x600(601x601 以使所有人可见)。 正方形是 20x20。

现在我正在尝试添加一种将彩色方块放在板上的方法,并且还可以检测彩色方块是否已经存在。

public class CreateWindow extends JFrame {

    JPanel GameArea;
    static JLayeredPane Java_Window;
    Image Background;

    public void CreateWindow() {
        Dimension Panel_Size = new Dimension(800, 800);
        this.setSize(800,800);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible( true );
        this.setTitle("LineRage");
        getContentPane().setBackground(Color.white); 

        Java_Window = new JLayeredPane();
        this.add(Java_Window);
        Java_Window.setPreferredSize(Panel_Size);

        GameArea = new JPanel()
        {
            @Override
            public void paint(Graphics g) {
                g.setColor(Color.BLACK);
                g.fillRect(0,0,601,601);

                g.setColor(Color.GRAY);
                // Cut map into sections
                int x;
                //draw vertical lines
                for(x = 0; x < 31; x++) {
                    g.drawLine(x*20,0,x*20,600);
                }    
                //draw horizontal lines
                for(x = 0; x < 31; x++) {
                    g.drawLine(0,x*20,600,x*20);
                }     
            }

            public void PaintSquare (int x,int y) {
                //Check if square painted

                //Paint square
                Rectangle rect = new Rectangle(x, y, 20, 20);
                GameArea.add(rect);
            }
        };
        Java_Window.add(GameArea, JLayeredPane.DEFAULT_LAYER);
        GameArea.setBounds(20, 20, 601, 601);
        GameArea.setVisible(true);
    }
}

所以Java_Window (800x800) 有一个白色背景, Game_Area (601x601) 有黑色背景,有 32 条线沿着并穿过它,将其分成正方形。

public void PaintSquare (int x, int y) {
    //Check if square painted

    //Paint square
    Rectangle square = new Rectangle(x, y, 20, 20);
    GameArea.add(square);
}

PaintSquare 将从另一个对象(主游戏)调用并检查正方形的背景,如果它是空闲的,它将在其上绘制一个正方形 (20x20)。

【问题讨论】:

  • 问题是什么?
  • 抱歉不清楚,问题是,如何通过调用 PaintSquare() 创建正方形来占据空间。我已经在网上阅读了很多东西,但没有任何东西可以使我工作。

标签: java swing jpanel paint


【解决方案1】:

您的确切问题尚不清楚,但这里有一些提示:

  • 在 Swing 中进行自定义绘制时使用 paintComponent 而不是 paint。不要忘记致电super.paintComponent(g)
  • java.awt.Rectangle 不是从 JComponent(或 Component)派生的,因此无法添加到容器中。
  • 一种方法是使用fillRect 并“绘制”正方形:

此外,在 Java 中,方法以 小写 字母开头。将这一点和上一点相加,您可以这样做:

public void paintSquare(Graphics g, int x, int y) {
   g.fillRect(x, y, 20, 20);
}

这里,paintSquare 方法将从paintComponent 调用。

【讨论】:

  • +1 最佳方法;另请参阅相关的example
  • JPanel创建后可以使用fillRect吗?
【解决方案2】:

听从Reimeus'的建议,另外,你需要创建一个GUI模型。

在游戏模型类中定义一个与游戏板大小相同的 Rectangle 数组。

Rectangle[][] board;

这样,您可以在模型类中测试重叠的蛇,而不必担心已经绘制的内容。

您的paintComponent 方法变得非常简单。

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    model.draw(g);
}

请参阅this answer 以获得更完整的解释。

【讨论】:

  • int 二维数组有效吗?最终会有多个用户,然后一个开关来查找是否空闲,用户蛇在那里或另一个对象?
  • 一个 int 数组是不够的。你的模型必须包含足够的信息来绘制自己,这就是我使用 Rectangle 类的原因。您可以定义自己的类并将其制成二维数组。您的类将包括定义矩形,以及您想要存储在模型中的任何其他信息。
  • 如果我用 For int[30][30] switch (int[x][y]) case 1: paintSquare(g, x*20,y*20, Color.RED); paintSquare (图形 g,int x,int y, 颜色 c) g.setColor(c); g.fillRect(x, y, 20, 20);
  • @Chris Brown:你似乎还不明白游戏模型和游戏 GUI 之间的区别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-04
  • 2017-10-28
  • 1970-01-01
相关资源
最近更新 更多