Программирование в Adobe Flash движущихся объектов Осипенко Д.В., Редьков А.А., Фролов А.О. студенты 3 курса ф-та Информационных технологий МИРЭА, руководитель аспирант Ремизов А.Ю. Проект выполнен в графическом анимационном редакторе на платформе активатизации движения Action Script. Этот проект является игрой, суть которой заключается в уничтожении ботов. Боты, движущиеся с определенной скоростью, постепенно приближаются к башне, которую защищает игрок. Персонаж находится на вершине башни и вооружен арбалетом. Для защиты башни он использует стрелы, выпускаемые в противников. Направление стрелы и угол управляются с помощью мыши. Для уничтожения бота необходимо попасть стрелой ему либо трижды в корпус, либо один раз в голову, после чего он прекращает свое существование в виде кучи костей на игровом поле. Однако последующие боты не считают это преградой и продолжают наступать на защищаемую башню. В игре существует индикатор здоровья\жизни башни а также количество убитых ботов. Помимо этого за каждого убитого бота начисляются золотые монеты, количество которых так же показано на индикаторе. На этапе проектирования управление в Action Script предполагает, что каждая движущаяся деталь имеет свою программу, т.е. совокупность взаимодействующих объектов построенных из набора классов. Первый шаг в написании новой программы заключается в определении классов. На первом этапе работы каждому логическому классу были присвоены имя и роль в создаваемой программе: герой: арбалет, арбалет сбоку, герой, голова героя сбоку, левая рука сбоку, правая рука сбоку, стрела; мир: дверь, замок, земля, облака, фон;монстры: бот. Некоторые объекты были нарисованы в самом графическом редакторе, а другие - экспортированы (например арбалет, герой, рука, стрела, скелет и его анимация). Каждый класс с помощью кода описывает характеристики и поведение определенного типа объекта. Для корректной работы программы и во избежание совпадения имен с именами, занесенными в базу программы, создается основной пакет, в котором прописываются исходные данные, позволяющие этой игре существовать. В программе создан один пакет GameСlass, предоставленный единым исходным кодом. Перед началом работы приложения импортируются следующие события: анимация фона, обработка событий мыши, анимация героя, анимация ботов. Также описываются следующие объекты: герой; бот; дверь; массив стрел; массив ботов; счетчик убитых ботов; переменная, хранящая время запуска игры. При запуске создается конструктор, в котором создаются массив стрел и массив ботов, герой, дверь и боты, а также устанавливается покадровый вызов функции проверки столкновений. После этого включается герой и в соответствующую переменную записывается время запуска игры. В программе основное предпочтение отвелось оператору цикла for для просмотра массива ботов и массива стрел и условному оператору if. Другие традиционные операторы типа while и switch не были использованы, так как основной акцент ставился на попадание стрелы в противника или, соответственно, промах. Проверку попадания стрел в ботов осуществляет функция testCollision(event:Event):void. Выбирается первый элемент из массива ботов, для которого проверяется попадание в него стрелы последовательно для каждого элемента соответствующего массива. Если стрела летит (if(mArrayArrows[i].isEnabled())) осуществляется проверка на попадание ее конца в прямоугольник бота (if(mArrayBots[k].hitTestPoint(mArrayArrows[i].x, mArrayArrows[i].y, true)). Если последнее условие выполняется, бот прорисовывается в одном цвете: var botBD:BitmapData = new BitmapData(mArrayBots[k].width, mArrayBots[k].height); botBD.draw(mArrayBots[k]). Далее переменной gettedPixel:uint присваивается цвет пикселя координаты конца стрелы-botBD.getPixel(mArrayArrows[i].x-mArrayBots[k].x,mArrayArrows[i].y-ArrayBots[k].y). Если стрела попала в бота (цвет botBD.getPixel(mArrayArrows[i].x-mArrayBots[k].x, не черный и не белый): mArrayArrows[i].y-mArrayBots[k].y), - уменьшается жизнь бота на единицу: mArrayBots[k].damage(mArrayArrows[i].getSpeed()/2.5). В случае, если стрела попала в голову: if((mArrayArrows[i].y-mArrayBots[k].y)<30), - бот умирает: mArrayBots[k].damage(mArrayArrows[i].getSpeed()/1.3) Далее происходит выключение стрелы и удаление ее из массива: mArrayArrows[i].disable(); mArrayArrows[i].parent.removeChild(mArrayArrows[i]); mArrayArrows.splice(i, 1) Если бот мертв: if(mArrayBots[k].isDead), - он также удаляется из массива: mArrayBots.splice(k, 1). Помимо этого увеличивается счетчик убитых и изменяется текст количества убитых: killed++; mDoor.panel.killedtxt.text = killed; а также завершается выполнение цикла обхода стрел и программа переходит к просмотру следующего бота из соответствующего массива. Если же цвет пикселя конца стрелы черный или белый, получаются координаты центра стрелы: var tmpx:Number = mArrayArrows[i].width/2*Math.cos(mArrayArrows[i].rotation); var tmpy:Number = mArrayArrows[i].width/2*Math.sin(mArrayArrows[i].rotation); и выполняются все те же действия для конца стрелы, описанные выше, но только для ее середины. Создание бота осуществляет функция mNewBot():void: private function mNewBot():void {mBot = new GameClass.Bots(mDoor); // создаем нового бота mArrayBots.push(mBot); // добавляем бота в массив // начальная позиция mBot.x = 620; mBot.y = 290+Math.random()*20; parent.addChild(mBot); mBot.startWalk(); // добавляем на сцену // бот начинает идти setTimeout( this.mNewBot, 3000+Math.random()*1000 +3000/(getTimer()-startTime) );} Последняя строка обеспечивает вызов функции себя самой через определенное время: чем больше прошло времени с начала запуска игры, тем чаще будет появляться бот. Полный код программы с подробными комментариями содержится в приложении. Тестирование продукта проводилось следующим образом: запускалось приложение, и проводилась проверка на выполнение поставленной задачи. Если поставленная задача не выполнялась, осуществлялся поиск причины ошибок в соответствующем блоке программы. Одной из первых трудностей, вставших перед разработчиками, являлась обработка попадания стрелы в бота: при высокой скорости полета стрела не убивала бота вообще. Дело в том, что разработанная нами функция на начальном этапе обрабатывала лишь координаты конца стрелы. Вызов функции происходит покадрово. В связи с этим она не успевала обработать тот кадр, когда конец стрелы попадал в прямоугольник бота. Решение пришло само собой: обработка координаты середины стрелы позволило решить эту проблему. Немало сил было потрачено и на анимацию движения рук стрелка: руки перемещались вверх-вниз как-то неестественно. Но путем многократной переработки был выбран наиболее подходящий вариант. То же самое получилось и с траекторией полета стрелы. Всем известно, что стрела, как и любой другой предмет, летит по параболе. Траекторию полета, естественно, рассчитать было не трудно. Основная трудность заключалась в другом. Необходимо было поставить в соответствие траекторию движения силе, с которой запускается стрела. Эта проблема решалась так же, как и предыдущая – методом рассмотрения различных вариантов. В результате необходимое соответствие было достигнуто