Сам себе девелопЕр. Ваяем аркаду. Часть нумеро финале

Xakep, номер #039, стр. 039-078-1


Александр "xtracer" Логинов (http://www.rgw.ru)

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

Взаимодействие объектов

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

Для начала выбери лазер и Actions для него "Window>Actions" (CTRL+ALT+A). Если ты сделал все правильно в первой части статьи, то твой код должен быть следующим:

onClipEvent (enterFrame) {

this._x+=laserMoveSpeed;

if (this._x>500){

this.removeMovieClip();

}

}

Перед двумя правыми скобками добавь следующие строчки:

for (i=1; i<=_root.numEnemy; i++){

if (this.hitTest( _root["enemy"+i])){

_root.score+=100;

_root["enemy"+i].gotoAndPlay( 2 );

}

}

Данный код проверяет взаимодействие лазера с одним из кораблей врага. Если взаимодействие обнаружено, то игрок получает +100 очков (root.score+=100;), а корабль противника вынужден проигрывать анимацию во втором фрейме (_root["enemy"+i].gotoAndPlay( 2 );). Первая строка устанавливает значение для повтора кода. Если на экране больше чем два врага, то количество повторов увеличивается. Т.е. программа проверяет взаимодействие лазера с каждым кораблем врага на экране. Вторая строка проводит сам тест в соответствии с установленным значением. Теперь перейдем к созданию таблицы очков и непосредственно к самим взрывам.

Содержание  Вперед на стр. 039-078-2