Иллюстрированный самоучитель по программированию мобильных телефонов

Циклическое передвижение объекта по экрану

В листинге 7.5 был нарисован синий квадрат и перемещен один раз вдоль оси X горизонтально слева направо. Но иногда в играх необходимо циклично передвигать объект, используя его, например, в качестве мишени.

Возьмем за основу код из листинга 7.5, где перемещается квадрат, и сделаем так, чтобы после пересечения всего экрана и исчезновения, он снова появлялся с другой стороны, создавая подобие циклического перемещения. Алгоритм решения этой задачи заключается в том, чтобы узнать, когда квадрат выйдет из области видимости и в тот же момент нарисовать его с другой стороны экрана и вновь переместить по экрану. Для этого создадим переменную end и присвоим ей значение окончания экрана найденное методом getwidth () (движение происходит по ширине экрана).

int.end = getwidth();

В методе run () в самом начале цикла while будем производить постоянное сравнение позиции квадрата с окончанием экрана:

if (position > end)
{
position = 0;
}

Как только квадрат будет выходить из области экрана, его позиция обнулится и квадрат снова будет нарисован в первоначальной позиции, что зациклит движение квадрата. В листинге 7.6 представлен исходный код решающий эту задачу.

Листинг 7.6. Класс Main и luiacq.Draw.

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
public class Main
extends MIDlet implements CommandListener
{
// команда выхода из программы
private Command
exitMidlet = new Command("Выход",Command.EXIT, 0);
public void startApp()
{
// создаем объект класса Draw
Draw dr = new Draw();
// запускаем поток
dr.start();
// добавляем команду выхода
dr.addCommand(exitMidlet);
dr.setCommandListener(this);
Display.getDisplay(this).setCurrent(dr);
}
public void pauseApp() {}
public void destroyApp(boolean unconditional){}
public void commandAction(Command c, Displayable d)
{
if (c == exitMidlet) {
destroyApp(false); notifyDestroyedt);
}
}
}
/**
класс Draw определен в файле
Draw.Java циклическое появление квадрата
*/
import javax.microedition.Icdui.*;
public class
Draw extends Canvas implements Runnable
{
// позиция для перемещения квадрата
int position = 10;
// узнаем ширину экрана
int end = getwidth();
// конструктор
public Draw()
{ super(); }
public void start ()
{
// создаем и запускаем поток
Thread t = new Thread(this);
t.start(); }
// метод run интерфейса Runnable
public void run()
{
// бесконечный цикл
while (true)
{
// сравниваем позицию квадрата
if(position > end)
{
// обнуляем позицию квадрата position = 0;
}
// увеличиваем позицию на 1
position ++;
// обновляем экран
repaint();
// останавливаем цикл на 20 миллисекунд
try { Thread.sleep(20); }
catch (Java .lang. InterruptedException zxz) {}
) }
public void paint(Graphics g)
{
// вычисляем область для перерисовки экрана
int x = g.getClipWidth();
int у = g.getClipHeight();
// устанавливаем белый цвет фона
g.setColor(0xffffff);
// назначаем перерисовку всему экрану
g.fillRect(0.0,х,у);
//устанавливается синий цвет квадрата
g.setColor(0, 0, 200);
// рисуем квадрат
g.fillRect(position,40, 20, 20);
}
}
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.