активный рендеринг на JPanels

#java #swing #rendering #graphics2d

#java #swing #рендеринг #graphics2d

Вопрос:

Я пытаюсь создать клон игры PacMan. Я знаю, что для пользовательского рисования я должен переопределить метод paint() or paintComponent() . Но я хочу управлять всем рисунком самостоятельно, поэтому мне не нужен repaint() вызов AWT для paint() , для этого я устанавливаю IgnoreRepaint() как для рамки, так и для JPanel . Вызов get JPanel ‘s graphicsContext возвращает графический объект, но он не показывает никакого результата, только белый фон.

Основной класс выглядит следующим образом :

 public static void main(String[] args){

        JFrame frame=new JFrame("PacMan...");
        Board board=new Board();
        frame.getContentPane().add(board,BorderLayout.NORTH);
        frame.pack();
        frame.setVisible(true);
        frame.setIgnoreRepaint(true);
        board.init();
        frame.setResizable(false);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }
  

…. и Board класс расширяет, JPanel который graphicsContext я хочу использовать, класс выглядит следующим образом. readMaze() считывает карту лабиринта и присваивает значения maze[][]

 public Board(){

        setBackground(Color.WHITE);
        readMaze();
        setPreferredSize(new Dimension(rows*SIZE,columns*SIZE));
        setIgnoreRepaint(true);
    }

    public void init(){
        createMaze();
    }




    public void createMaze(){

        Graphics graphics=getGraphics();
        draw(graphics);
        graphics.dispose();


    }

    public void draw(Graphics graphics){
        for(int i=0;i<columns;i  ){
            for(int j=0;j<rows;j  ){
                //System.out.println(maze[i][j]);
                switch(maze[i][j]){
                case 'd':{
                    graphics.setColor(Color.YELLOW);
                    graphics.fillRect((i)*SIZE SIZE/2, (j)*SIZE SIZE/2, 5, 5);
                }
                break;
                }
                // morre cases...

            }
        }
    }
  

Я всего лишь новичок, поэтому, пожалуйста, игнорируйте мой плохой стиль кодирования. Спасибо.

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

1. Для игр и анимации вам может быть удобнее использовать JavaFX. Найдите в сети «JavaFX Pacman». Вы все еще можете изучать Java, графику и все остальное, но инструменты и подход с JavaFX помогут вам быстрее достичь вашей цели.

2. getGraphics возвращает последний графический контекст, используемый для рисования компонента, который, вероятно, еще не был нарисован, поскольку вы отключили процесс рисования, чтобы он не знал, что int нуждается в обновлении. Возможно, вам следует рассмотреть возможность реализации вашего подхода с двойной буферизацией. В принципе, у вас есть «активный» буфер, который отображается в методе paintComponent, и в вашем игровом цикле вы бы переключались между закадровым и активным буфером каждый раз, когда вы его обновляете, поэтому, даже если Swing выполняет рисование между вашими обновлениями, он рисует только активный буфер

3. Кроме того, не удаляйте графический контекст, который вы не создавали, это может привести к отключению любого будущего рисования. Вы также должны быть уверены, что вы не делаете ничего, что могло бы блокировать EDT