在游戏磁贴Java上叠加游戏片段

时间:2018-09-05 18:14:07

标签: java swing

我有一个棋盘游戏(认为是专卖),可以在单个图块上放置多个游戏块。我希望能够任意将游戏块放置在任何给定的图块上。我希望图块具有背景(图像或仅是纯色),并且能够在网格中的图块上放置多达4个游戏块。我目前正在使用此代码,但圆圈不会显示。

tank.png是135 x 135像素的背景。

GraphicsTile:

public class GraphicsTile extends JPanel {
    public static final Dimension SIZE = new Dimension(135, 135);
    public static final GridLayout MGR = new GridLayout(4, 4);

    public GraphicsTile() {
        super();
        setLayout(MGR);
        initGraphics();
        setSize(SIZE);

        add(new CirclePanel());
    }

    private void initGraphics() {
        JLabel panel = null;
        try {
            Image image = ImageIO.read(new File("tank.png"));

            panel = new JLabel(new ImageIcon(image));
            panel.setSize(SIZE);

        } catch (IOException e) {
            e.printStackTrace();
        }

        add(panel);
    }
}

CirclePanel:

public class CirclePanel extends JPanel {
    public CirclePanel() {
        setSize(33, 33);
    }
    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D)g;
        g2d.setColor(Color.RED);
        Ellipse2D.Float circle = new Ellipse2D.Float(50, 50, 0, 0);
        g2d.draw(circle);
        g2d.fill(circle);
    }
}

1 个答案:

答案 0 :(得分:1)

public class GraphicsTile {

我不知道您的代码如何编译,因为GraphicsTile不会扩展任何Swing组件,但是您使用的是setLayout(...)setSize(...)之类的方法,这意味着您试图像JPanel一样使用它。

您不应该使用setSize(...)。 Swing组件应具有首选的大小。然后,布局管理器将根据布局管理器的规则设置组件的大小和位置。我猜您有问题,因为首选大小是(0,0)。

我也不知道如何将GraphicsTile添加到父组件。同样,当您应该让布局管理器在游戏板上放置图块时,您似乎正在使用setSize()。

此外,如果要在背景图像的顶部加上圆圈,则需要分层结构。那就是你需要的东西:

  • 面板
    • 背景图片
      • 圆圈组件。

所以我的建议是:

  1. CirclePanel需要实现getPreferredSize(...)方法以返回自定义绘画的大小。

  2. 您的GraphicsTile类需要扩展JPanel。然后,您将覆盖paintComponent(...)方法以绘制背景图像。现在,您可以将CirclePanel实例添加到将使用GridLayout的此面板中。