Улучшение изображения двойной буферизацией
В листинге 15.12 показан второй способ анимации – кадры изображения рисуются непосредственно в программе, в методе update (), по заданному закону изменения изображения. В результате красный мячик прыгает на фоне изображения.
Листинг 15.12. Анимация рисованием.
import Java.awt.*; import java.awt.event.*; import Java.awt.geom.*; import java.awt.image.*; class DrawAniml extends Frame{ private Image img; private int count; DrawAniml(String s) { super(s); MediaTracker tr = new MediaTracker(this); img = getToolkit().getlmage("back2.jpg"); tr.addlmage(img, 0); try{ tr.waitForlD(0); }catch(InterruptedException e) {} SetSize(400, 400); setvisible(true); } public void update(Graphics g){ Graphics2D g2 = (Graphics2D)g; int w = getSizeO.width, h = getSize().height; Bufferedlmage bi = (Bufferedlmage)createlmage(w, h); Graphics2D big = bi.createGraphics(); // Заполняем фон изображением img big.drawlmage(img, 0, 0, this); // Устанавливаем цвет рисования big.setColor(Color.red); // Рисуем в графическом контексте буфера круг, // перемещающийся по синусоиде big.fill(new Arc2D.Double(4*count, 50+30*Math.sin(count), 50, 50, 0, 360, Arc2D.OPEN)); // Меняем цвет рисования big.setColor(getForeground()); // Рисуем горизонтальную прямую big.draw(new Line2D.Double(0, 125, w, 125)); // Выводим изображение-буфер на экран g2.drawlmage(bi, 0, 0, this); } public void go(){ while(count < 100){ repaint(); try{ Thread.sleep(10); }catch(InterruptedException e){} count++; } } public static void main(String[] args){ DrawAniml f = new DrawAniml(" Анимация"); f.go(); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent ev){ System.exit(0); } }); } }