Программирование мобильных телефонов на Java



7.10. Столкновение



В предыдущем разделе 7.9 мы выведи на экран синий квадрат, задали ему вектор движения и перемещали квадрат горизонтально через весь экран. После того как квадрат исчезал, достигнув конца экрана, он циклично появлялся вновь с другой стороны. Следующий пример иллюстрирует столкновение круга и квадрата с препятствием, а именно, окончанием экрана телефона. Оба объекта рисуются независимо друг от друга по высоте экрана и перемещаются параллельно по горизонтали слева на право. По достижению конца экрана оба объекта отталкиваются от конца экрана и начинают движение в обратном направлении. Посмотрите на листинг 7.7, где приводится код программы осуществляющий эти действия. Эта программа состоит из двух файлов Main.java и Draw.java.

/**
Листинг 7.7
Класс Main и класс Draw
*/
import javax.microedition.Icdui.*;
import javax.microedition.midlet.*;
public class Main extends MIDlet implements.
CommandListener
{
//команда выхода из программы
private Command exitMidlet = new Command("Выход",
Command.EXIT, 0);
publicvoid 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 сommandAction(Command c, Displayable d)
{
if (c == exitMidlet)
{
 destroyApp(false); notifyDestroyed();
}
 }
 }
/**
класс Draw определен в файле Draw.Java
рисует круг и квадрат
*/
import javax.microedition.Icdui.*;
public class Draw extends Canvas implements Runnable
{
// позиция для перемещения квадрата и круга
int position = 0;
// узнаем ширину экрана
int endX = getWidth();
// конструктор
public Draw()
{ super();
}
public void start()
{
// создаем и запускаем поток
Thread t = new Thread(this);
t.start();
 }
//метод run интерфейса Runnable public void run()
 {
// бесконечный цикл
while (true)
{
// сравниваем позицию if(position > endX)
{
//уменьшаем позицию position = endX;
}
// увеличиваем позицию на 1 position ++;
// обновляем экран repaint();
// останавливаем цикл на 20 миллисекунд
try { Thread.sleep(20); }
catch (java.lang.InterruptedException zxz) {}
}
}
publie void paint(Graphics g)
{
// вычисляем область для перерисовки экрана
int х = g.getClipWidth() ;
int у = g.getClipHeight () ;
// устанавливаем желтый цвет фона
g.setColor(0xffff00);
// назначаем перерисовку всему экрану
g.fillRect(0,0,x,y);
// устанавливается синий цвет квадрата
g.setColor(0, 0, 200);
// рисуем квадрат
g.fillRect(position, 40, 20, 20);
// устанавливается красный цвет круга
g.setColor(250, 0,0);
// рисуем круг
fillArc(position, 10, 20, 20, 45, 360);
 }
} 


В файле Main.java создается объект класса Draw, запускается системный поток и отражается текущий экран. Файл Draw.java содержит полную реализацию класса Draw. Начальные позиции квадрата и круга определяются переменной position, которой задано нулевое значение. Для того чтобы определить момент столкновения, необходимо знать точку или координаты препятствия. В этом примере как препятствие применяется конец экрана с правой стороны, поэтому с помощью метода getWidth () находится конец экрана.

int endX = getWidth(); 


В последствии значение переменной endx будет использовано для определения столкновения.

Конструктор, класса Draw обращается к конструктору своего суперкласса Canvas. В методе run() и цикле while с помощью оператора отношения if происходит сравнение текущей позиции двух объектов и конца экрана.

if (position > endX)
{
position = endX -;
 }


После того как позиция обоих объектов становится больше значения переменной endx, то есть квадрат и круг достигают конца экрана, то происходит уменьшение переменной position. Это приводит к движению объектов в обратном направлении.

После компиляции примера на экране появятся два движущихся слева направо объекта. Мы использовали препятствие в виде одной стороны экрана, но точно таким же образом можно определить столкновение для всех сторон экрана или просто для статических объектов. Выполните эти упражнения в качестве домашнего задания, а также внимательно посмотрите на процесс работы примера из листинга 7.7, квадрат и круг все-таки не отталкиваются от кромки экрана, а исчезают. Это происходит, потому что опорная позиция объектов находится в левом верхнем углу и столкновение происходит именно с позицией объектов* Вы знаете размер круга и квадрата, подумайте как можно определить более точную точку столкновения объектов и кромки экрана.

Назад Начало Вперед