Попытка понять дизайн-код Java-игр

#java #graphics

#java #графика

Вопрос:

Я пытаюсь изучить игровой дизайн на Java и следую учебному пособию. В учебном пособии приведен этот код, но не так много подробностей. У меня было несколько вопросов, касающихся Java и графики.

 import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class Game2 extends JPanel {

    @Override
    public void paint(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.RED);
        g2d.fillOval(0, 0, 30, 30);
        g2d.drawOval(0, 50, 30, 30);        
        g2d.fillRect(50, 0, 30, 30);
        g2d.drawRect(50, 50, 30, 30);
    }
    
    public static void main(String[] args) {
        JFrame frame = new JFrame("Mini Tennis");
        frame.add(new Game2());
        frame.setSize(300, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}
 

Зачем нам нужно расширять JPanel в класс Game2? Я никогда не использовал extends в своем основном классе, поэтому я не уверен, что это означает в данном случае и почему это необходимо.

Что это frame.add(new Game2()); значит? Почему нам разрешено создавать новую Game2() в классе Game2()?

Что такое объекты Graphics и Graphics2D? Также мы не могли бы просто использовать объект Graphics2D в качестве параметра paint(), поскольку мы никогда не используем g вне приведения его к объекту Graphics2D.

Наконец, почему нам не нужно вызывать paint()?

Комментарии:

1. вам ничего не «нужно». это может быть прекрасно сделано в классе, отличном от класса, содержащего ваш основной метод. Если вы не знаете, что это значит, я предлагаю вам изучить основы Java и ООП, прежде чем пытаться кодировать игры или другие приложения с графическим интерфейсом

2. Не рекомендуется вызывать paint() . Я предлагаю вам просматривать онлайн-JavaDoc для каждого нового класса, который вы используете. Это официальная документация. В Swing рекомендуется переопределить paintComponent() вместо этого.

3. Слабое название. Перепишите, чтобы обобщить вашу конкретную техническую проблему.

Ответ №1:

Вы можете расширить (почти) любой компонент, который вам нравится. Важным моментом здесь является то, что вы помещаете компонент в a JFrame , что делает его основой для нового окна. Использование JPanel хорошо, потому что оно не содержит графики и, следовательно, может служить простым холстом.

frame.add(new Game2()) помещает JPanel то, что вы расширяете, в JFrame туман.

Вы можете свободно создавать экземпляры класса где угодно, если они видны вам в заданной области.

Экземпляр Graphics2D класса передается paint() методу автоматически всякий раз, когда базовая операционная система решает, что пришло время перерисовать компонент (например, при отображении окна или перетаскивании другого окна поверх компонента).

Параметр всегда имеет тип Graphics (это означает, что значение может быть того же типа или любого класса, который его расширяет). Это задается определением метода (это означает, что некоторые из родительских классов или интерфейсов объявляют его таким образом), и вы не можете его изменить.

Пожалуйста, уделите некоторое время ознакомлению с основами объектно-ориентированного программирования, прежде чем приступать к чему-то более сложному:

https://www.w3schools.com/java/java_oop.asp