По поиску в Google я вижу, что этот вопрос часто задают, но ни одно из найденных мной решений не помогает мне. Знаете, я делаю игру на Java с изображениями, потому что в играх обычно есть такие вещи. Но вся форма постоянно мерцает, и я не могу заставить ее остановиться. Да, я дважды буферизовал его и переопределил метод update (), и, хотя это определенно помогло, мерцание все еще сохраняется. Не знаю, делаю ли я что-то не так с двойной буферизацией или мне нужно что-то совсем другое.
Сначала я подумал, что, возможно, это как-то связано со строкой clearRect (), но после ее удаления игра все еще мерцала, но, конечно, не очищалась каждый раз. Так что это совсем не помогло. При замедлении таймера мерцание почти полностью исчезает, но мне нужно замедлить его до 100 мс, и даже тогда мерцание все равно немного. Кроме того, это слишком медленно для игры. Я пробовал, чтобы один таймер делал все с таймером 10 мс, а другой - на 100 мс для рисования, но тогда это выглядело неаккуратно. Я могу замедлить таймер рисования примерно до 30 мс, и он по-прежнему будет плавным, хотя мерцание по-прежнему остается проблемой.
Должен быть способ делать это каждые 10-30 мсек без мерцания. Есть ли другой метод, похожий на двойную буферизацию, но лучше в этом случае, или что-то, что я могу использовать? Заранее благодарю за любую помощь.
public class main extends JApplet implements ActionListener {
//This Declares The Variables
Graphics2D buffer;
Image offscreen;
Timer timGame = new Timer(10, this);
//other variables
public void init(){
//This Creates The Offscreen Buffer Zone
offscreen = createImage(getSize().width, getSize().height);
buffer = (Graphics2D)offscreen.getGraphics();
//other initialization stuff irrelevant to drawing
}
public void actionPerformed(ActionEvent evt){
if (evt.getSource() == timGame)
runGame();
}
private void runGame(){
//Do stuff, move objects
repaint();
}
public void paint(Graphics g){
super.paint(g);
buffer.clearRect(0, 0, getSize().width, getSize().height);
//draw stuff to buffer
g.drawImage(offscreen, 0, 0, this);
}
public void update(Graphics gr){
paint(gr);
}