import java.awt.*; import java.applet.Applet; public class Animation2 extends Applet implements Runnable { int fFrame = -1; int fDelay; Thread fThread; Image[] fEarth; MediaTracker fTracker; Image fOffScreenImage; Graphics fOffScreenGraphics; public void init() { fEarth = new Image[30]; String theString; int theFramesPerSecond = 10; fTracker = new MediaTracker( this ); fOffScreenImage = createImage(getSize().width, getSize().height); fOffScreenGraphics = fOffScreenImage.getGraphics(); // Заполнение второго буфера экрана синим цветом fOffScreenGraphics.setColor(Color.blue); fOffScreenGraphics.fillRect(0, 0, getSize().width, getSize().height); // Загрузка файлов изображений for (int i=1; i<=30; i++) { fEarth[i-1] = getImage (getCodeBase(), "./Earth"+i+".gif"); fTracker.addImage(fEarth[i-1], 0); } // Определение периода между кадрами в миллисекундах theString = getParameter("fps"); try { if (theString != null) { theFramesPerSecond = Integer.parseInt(theString ); } } catch (NumberFormatException e) {} fDelay = (theFramesPerSecond > 0) ? (1000 / theFramesPerSecond) : 100; } public void start() { // Запуск нового потока анимации if (fThread == null) { fThread = new Thread(this); } fThread.start(); } public void stop() { // Остановка потока анимации fThread = null; } public void run() { // Работа с низким приоритетом; анимация не должна мешать основной обработке Thread.currentThread().setPriority(Thread.MIN_PRIORITY); long theStartTime = System.currentTimeMillis(); // Начало процесса вывода анимации try { fTracker.waitForID(0); } catch (InterruptedException e) { System.err.println("Interrupted Exception: " + e.getMessage()); e.printStackTrace(); return; } while (Thread.currentThread() == fThread) { // Переход к следующему кадру fFrame++; // Отображение нового кадра repaint(); // Задержка, определяемая частотой кадров. try { theStartTime += fDelay; Thread.sleep(Math.max(0, theStartTime-System.currentTimeMillis())); } catch (InterruptedException e) { break; } } } public void update( Graphics g) { // Заполнение дополнительного буфера синим цветом fOffScreenGraphics.setColor(Color.blue); fOffScreenGraphics.clearRect(0, 0, getSize().width, getSize().height); fOffScreenGraphics.fillRect(0, 0, getSize().width, getSize().height); paint(g); } // Отображение текущего кадра public void paint(Graphics g) { if (fTracker.checkID( 0 )) { fOffScreenGraphics.drawImage(fEarth[fFrame % 30], 0, 0, this); g.drawImage(fOffScreenImage, 0, 0, this); } } }