Select your language:

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

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

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

Ссылки:

В методе inputKey () происходит определение нажатой клавиши посредством метода getKeyState (). Весь остальной код в методе inputKey () использует оператор if для обработки нажатых клавиш, вызывая соответствующие методы moveLeftO, moveRightO, moveUpO или moveDown О для перемещения объекта по экрану.

В классе MainGaine из файла MainGame.java создается объект класса MyGa-meCanvas, запускается системный поток и отражается текущий экран.

В этом примере использовался спрайт файла ресурса bol.png состоящий из одного фрейма размером 23x23 пикселя. В следующем разделе мы рассмотрим технику анимации спрайтов в играх, и будем использовать спрайт, состоящий уже из нескольких фреймов.

8.8. Анимация в игровом процессе

Анимация в игровом процессе строится на основе последовательной цепочки рисунков. Как вы уже знаете, отдельно взятый рисунок из анимационной последовательности в Java 2 ME называется фреймом. Для того чтобы осуществить плавную анимацию в игре, необходимо выполнить ряц сменяющих друг друга рисунков. Посмотрите на рис. 8.3, где изображен матрос с флажками.

Рис. 8.3. Анимационная последовательность

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

Анимация повсеместно используется в компьютерных и мобильных играх. Вы наверно замечали, что при перемещении в игре персонажа, он производит ряц повторяющихся движений, создавая видимость игрового цикла. Такие элементарные движения следствие перехода по имеющимся фреймам исходного изображения. Для этих целей в Java 2 ME имеются специальные методы класса Sprite.

Метод nextFrame ■) позволяет осуществить переход по всем имеющимся фреймам исходного изображения. Как только достигается последний фрейм, то автоматически происходит переход к первому фрейму с последующим переходом по всей имеющейся последовательности, что обеспечивает цикличность анимации.

Давайте рассмотрим пример использующий анимационную последовательность, изображенную на рис. 83. В этом примере на экран выводится изображение матроса и осуществляется цикличный переход по всем имеющимся фреймам, создавая эффект движения матроса, который с помощью семафорной азбуки передает слово «анимация».

public void commandAction (Command с, Displayable d)

В листинге 8.3, а также на компакт-диске в папке \Code\Listing8_3\src дается код примера иллюстрирующего работу анимационной последовательности.

" у**

листинг 8.3 класс MainGame . */

import javax.microedition.lcdui . *,-import javax.microedition.midlet . *;

public class MainGame extends MIDlet implements

CommandListener

{' "

// команда выхода -

private Command exitMidlet = new Command («Выход», Command. EXIT, 0} ;

' // объект класса MyGameCanvas

private MyGameCanvas rnr;

public void startAppO

■ {

// обрабатываем исключительную ситуацию try{

// инициализируем объект класса MyGameCanvas rnr = new MyGameCanvas ( ) ;

// запускаем поток mr.start() ;

// добавляем команду выхода mr.addCommand С exitMidlet); mr.setCommandListener(this) ;

// отражаем текущий дисплей ■

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

} catch ( java. io. IOExcept ion zxz) { } ;

> ■

public voidpauseApp ( ) {}

public void destroyApp (booleanunconditional)

{ -

// останавливаем поток if(mr != null) mr.stopO;

if (с

exitMidlet)

destroyApp(false); notifyDestroyed() ;

) } }

/**

файл MyGameCanvas . j ava

класс MyGameCanvas

*/ v

1

import j ava.io.*;

import javax.microedition.lcdui. *; import javax.microedition. lcdui. game . * ;

public class MyGameCanvas extends GameCanvas implements Runnable

{

// создаем объект класса MySprite private Matros matros;

// создаем /Объект класса LayerManager private LayerManager lm;

// логическая переменная boolean z,-

public MyGameCanvas () throws IOException

{

// обращаемся к конструктору суперкласса Canvas super(true);

// загружаем изображение

Image im = Image. createlmage («/matros .png») ;

// инициализируем объект matros matros = new Matros (im, 94, 100); // выбираем позицию matros.setPosition(30, 30); , // инициализируем менеджер уровней ■ lm = new LayerManager ( ) ; // добавляем объект матроса к уровню * ' lm. appen(3matro)s; •

>

public void start ()

z = true;

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

}

// останавливаем поток

public void stop(){ z = false; }

public void run() ,

{

/У получаем графический контекст Graphics g = getGraphics С ) ; while (z) {

/ / рисуем графические элементы init(g);

// останавливаем цикл

try { Thread, sleep (250) ; }

catch (java.lang.InterruptedException zxz) {};

}

}

private void init (Graphics g)

{

// белый цвет фона-g.setColor(Oxffffff); // перерисовываем экран . g.fillRect (0,0, getWidth() , getHeight { ) ) ; // рисуем уровень в точке 0,0 lm.paint (g, 0 , 0) ,-// рисуем анимацию matros.Animation() ; // двойная буферизация flushGraphics();

};

i jtt i

файл Matros.Java

класс Matros V

import j avax.microedition. lcdui . *,-

import javax.microedition.lcdui.game.* ;

/

public class Matros extends Sprite {

// конструктор

public Matros (Image image, int fw, int fh)

{

// обращаемся к конструктору суперкласса super(image, fw, fh) ;

}

■/ / метод осуществляющий анимацию public void Animation () ( {

// вызыбаем следующий фрейм nextFrame () ,-

> }

В листинге 8.3 нам интересно несколько моментов. В классе Matros, являющимся подклассом класса Sprite, создается метод Animation () , который выглядит следующим образом:

public void Animation (> {

nextFrame();

}

Метод Animation ( ) осуществляет тот самый последовательный переход по имеющимся фреймам исходного изображения. В классе MyGameCanvas происходит создание объекта класса Matros:

private Matros matros;

. Затем в конструкторе класса MyGameCanvas загружается изображение матроса и инициализируется объект matros.

Image im = Image.createImage(«/matros.png»); ' matros"= new Matros(im, 94, 100);

Размер одного фрейма с матросом равен 94x100 пикселей, поэтому указывается размер именно одного фрейма. По умолчанию загружается самый первый фрейм изображения, но можно использовать метод setFrame () для установки необходимого фрейма из анимационной последовательности. В методе Graphics () класса MyGameCanvas происходит вызов метода Animation ():

matros.Animation() т

Это в итоге приводит к цикличному перебору всех имеющихся фреймов. Откомпилируйте код из листинга 8.3 и посмотрите работу этого примера. На экране телефона матрос с помощью семафорной азбуки передает слово «анимация».

8.9. Столкновение объектов

Практически во всех играх приходится обрабатывать события связанные со столкновением двух объектов или с препятствием. В профиле MIDP 2.0 существует три отличных метода, отслеживающих факт столкновения. Все три метода определены в классе Sprite.

□ collidesWith(Image imageint x, int y. Boolean pixelLe-vel) — определяет факт столкновения со статическим изображением;

Q collidesWithf Sprite s, Boolean pixelLevel) -определяетстол-

кновение между двумя объектами класса Sprite; Q collidesWith(TiledLayer t, Boolean pixelLevel) -отслеживает столкновение между объектом класса Sprite и объектом класса TiledLayer. »

Используя эти методы можно обрабатывать всевозможные ситуации, связанные со столкновением. Как правило, при столкновении должны произойти какие-то события, чаще всего связанные с изменением первоначального состояния объекта. Это может быть уничтожение объекта, его перемещение, уменьшение или увеличение. В основе изменения состояния объекта положен перебор имеющихся фреймов в анимационной последовательности или перерисовка изображения на новом месте. Для этих операций в классе Sprite имеется несколько методов. С одним из методов nextFrame (), вы уже познакомились в разделе 8.8, рассмотрим оставшиеся методы.

□ prevFrame () - с помощью этого метода происходит переход к предыдущим фреймам изображения. Этот метод подобен методу nextFrame

Q setFrame () - производит установку при помощи индекса заданного фрейма из всей имеющейся последовательности фреймов.

Q setFrameSequence() - устанавливает определенную фреймовую последовательность при помощи массива индексов в анимационной последовательности;

□ get Frame () - узнает, какой из фреймов исходного изображения используется в текущий момент;

□ set Image (j - заменяет исходное изображение на новое. Можно использовать этот метод, например в том случае, если объект уничтожен, и его необходимо перерисовать заново.

Набора этих методов вполне достаточно для обработки различных ситуаций возникающих в ргровом процессе. Однако необходимо очень тщательно разобраться в действии всех вышеперечисленных методов. Для этого был написан исходный код примера, иллюстрирующего работу методов nextFrame (), prevFrame (), setFrame О и setFrame Sequence О. В этой программе на экран выводятся четыре бомбы и синий шарик, перемещая который в разные стороны можно произвести столкновение с четырьмя бомбами. Все бомбы являются объектами класса MySprite, являющимся подклассом класса Sprite. Метод, обрабатывающий столкновение мяча и бомбы, использует один из четырех мето-

Столкновение объектов

дов nextFrame (), prevFrame (), setFrame () и setFrameSequence () для

каждой из бомб, что красочно иллюстрирует работу каждого метода Исходные изображения бомбы и мяча выполнены в виде последовательности четырех фреймов размером 23x23 пикселя. Первый фрейм мяча и бомбы является исходным изображением, а три последующих фрейма реализованы в виде взрыва. Переход по этим фреймам создает иллюзию взрыва мячика или бомбы. Но оттого, что для каждой бомбы как мы договорились, используются различные методы, то результат может оказаться неожиданным. Поэтому внимательно посмотрите на код примера в листинге 8.4 и запустите программу с компакт-диска \Codc\ Iisting8_4\bin\Iisting8_4.jad с помощью любого эмулятора, поддерживающего профиль MIDP 2.0. Либо откомпилируйте исходный код из листинга 8.4 (он так же находится на компакт-диске в папке \Code\Listing8_4\src) и внимательно ознакомьтесь с работой этой программы Я уверен, ЧТО вы без труда разберетесь, что именно нужно сделать для логического завершения взрывов бомб и мяча. Алгоритм действий очень прост и может быть следующим после столкновения мяча с одной из мин. Необходимо произвести взрыв, последовательно переходя по всем фреймам, после чего, например, нарисовать бомбу и мячик заново. В листинг 8.4 предложен исходный код примера.

/**

листинг 8.4 класс MainGame */

import javax.microedition.lcdui.*; import javax.microedition.midiet. *,-

public class MainGame extends MIDlet implements CommandListener

{

// команда выхода

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

// объект класса MyGameCanvas

private MyGameCanvas mr;

public void startAppO

/ / обрабатываем исключительную ситуацию try{

// инициализируем объект класса MyGameCanvas mr = new MyGameCanvas();

// запускаем поток mr.start() ;

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

mr.addCommandCexitMidlet); mr ,setCommandListener(this); /У отражаем текущий дисплей Display.getDisplay( this).setCurrent(mr); ■ }catch (java.io. IOException zxz) { } ;

}

public void pauseAppO {}

public void destroyApp (boolean unconditional)

{

// останавливаем поток if(mr J = null) mr.stopt);

public void commandAct ion (Command c, Displayable d)

{ ■ '

if (c == exitMidlet)

{

destroyApp(false); notifyDestroyed() ;

}

} }

•$>eoraMyGameCanvas . j ava

класс MyGameCanvas */

import Java.io.* ;

import javax.microedition. lcdui . *; import javax.microedition. lcdui .game.*

public class MyGameCanvas extends GameCanvas inplements Runnable {

// создаем объект класса MySprite private MySprite bol ;

// создаем объект класса LayerManager

private LayerManager lm; // создаем бомбы

private MySprite bombal , bomba2 , bomba3 , bomba4;

// логическая переменная boolean z;

public MyGameCanvas() throws IOException {

// обращаемся к конструктору суперкласса Canvas super(true);

// загружаем изображение мяча

Image bollmage = Image.createlmage («/bol .png»)

// инициалтзируем объект bol bol = new MySprite(bolImage, 23, 23); // выбираем позицию в центре экрана bol.setPosition(getwidth()12, getHeight()/2);

// загрузка изображения бомбы ,

Image bombalmage = Image.Createlmage(«/bomba.png» // инициализируем первую бомбу bombal = new MySprite(bombalmage, 23, 23); // выбираем позицию для первой бомбы bombal.setPosition(10, 10); // инициализируем вторую бомбу bomba2 = new MySprite (bombalmage, 23, 23); ' // выбираем позицию для второй бомбы bomba2.setPosition{ getwidth()-30, 10); // инициализируем третью бомбу ЬотЬаЗ = new MySprite (bombalmage r 23, 23};// выбираем позицию для третьей бомбы ЬотЬаЗ . setPosition (10 , getHeight () -4-0) ; // инициализируем четвертую бомбу bomba4 = new MySprite(bombalmage, 23, 23); // выбираем позицию для че'твертой бомбы bomba4.setPosition(getwidth()-30, getHeight О-40) // инициализируем менеджер уровней lm = new LayerManager () / / добавляем мяч к уровню lm.append(bol); 1

// добавляем бомбы к уровню lm.append(bombal); lm.append(bomba2); lm. append (ЬотЬаЗ ) ,-lm.append(bomba4) ;

/ / обрабатываем столкновение public void stolknovenie() {

// столкновение с первой бомбой'.' if(bol.соllidesWith(bombal, true)) {

bol.nextFrame С); bombal.nextFrame

}

// столкновение со второй бомбой if(bol.collidesWith(bomba2, true))

{

bol .prevFrame(} ,-bomba2.prevFrame С) ;

}

// столкновение с третвей бомбой if(bol.collidesWith(bombal, true) )'

{

bol.setFrame(2); i

bombaJ,setFrame(0) т

}

// столкновение с четвертой бомбой if(bol.collidesWith(bomba4, true) )

{

int[] i = {2,3};

bol.setFrame(0) ;

bomba4 . setFrameSequence (i ) ;

}

}

public void start О {

z =. true;

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

} .

// останавливаем поток' public void stop(){ z = false; }

public void run() {

// получаем графический контекст Graphics g = getGraphics ( )

■ while (z) ■ {

// столкновение с препятствием stoiknovenie () ;

// обрабатываем события с клавиш телефона inputKey() ;


Для перехода к следующей странице статьи перейдите по вы подающему меню
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