Java JApplet Графика Двойная буферизация - PullRequest
1 голос
/ 21 марта 2011

Я пишу довольно простую игру на Java и сталкиваюсь с проблемой очень серьезного мерцания, когда играю в игру как апплет в браузере. То есть все мои спрайты, которые рисуются поверх фона, иногда отображаются на экране, но обычно нет - они периодически вспыхивают на экране, а затем исчезают. Я читал, что двойная буферизация, вероятно, является решением этой проблемы, но у меня возникают проблемы с ее правильной реализацией.

Я использую JApplet в качестве контейнера для JPanel. Этот JPanel является контейнером, на котором рисуются спрайты и игровые объекты, то есть в методе JPCanel paintComonent. В моем JApplet я использую методы переопределения init, paint и update следующим образом:

Image offscreen;

Graphics bufferGraphics;

Dimension dim;

public void init(){
    dim = getSize();

    setBackground(Color.BLACK);

    offscreen = createImage(dim.width,dim.height);

    bufferGraphics = offscreen.getGraphics();

}

public void paint(Graphics g){
    bufferGraphics.clearRect(0,0,dim.width,dim.height);
    //here is my question - i"m not sure what I should print to bufferGraphics
    g.drawImage(offscreen, 0, 0, this);
}

public void update(Graphics g){
    paint(g);
}

Проблема, с которой я сталкиваюсь, заключается в том, что в строке с комментариями я не уверен, что нужно сделать, чтобы текущее изображение апплета было напечатано в bufferGraphics. Я прочитал пример , в котором спрайт был нарисован прямо в JApplet, без использования JPanel. В свете этого я предполагаю, что мне нужно нарисовать JPanel на bufferGraphics в закомментированной строке. Я на правильном пути здесь? Любая помощь очень ценится; Я просто хотел бы знать любой способ сделать это правильно.

1 Ответ

2 голосов
/ 21 марта 2011

По умолчанию Swing имеет двойную буферизацию, ничего особенного делать не нужно.

Возможно, ваша проблема с кодом рисования.Размещенный вами код используется для рисования AWT, а НЕ для рисования Swing.

Пользовательское рисование выполняется путем переопределения метода paintComponent () для JPanel или JComponent.Я предлагаю вам начать с изучения учебника Swing на Custom Painting для рабочего примера.

...