Наложение игровых фигур на игровую плитку Java - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть настольная игра (например, «Монополия»), в которой на одной клетке можно разместить несколько игровых фигур. Я хочу иметь возможность произвольно размещать игровые фигуры на любой данной плитке. Я хочу, чтобы у плитки был фон (изображение или просто плоский цвет), и чтобы я мог разместить до 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 голосов
/ 05 сентября 2018
public class GraphicsTile {

Я не знаю, как ваш код компилируется, поскольку ваш GraphicsTile не расширяет какой-либо компонент Swing, но вы используете такие методы, как setLayout(...) и setSize(...), что подразумевает, что вы пытаетесь использовать его как JPanel.

Вы не должны использовать setSize (...). Компонент Swing должен иметь предпочтительный размер. Затем менеджер макета установит размер и расположение компонента в соответствии с правилами менеджера макета. Я предполагаю, что у вас есть проблема, потому что предпочтительный размер (0, 0).

Я также понятия не имею, как добавить GraphicsTile в родительский компонент. Опять же, похоже, что вы используете setSize (), когда вы должны позволить менеджеру размещения расположить плитки на игровом поле.

Также, если вы хотите иметь фоновое изображение с кругами вверху, вам нужна иерархическая структура. То есть вам нужно что-то вроде:

  • панель
    • фоновое изображение
      • Компонент круга.

Итак, мои предложения:

  1. CirclePanel необходимо реализовать метод getPreferredSize(...) для возврата размера вашей пользовательской картины.

  2. Ваш класс GraphicsTile должен быть расширен JPanel. Затем вы переопределите метод paintComponent(...), чтобы нарисовать фоновое изображение. Теперь вы можете добавить CirclePanel экземпляров к этой панели, которые будут использовать GridLayout.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...