Иллюстрированный самоучитель по Java

Улучшение изображения двойной буферизацией

В листинге 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);
}
});
}
}
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.