MZero #8 [окт. - дек. 2004]
Меню
  Главная
  Авторам
  Разделы
  Команда MZero
  Клуб ICQ
HiTech
  Limelight: настольная лампа анализирует мировые угрозы.
  Наручные часы со временем освоили новые профессии.
  Трёхколёсная "Шишка" пускает немцев под откос .
StreetLife
  Граффити.
  Snowboarding.
  Фризби? Фризби!!!
Моддинг
  Гайд по установки вентилятора в крысу.
  Гайд по электроники...
  "Basic Soldering Guide" aka "Паяние для чайников".
Mobile
  Продажи сотовых телефонов в России выросли на 38%.
  Всё об MP3-плейерах за 15 минут.
Windows
  Microsoft залатала ещё 22 "дыры".
  WinXP_faq (rar).
Пингвин'zzz
  Графика в консоли Linux.
  Монтирование дисков в Linux.
  Совместная работа LDAP и SAMBA.
Delphi
  Урок1_ Краткое введение в курс Delphi.
  Урок2. Реакции на события. Компонент F1Book.
  Урок3. Свойства объектов. Формирование отчетов в MS Excel.
Интернет - программинг
  Что такое RSS?
  Говорим на Flash Action Script.
  Говорим на Flash Action Script 2.
  Говорим на Flash Action Script 3.
  Говорим на Flash Action Script 4.
Web - desigN
  Дизайн для портативных устройств: ваш веб-сайт на маленьком экране.
  Из практики создания логотипов...
  Продолжение повести о логотипах вообще и шрифтах в частности...
  Фотография не по-детски.
Интернет - сайт
  Online игры.
  Бесплатная почта.
Жизнь в сети
  Сам себе издательство.
  Rambler: upgrade.
Софт
  Роботехника на грани фантастики.
  Теория происхождения видов, родов и отдельно стоящих персон.
  К вопросу о строительстве вавилонских башен.
Чтиво
  Пауло Коэльо - Алхимик.
  С любовью Алиса.
Games
  The Sims 2.
  GuildWars.
  GTA: San Andreas .
  Cheats.
Интервью
  Сьюзан сарандон: "Мои дети кричали: "Мама, не позорь нас!"
  Интервью с Крейгом Барреттом.
  Маша Цигаль: "Всякой одежды должно быть много!".
Музыка
  Русские идут!
  Black Eyed Peas.
Стиль
  Сезон красивых мелочей. Модные аксессуары.
Здоровье
  Пора в аптеку: что выбрать для защиты от гриппа и ОРВИ? .
Это мы смотрим...
  Чужой против Хищника: Война миров.
  Небесный капитан: Небесный тихоход.
  Хроники Риддика: Гражданин Галактики.
Наука
  Создана ткань толщиной в один атом.
Pick up
  Методики разговора с "трудными" людьми.
  О чем говорить с девушкой?
www.mzero.by.ru
Интернет - программинг

Говорим на Flash Action Script 2.

Перейдем теперь к выстрелам. Все будет происходить так: при нажатии клавиши «огонь» координаты снаряда становятся равными координатам тарелки или пушки, а затем начинают двигаться с учетом угла поворота ствола.

Итак, код для снаряда тарелки (пишем в сценарии экземпляра снаряда тарелки plate_shell):

Переменная plate_shell.flag будет принимать три значения: 0 — выстрела нет (снаряд не летит и на экране невидим; реализуется это установлением координат снаряда числом, большим размеров видимого окна), 1 — был произведен выстрел (приравниваются координаты снаряда и ствола), 2 — снаряд в полете.

В сценарии первого кадра обнулите значение переменной plate_shell.flag:

Далее, в сценарии второго кадра допишите :

То есть, если была нажата клавиша Delete, то координаты снаряда становятся равными координатам тарелки, и переменной plate_shell.flag присваивается значение 2 — снаряд полетел громить вражеское орудие.

А сейчас нам понадобятся знания, почерпнутые из школьного курса геометрии. Итак, нам известен угол поворота снаряда и его скорость (допустим, 40 пикселей за кадр). Требуется найти смещение по x- и y-координатам.

Напоминаем: отношение –x/s равно sin(A) (отношение противолежащего катета к гипотенузе), отсюда x=–s*sin(A). Отношение y/s равно cos(A), отсюда y=s*cos(A).

В языке сценариев Flash 5 существует объект Math, предназначенный для математических вычислений. Нам потребуются два метода этого объекта: метод Math.cos() и Math.sin(), вычисляющие косинус и синус указанного в скобках параметра. Параметр должен быть указан в радианах. Но мы работали только с углами, заданными в градусах.

Специально чтобы обойти это препятствие хитрые математики :-) придумали формулу, позволяющую переводить градусы в радианы: B = *A/180, где B — угол в радианах, а A — угол в градусах. Если взять скорость снаряда, равную 40, то x = –40*sin(*A/180), y = 40*cos(*A/180). Константа задается свойством pi объекта Math: Math.pi.

Чтобы не писать очень длинные строки, будем записывать значения синусов и косинусов в отдельные переменные, и уже затем писать код смещения. Пусть значение выражения sin(*A/180) хранится в переменной PS, а cos(*A/180) — в переменной PC.

Итак, в сценарии второго кадра пишем:

То есть, если plate_shell.flag равен 2, мы вычисляем синус и косинус угла поворота, а затем происходит смещение.

Настало время посмотреть, что у нас получилось.

Нажмите F12 и оцените творение своих рук. Все замечательно, но обращают на себя внимание две досадные мелочи: во-первых, снаряд, вылетев за левый край, так и улетает в неизвестность, а во-вторых, если быстро нажимать на клавишу выстрела, снаряд возвращается на исходную для стрельбы позицию и опять начинает полет. С первой трудностью справиться легко — как и в случае с тарелкой, напишем в сценарии второго кадра следующие строки:

А в отношении второй поступим так: когда произойдет выстрел, включится какой-то счетчик, и пока он не будет больше какого-то числа (например, 60), выстрелить опять будет нельзя (пока зарядятся импульсные энерго-генераторы, пока то-се :-)…) Когда значение счетчика будет больше 60, движение снаряда прекратится, и он займет исходную позицию за границей видимого окна (т.е. «спрячется» — до следующего выстрела).

Итак, замените блок, который начинается со строки

на следующий:

То есть теперь в этом блоке еще увеличивается счетчик, а затем, в зависимости от его значения, либо происходит смещение, либо обнуляются счетчик и флаг снаряда, а сам снаряд сдвигается за область экрана. Кстати, в сценарии первого кадра обнулите счетчик plate_shell_counter:

Кроме того, расширилось условие — флаг plate_shell.flag может быть равен как двойке, так и единице (двойным символом | обозначается булево (логическое) ИЛИ). Дело в том, что если мы нажмем клавишу выстрела, а счетчик еще не зашкалит за 100, то значение plate_shell.flag станет равным единице и без дополнительного условия смещение снаряда выполняться не будет.

Далее, строку

замените на строку

Здесь мы, наоборот, сужаем условие. Ведь выстрелить заново можно, только если движения снаряда уже нет (счетчик plate_shell_counter обнулен).

Далее, если во время полета снаряда изменять угол наклона пушки, то можно заметить, что траектория полета снаряда тоже будет меняться. Конечно, пришельцы в техническом плане очень продвинуты, но будем считать, что управлять каким-нибудь там плазменным снарядом им не под силу. Поэтому угол наклона траектории снаряда будет меняться только тогда, когда снаряд не движется (счетчик plate_shell_counter обнулен).

Для этого строку

замените на следующий блок:

Теперь вроде бы все. Почти все. Осталось написать то же самое для пушки и придумать, каким образом будет происходить попадание.

Для пушки код сценария будет почти таким же — только немного изменятся формулы, по которым будет вычисляться смещение снаряда.

Итак, в сценарии снаряда для пушки (cannon_shell) пишем:

Тут все ясно — если нажата клавиша Q, то переменной cannon_shell.flag присваивается значение 1.

Далее в первом кадре обнуляем флаг:

Объявляем и обнуляем счетчик для снаряда пушки (тоже в первом кадре):

Теперь во втором кадре заменяем строку

на блок

Далее пишем во втором кадре:

То есть все делаем так же, как для случая с тарелкой, но только заменяем слово «plate» на слово «cannon» и немного изменяем формулы (переменная CS вместо PS, СС вместо PC, также меняем местами знаки + и –, т.к. пушка стреляет вверх, а тарелка — вниз).

Вот теперь можно и протестировать. Нажимаем F12 и проверяем, все ли работает так, как мы задумали. Вроде, все нормально. Тогда переходим к самой главной (но не самой сложной!) части.

Как же будут происходить попадания? И как будет реагировать на это наша техника? А примерно так: во время полета снаряда будет проверяться расстояние от центра вражеской машины. При достижении определенного значения будет считаться, что снаряд попал. Играть до первого попадания неинтересно, поэтому будем играть до пяти. Количество оставшихся жизней будем отображать в виде вытянутого по горизонтали красного прямоугольника, который при каждом попадании будет уменьшаться.

Итак, создайте новый символ с именем hits в виде прямоугольника красного цвета. Его размеры сейчас не важны. Придется создать еще два слоя. Назовите их plate_hit и cannon_hit. Поместите в каждый из этих слоев по одному экземпляру символа hits и в поле Name закладки Instance дайте им имена: plate_hit и cannon_hit. Разместите их так, чтобы экземпляр plate_hit находился выше тарелки, а экземпляр cannon_hit — ниже пушки. Теперь подберем размеры этих экземпляров. Во-первых, они должны находится по центру. Их длина должна быть равна длине ролика, т.е. 550 пикселей. Ширину можно взять 10 пикселей. Длина и ширина символа во Flash задается свойствами _height и _width.

Итак, в сценарии первого кадра пишем:

Вертикальные координаты указаны приблизительно, у вас они могут быть немного другими.

Теперь о попаданиях. Снаряд попал, если он находится в прямоугольнике, центр которого совпадает с центром тарелки (пушки). То есть, если размеры тарелки 40 пикселей в высоту и 70 — в длину, то условие попадания будет выглядеть так:

Метод math.abs объекта math возвращает модуль числа. Итак, для снаряда пушки код попадания будет следующим (пишем в сценарии второго кадра):

То есть если снаряд попал, то «линию жизни» надо уменьшить на 110 пикселей, а затем сдвинуть ее на 55 пикселей влево (чтобы полоска оставалась у левого края).

Если размеры тарелки и пушки совпадают, то для снаряда тарелки код будет почти таким же (если нет, то сделайте их размеры одинаковыми):

Теперь, в третьем кадре после строки gotoAndPlay (2); пишем:

То есть, если длина одной из линий будет равна нулю, то произойдет переход на нужный кадр.

Теперь создаем еще один слой. В этом слое десятый и одиннадцатый кадр делаем ключевыми (keyframe). В десятом кадре создаем надпись Humans win!. На вспомогательной панели Character увеличиваем размер шрифта. В сценарии этого кадра пишем stop(), чтобы остановить ролик. В одиннадцатом кадре пишем Aliens win!, увеличиваем размер шрифта, в сценарии, как и для десятого кадра, пишем stop(), сохраняем, запускаем. На Рис. 1 показано, что приблизительно должно получиться.

Вот в общем-то и все. Осталась работа по Рис. 1 улучшению геймплея. Можно увеличить количество кадров в секунду, индивидуализировать скорости для тарелки и пушки, изменить скорости для снарядов, изменить «живучесть», нарисовать красивый задний фон, скажем, красные плоскогорья Марса (придется создать еще один слой). Только внимательно следите за тем, чтобы снаряд не проскочил «сквозь» цель, то есть смещение снаряда не должно превышать размеров цели. Играйте и выигрывайте :-)!

Теперь о публикации. Как уже говорилось, основное назначение Flash — возможность размещения качественных анимированных роликов на веб-страницах. Так что зайдите снова в меню File > Publish Settings и поставьте галочку в checkbox’e HTML.

После публикации кроме файла StarWars.swf появится еще и автоматически созданная HTML-страница StarWars.html, которая содержит ссылку на созданный нами Flash-ролик. Открываем этот файл, копируем код, заключенный между тэгами <OBJECT> и </OBJECT>, в код своей страницы, и вот — на ней уже появилась наша игра. Обратите внимание: по умолчанию предполагается, что ролик (swf-файл) «лежит» в той же папке, что и html-страница. Это же правило сохраняется для интернет-адресов. Если, допустим, ваша страница имеет адрес http://server.com/my/page.html, то swf-файл в данном случае будет иметь адрес http://server.com/my/StarWars.swf.

Ваяйте! Слава уанету!

P.S. Чтобы вам было удобнее разбираться с текстами программ, нами был выложен rar-архив описанного в статье проекта по адресу http://uant.narod.ru/misc/sw1.rar. Архив содержит файл StarWars.fla (Flash-проект) и пример html-страницы со встроенным swf-роликом.

Полезные ссылки:

http://www.flasher.ru/

http://www.3wgraphics.com/

http://www.avestadesign.ru/




наверх Автор: Кирилл КОВАЛЕНКО, Андрей КОВАЛЕНКО uant@ukr.net Источник: http://www.mycomputer.ua/


Copyright by MZero
Копирование и использование данных материалов разрешается
только в случае указания на журнал "
MZero", как на источник получения информации.
При этом во всех ссылках обязательно явное указание адреса вэб-сайта
www.mzero.by.ru.
Журнал тестировался на IE 5.0/6.0; Opera; Mozilla; MYIE 2.0; Netscape