В этом методе экран сначала очищается и заполняется черным цветом, а затем вызывается метод paint, который и рисует спрайт. В завершении созданная графика выводится на экран, для чего вызывается метод flushGraphics. В этом и состоит вся прелесть двухбуферной анимации: вы создаете графику, а затем выводите ее на экран. Без этого игры были бы не столь привлекательными, поверьте.
Теперь, чтобы объединить все вышесказанное, посмотрите листинг 5.1.
Листинг 5.1. Класс UFOCanvas – это класс холста мидлета UFOimport javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import java.util.*;
import java.io.*;
public class UFOCanvas extends GameCanvas implements Runnable {
private Display display;
private boolean sleeping;
private long frameDelay;
private Random rand;
private Sprite ufoSprite;
private int ufoXSpeed, ufoYSpeed;
public UFOCanvas(Display d) {
super(true);
display = d;
// установить частоту кадров 30 кадров/с
frameDelay = 33;
}
public void start {
// установить холст как текущий экран
display.setCurrent(this);
// инициализация генератора случайных чисел
rand = new Random;
// инициализация спрайта НЛО
ufoXSpeed = ufoYSpeed = 3;
try {
ufoSprite = new Sprite(Image.createImage("/Saucer.png"));
ufoSprite.setPosition(0, 0); //НЛО стартует в верхнем левом углу экрана
}
catch (IOException e) {
System.err.println("Failed loading image!");
}
// запуск потока анимации
sleeping = false;
Thread t = new Thread(this);
t.start;
}
public void stop {
// Stop the animation
sleeping = true;
}
public void run {
Graphics g = getGraphics;
// The main game loop
while (!sleeping) {
update;
draw(g);
try {
Thread.sleep(frameDelay);
}
catch (InterruptedException ie) {}
}
}
private void update {
// Randomly alter the UFO\'s speed
if (rand.nextInt % 5 == 0) { //Изменить случайным образом компоненты скорости по осям Х и Y в интервале от -8 до 8
ufoXSpeed = Math.min(Math.max(ufoXSpeed + rand.nextInt % 2, -8), 8);
ufoYSpeed = Math.min(Math.max(ufoYSpeed + rand.nextInt % 2, -8), 8);
}
// Move the sprite
ufoSprite.move(ufoXSpeed, ufoYSpeed);
// Wrap the UFO around the screen if necessary
if (ufoSprite.getX < -ufoSprite.getWidth)
ufoSprite.setPosition(getWidth, ufoSprite.getY);
else if (ufoSprite.getX > getWidth)
ufoSprite.setPosition(-ufoSprite.getWidth, ufoSprite.getY);
if (ufoSprite.getY < -ufoSprite.getHeight)
ufoSprite.setPosition(ufoSprite.getX, getHeight);
else if (ufoSprite.getY > getHeight)
ufoSprite.setPosition(ufoSprite.getX, -ufoSprite.getHeight);
}
private void draw(Graphics g) {
// Clear the display
g.setColor(0x000000);
g.fillRect(0, 0, getWidth, getHeight);
// Draw the UFO sprite //Спрайт очень просто вывести на экран, используя метод paint
ufoSprite.paint(g);
// Flush the offscreen graphics buffer
flushGraphics;
}
}