Java Swing Game Board - PullRequest
       3

Java Swing Game Board

2 голосов
/ 04 марта 2012

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

Вот метод рисования моей доски:

public void paint(Graphics g){
        super.paint(g);
        Graphics2D g2d = (Graphics2D)g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        //Draw all the spots
        for(int i = 0; i < spots.length; i++){
            g2d.setColor(Color.white);
            g2d.fill(spots[i].getRect());
            if(spots[i] instanceof Property){
                if(i < 10){
                    g2d.setColor(spots[i].getColor());
                    Rectangle temp = new Rectangle(spots[i].getRect().x,spots[i].getRect().y,spots[i].getRect().width,spots[i].getRect().height/3);
                    g2d.fill(temp);
                    g2d.setColor(Color.black);
                    g2d.drawString(((Property)spots[i]).getName(), spots[i].getRect().x, spots[i].getRect().height);
                }else if(i >= 10 && i < 20){
                    g2d.setColor(spots[i].getColor());
                    Rectangle temp = new Rectangle(spots[i].getRect().x+spots[i].getRect().width-spots[i].getRect().width/3,spots[i].getRect().y,spots[i].getRect().width/3,spots[i].getRect().height);
                    g2d.fill(temp);
                }else if(i >= 20 && i < 30){
                    g2d.setColor(spots[i].getColor());
                    Rectangle temp = new Rectangle(spots[i].getRect().x,spots[i].getRect().y+spots[i].getRect().height-spots[i].getRect().height/3,spots[i].getRect().width,spots[i].getRect().height/3);
                    g2d.fill(temp);
                    g2d.setColor(Color.black);
                    g2d.drawString(((Property)spots[i]).getName(), spots[i].getRect().x, spots[i].getRect().y);
                }else if(i >= 30 && i < 40){
                    g2d.setColor(spots[i].getColor());
                    Rectangle temp = new Rectangle(spots[i].getRect().x,spots[i].getRect().y,spots[i].getRect().width/3,spots[i].getRect().height);
                    g2d.fill(temp);
                }
            }else if(spots[i] instanceof Railroad){
                if(i == 5)
                    g2d.drawImage(imgTrain3, spots[i].getRect().x, spots[i].getRect().y+spots[i].getRect().height/4, null);
                else if(i == 15)
                    g2d.drawImage(imgTrain4, spots[i].getRect().x+spots[i].getRect().width/4, spots[i].getRect().y, null);
                else if(i == 25)
                    g2d.drawImage(imgTrain1, spots[i].getRect().x, spots[i].getRect().y+spots[i].getRect().height/4, null);
                else if(i == 35)
                    g2d.drawImage(imgTrain2, spots[i].getRect().x+spots[i].getRect().width/4, spots[i].getRect().y, null);
            }else if(spots[i] instanceof Chance){
                if(i == 7)
                    g2d.drawImage(imgChance2, spots[i].getRect().x, spots[i].getRect().y, null);
                else if(i == 22)
                    g2d.drawImage(imgChance2, spots[i].getRect().x, spots[i].getRect().y+spots[i].getRect().height/3, null);
                else if(i == 36)
                    g2d.drawImage(imgChance3, spots[i].getRect().x, spots[i].getRect().y, null);
            }else if(spots[i] instanceof Community){
                if(i == 2)
                    g2d.drawImage(imgComm1, spots[i].getRect().x, spots[i].getRect().y+spots[i].getRect().height/3, null);
                else if(i == 17)
                    g2d.drawImage(imgComm2, spots[i].getRect().x, spots[i].getRect().y, null);
                else if(i == 33)
                    g2d.drawImage(imgComm3, spots[i].getRect().x+spots[i].getRect().width/3, spots[i].getRect().y, null);
            }else{
                g2d.setColor(spots[i].getColor());
                g2d.fill(spots[i].getRect());
            }
        }
        //Draw the outline of every spot
        g2d.setColor(Color.black);
        for(Spot index : spots)
            g2d.draw(index.getRect());
        //Draw the outline of the whole board
        g2d.drawRect(newX, newY, boardSize, boardSize);
        //Draw the Players location
        for(Player index : players)
             g2d.drawImage(index.getImage(), index.getLoc().x, index.getLoc().y, null);
    }

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

Бонусный вопрос: я также только начал работать над анимацией движения для игроков после того, как они бросили (в настоящее время просто прыгают к месту назначения). Я создал таймер, который занимает 1 секунду за бросок (например: если вы бросаете 5, для перемещения требуется 5 секунд). Единственная проблема заключается в том, что у меня нет хорошей идеи о том, как показать медленное перемещение фигуры игрока из начальной точки в конец. Просто нужен кто-то, чтобы дать мне основную идею, чтобы я мог двигаться в правильном направлении.

Ответы [ 2 ]

4 голосов
/ 04 марта 2012

Раскрась доску до BufferedImage.В методе рисования нарисуйте изображение доски, а затем нарисуйте фигуры сверху.

Кстати: при использовании Swing не рисуйте в контейнерах верхнего уровня, вместо этого используйте JComponent или JPanel.Для последних двух переопределите paintComponent(Graphics) вместо paint(Graphics).

1 голос
/ 04 марта 2012

Вы можете избежать перерисовки всей поверхности с помощью: jComponent.repaint (someRectangle) . Смотрите также этот пример .

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

Для анимации в Swing посмотрите этот учебник . Вы заметите, что оба примера, на которые я ссылаюсь в этом посте, взяты из официального Swing tutorial .

...