В этом методе экран сначала очищается и заполняется черным цветом, а затем вызывается метод 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();
}
}