Select your language:

Home Главная | Registration Регистрация | Login Вход

Menu Меню сайта
Statistics Статистика

Total online: Онлайн всего: 1
Guests: Гостей: 1
Members: Пользователей: 0
Study entry Форма входа
Логин:
Пароль:
Забыл пароль | Регистрация

Ссылки:

Перемещение квадрата

if (с == exitMidlet) {

destroyApp(false); notifyDestroyedl);

класс Draw определен в файле Draw.Java

перемещает квадрат по экрану

*/

import j avax.microedi t ion.lcdui.*;

public class Draw extends Canvas implements Runnable {

/ / позиция для перемещения квадрата int position .= 10; / / конструктор public Draw() { super(); }

public void start()

// создаем и запускаем, поток Thread t = new Thread(this); t.start();

}

// метод run() интерфейса Runnable public void run

// бесконечный цикл while (true)

// увеличиваем позицию на 1 position ++; // обновляем экран repaint();

// останавливаем цикл на 20 миллисекунд try { Thread.sleep(20); }

catch (java.lang.InterruptedException zxz) {}

}

}

public void paint(Graphics g) {

// вычисляем область для перерисовки экрана

int х = g.getClipWidthO ;

int у - g.getClipHeight О;

/ / устанавливаем белый цвет фона

g.setColor(Oxffffff)j

// назначаем перерисовку всему экрану g.fillRect(0,0,x,y);

// устанавливается синий цвет квадрата g.setColor(0, 0, 200);

// рисуем квадрат

g.fillRect(position,40, 20, 20); *

Листинг 7.5 содержит два класса Main и Draw, находящиеся в файлах Main.javan Draw.Java. Основной класс мидлета Main содержит код создающий объект dr класса Draw. Затем он запускает системный поток с помощью метода start () ,добавляет команду выхода из программы и отображает текущий дисплей с объектом dr. Класс Draw содержит код, создающий синий квадрат и перемещающий его по экрану. Прежде чем мы начнем рассмотрение кода класса Draw, давайте подумаем, как можно произвести перемещение объекта на экране. Самый простейший способ перемещения объекта по экрану вдоль оси X, заключается в постоянном увеличении, допустим на единицу, позиции этого объекта по оси X. При создании квадрата методом fillRect () задаются Две координаты по оси X и по оси Y для первоначального вывода квадрата на экран. Поэтому достаточно создать переменную для координаты по оси X и затем в цикле прорисовки увеличивать ее на единицу, перемещая тем самым объект по экрану. /

В листинге 7.5 класс Draw наследуется от класса Canvas, что дает возможность воспользоваться методом paint {) для рисования графических элементов на экране и реализации метода run () интерфейса Runnable. В методе run () создается цикл, постоянно обновляющий состояние графических элементов.

В начале кода класса Draw создается переменная position, отвечающая за координату по оси X для точки вывода квадрата на экран. Конструктор класса Draw вызывает метод super () для использования конструктора своего суперкласса Canvas.

В методе start () создается системный поток, который будет запушен в методе run (). Кстати, было бы не плохо предусмотреть выход из потока. Этот пример небольшой и проблем с ним не возникнет, а после разбора листинга 7.5, мы рассмотрим простой механизм, останавливающий системный поток и предусматривающий выход из бесконечного цикла while метода run> В самом методе run () создается бесконечный цикл, в котором происходит постоянное увеличение переменной р osition на единицу, благодаря чему квадрат перемещается по оси X слева направо.

Перемещение квадрата

В методе paint (} вас должны заинтересовать следующие строки кода:

int х = g.getClipWidth(); int у = g.getClipHeight() ; g.setColor (Oxf ff'fff) ; g.fillRect(0,0,x,y);

Здесь используется отсечение (clipping) необходимое для корректной прорисовки графики. Если не использовать отсечение, то после того как вы нарисуете квадрат и начнете передвигать его, на экране будет рисоваться слева на право одна толстая синяя линия. То есть будет происходить постоянная перерисовка квадрата в новой позиции по оси X, но при этом будет оставаться и предыдущий нарисованный квадрат. Чтобы этого избежать имеется два способа: можно стирать определенный участок экрана, а можно просто перерисовывать цвет фона всего экрана. Такая операция в Java 2 ME называется отсечением, и для произведения этой операции используются методы: getClipWigth () и getClip-Height О, производящие отсечение поверхности всего экрана и методы get-ClipX () и getClipY (> для более точного указания координат заданной области экрана для отсечения. По сути, использование этих методов приводит к простому обновлению всего экрана либо заданной области экрана. В этом примере мы будем использовать перерисовку всего фона экрана. Ширина и высота экрана узнается с помощью методов getClipWigth (') и getClipHeight

д. fillRect ( 0, 0, х, у )';

В конце метода paint () рисуем синий квадрат:

д.fillRect(position, 40, 20, 20);

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

После компиляции примера из листинга 7.5, на экране появится синий квадрат и пересечет один раз дисплей телефона слева направо. Теперь что касается бесконечного цикла whi 1е. В методе run () в реальном приложении необходимо предусмотреть выход из него, атак же позаботиться о прекращений работы потока. Самый простой способ заключается в создании переменной отвечающей за состояние цикла в начале класса Draw, например:

boolean z;

Дальше в методе start \) присвоить этой переменной значение true.

public void start() {

z - true;

Thread t = new ThreadO; t.start();

}

А в методе run z для входа в цикл while.

while(z)

{

У/ код цикла

}

Для логического конца создается новый метод stop О в классе Draw, назначая переменной z значения false.

public void stop() { z - false; }

Вызовем этот метод в классе Main в методе destroyApp ():

public void destroyApp(boolean unconditional) {

z.stopO ;

}

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

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

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

int end = getWidth();

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

if (position > end) {

position = 0 ;

}

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

185

Кактолъко квадрат будетвыходить из области экрана, егопозиция обнулит-ся и квадрат снова будет нарисован в первоначальной позиции, что зациклит движение квадрата. В листинге 7.6 представлен исходный код решающий эту задачу, накомпакт-дискепримернаходитсявпапке\Со(1е\11зи^7_6.

/

Листинг 7 , 6

Класс Main и класс, 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 startAppO {

// создаем объект класса Draw Draw dr = new Draw

// запускаем поток dr.start{) ;

// добавляем команду выхода

dr.addCommand(exitMidlet) ;

dr.setCommandListener(this);

Display.getDisplay (this). setCurrent (dr);

}

public void pauseApp () {) *

public void destroyApp (booleanunconditional) {}

public void commandAction (Conmand c, Di'splayable d) {

if (c == exitMidlet) {

destroyApp(false); nOtifyDestroyed() ;

}

} }

/**

класс Draw определен з файле Draw.Java циклическое появление квадрата * /

import javax.microedition.lcdui.*;

public class Draw extends Canvas implements Runnable {

// позиция для перемещения'квадрата int position - = 10; / / узнаем ширину экрана' int end = getWidthO; // конструктор public Draw() { super(); }

public void start ()' {

// создаем и запускаем поток Thread t =♦ new Thread (this) ; t.start();

I

}

// метод run интерфейса Runnable public void run()

{

// бесконечный цикл while (true) {

// сравниваем позицию квадрата if(position > end)

// обнуляем позицию квадрата position = 0; }

// увеличиваем позицию на 1 position ++; // обновляем■экран repaint();

// останавливаем цикл на 2 0 миллисекунд-try { Thread.sleep(20); }

catch (Java.lang.InterruptedException zxz) {}

}

}

Столкновение НИИ

public void paint(Graphics g)

{

// вычисляем область для перерисовки экрана

int х = g.getClipWidth();

int у = g.getClipHeight();

// устанавливаем белый цвет фона

g.setColor(Oxffffff);

// назначаем перерисовку всему экрану g.fillRect(0,0,х,у);

// устанавливается синий цвет квадрата g.setColor(0, 0, 200);

// рисуем квадрат

g.fillRect(position,40, 20, 20);

}

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

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

/**

Листинг 7 ,7

Класс Main и класс Draw */

import u'avax.microedition. lcdui . *; import javax.microedition.midlet.*;

public class Main extends MIDlet implements CommandListener

{

// команда выхода из программы

private Command exitMidlet = new Command("Выход", Command.EXIT, 0) ;

public void startAppO

// создаем объект класса Draw Draw dr = new Draw ( ) ; / / запускаем поток dr.start Of

/ / добавляем команду выхода

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); notifyDestroyedf)

}"

} }

класс Draw определен в файле Draw.Java

рисует круг и квадрат 1

*/

import javax.microedition. lcdui . *; .

public class Draw extends Canvas implements Runnable {

// позиция для перемещения квадрата и круга int position = 0 ; 11 узнаем ширину экрана int endX = getWidth ( ) ; ft конструктор 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)

>

}

public void paint(Graphics g)

{

/ / вычисляем область для перерисовки экрана int х = g.getClipWidth(); ■ int у = g.getClipHeight(); // устанавливаем желтый цвет фона g.setColor(OxffffOO);

// назначаем перерисовку всему экрану g.fillRect(0,0,X,y);

/ / устанавливается синий цвет квадрата g.setColor(0, о, 200);

// рисуем квадрат

g.fillRect(position, 40, 20, 20);

// устанавливается красный цвет круга

g.setColor(250, 0, 0) ; '

/ / рисуем круг

g.fillArc(position, 10, 20, 20, 45, 360);

}

Исходный код' листинга вы найдете на компакт-диске в папке \Code\ Listing7_7\src. В файле Mainjava создается объект класса Draw, запускается системный поток и отражается текущий экран. Файл Draw .Java содержит полную реализацию класса Draw. Начальные позиции квадрата и круга определяются переменной position, которой задано нулевое значение. Для того чтобы определить момент столкновения, необходимо знать точку или координаты препят--ствия. В этом примере как препятствие применяется конец экрана с правой стороны, поэтому с помощью метода g е twidth ) находится конец экрана.

int endX = getWidthO;

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

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

if (position > endX) position = endX-;

' }

После ТОГО как позиция обоих объектов становится больше значения переменной endX, то есть'квадрат и круг достигают конца экрана, то происходит уменьшение переменной pos i t ion. Это приводит к движению объектов в обратном направлении.

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

7.11. Перемещение объекта с помощью клавиш

Перемещение объекта по экрану телефона с помощью клавиш телефона, это, - пожалуй, самое главное действие в играх. Для передвижения нужно воспользоваться методом keyPressed() и описать код производящий обработку событий получаемых с клавиш телефона. При реализации метода key Pressed (), сначала необходимо вызвать метод getGameAction {) для получения ключевого кода с последующей его обработкой. Для обработки полученного ключевого кода


Для перехода к следующей странице статьи перейдите по вы подающему меню


Basket Корзина
Your basket is empty Ваша корзина пуста
'); $(el).append(g); $(g).show(); } _uPostForm('',{type:'POST',url:'/shop/basket',data:{'mode':'clear'}}); return false; } function removeBasket(id){ if(lock_buttons) return false; else lock_buttons = 1; $('#basket-item-'+id+' .sb-func').removeClass('remove').addClass('myWinLoadS').attr('title',''); _uPostForm('',{type:'POST',url:'/shop/basket',data:{'mode':'del', 'id':id}}); return false; } function add2Basket(id,pref){ if(lock_buttons) return false; else lock_buttons = 1; var opt = new Array(); $('#b'+pref+'-'+id+'-basket').attr('disabled','disabled'); $('#'+pref+'-'+id+'-basket').removeClass('done').removeClass('err').removeClass('add').addClass('wait').attr('title',''); $('#'+pref+'-'+id+'-options').find('input:checked, select').each(function(){ opt.push(this.id.split('-')[3]+'-'+this.value);}); _uPostForm('',{type:'POST',url:'/shop/basket',data:{'mode':'add', 'id':id, 'pref':pref, 'opt':opt.join(':'), 'cnt':$('#q'+pref+'-'+id+'-basket').attr('value')}}); return false; } function buyNow(id,pref){ if(lock_buttons) return false; else lock_buttons = 1; var opt = new Array(); $('#b'+pref+'-'+id+'-buynow').attr('disabled','disabled'); $('#'+pref+'-'+id+'-buynow').removeClass('done').removeClass('err').removeClass('now').addClass('wait').attr('title',''); $('#'+pref+'-'+id+'-options').find('input:checked, select').each(function(){ opt.push(this.id.split('-')[3]+'-'+this.value);}); _uPostForm('',{type:'POST',url:'/shop/basket',data:{'mode':'add', 'id':id, 'pref':pref, 'opt':opt.join(':'), 'cnt':$('#q'+pref+'-'+id+'-basket').attr('value'), 'now':1}}); return false; } //-->
Search Поиск
Calendar Календарь
«  March Март 2011  »
Mon Пн Tues Вт Wed Ср Thurs Чт Fri Пт Sat Сб Sun Вс
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archive records Архив записей

Ссылки:

Rambler's Top100 Все для дома - Бытовая техника, опубликовать информацию о фирме
QLE 88x31

раскрутка сайта в интернете Рейтинг сайтов Товары / Услуги

Copyright MyCorp © 2011 Создать сайт бесплатно

Copyright MyCorp © 2011