Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семестр2_lr.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.27 Mб
Скачать

Лабораторная работа 6 Программное рисование двумерных объектов

Цель работы:

1). Изучить: простейшие методы рисования в API с помощью ActionScript 2.0; пример расчёта столкновения более сложных графических объектов.

2). Создать приложение для управления ограниченным и бесконечным движением одного графического объекта сложной формы внутри другого.

Порядок выполнения работы:

1. Создайте новый проект с названием "lab06".

2. Скопируйте в рабочую папку и присоедините к проекту классы Main, Motion и Collision из предыдущих лабораторных работ.

3. Создайте новый класс Graphics2D, наследующий методы класса MovieClip, в конструкторе которого в качестве прототипа класса MovieClip укажите метод рисования окружности drawCircle():

public function Graphics2D() {

MovieClip.prototype.drawCircle = drawCircle;

}

4. Метод drawCircle() будет принимать значения координат центра (переменные x, y) и радиуса (переменная radius) окружности:

function drawCircle(x:Number, y:Number, radius:Number) {

var n:Number = 8;

var theta:Number = (360/n)*Math.PI/180;

var sector:Number = radius/Math.cos(theta/2);

var angle2:Number = 0;

var angle1:Number = angle2-theta/2;

this.moveTo(radius, 0);

for (var i = 0; i<n; i++) {

angle2 += theta;

angle1 += theta;

var x2:Number = radius*Math.cos(angle2);

var y2:Number = radius*Math.sin(angle2);

var x1:Number = sector*Math.cos(angle1);

var y1:Number = sector*Math.sin(angle1);

this.curveTo(x1, y1, x2, y2);

}

this._x = x;

this._y = y;

}

5. Переменная n в методе drawCircle() управляет точностью построения окружности (количество сегментов должно быть не меньше восьми).

6. Для того, чтобы создать графический объект с помощью метода drawCircle(), необходимо добавить на сцену экземпляр класса Graphics2D и создать пустой объект типа MovieClip, у которого уже будет новый метод:

var graphics:Graphics2D = new Graphics2D(this.target);

var bounds:MovieClip = this.target.createEmptyMovieClip("bounds", 0);

7. Для закрашивания объекта bounds можно использовать стандартные методы. Так, например, для градиентного закрашивания от красного цвета до чёрного сверху вниз линейно, необходимо использовать следующие параметры (где cx и cy – координаты центра сцены):

var colors:Array = [0xff0000, 0x000000];

var alphas:Array = [100, 100];

var ratios:Array = [0x00, 0xff];

var matrix:Object = {matrixType:"box", x:-cx, y:-cy, w:cx*2, h:cy*2, r:(90/180)*Math.PI};

bounds.beginGradientFill("linear", colors, alphas, ratios, matrix);

bounds.drawCircle(cx, cy, Math.min(cx, cy));

bounds.endFill();

8. Создайте новый объект ball типа MovieClip внутри объекта bounds и закрасьте его, используя белый цвет:

var ball:MovieClip = bounds.createEmptyMovieClip("ball", 0);

ball.beginFill(0xffffff, 100);

ball.drawCircle(0, 0, 25);

ball.endFill();

9. Также в классе Main создайте экземпляр объекта класса Collision, в который передайте объект ball с начальной скоростью 4 и углом наклона 90°.

10. В классе Collision создайте новый метод checkBounds(), в который перенесите из метода startMotion() сценарий проверки момента столкновения с внешними стенками с упреждением на шаг вперёд. Объект this._parent – это родительский объект для объекта ball, в данном случае – это bounds:

function checkBounds() {

var dx:Number = this._x+this.object.vx;

var dy:Number = this._x+this.object.vy;

var distance:Number = Math.sqrt(dx*dx+dy*dy);

var space:Number = distance-(this._parent._width/2-this._width/2);

if (space>0) {

this.object.vx *= -1;

this.object.vy *= -1;

}

}

11. Обработчик метода onEnterFrame() в методе startMotion() класса Collision должен быть упрощён до следующей записи:

this.target.onEnterFrame = function() {

this.stepMotion();

this.checkBounds();

};

12. Представленный выше пример сценария проверки момента столкновения в методе checkBounds() предназначен для класса Motion, в котором метод, описывающий движение, использует скорости движения по осям X и Y. Для класса Motion в данной лабораторной работе измените код метода checkBounds() для движения по одному значению скорости (по оси X) и углу отклонения относительно её.

13. Для того, чтобы меньший объект ball двигался более хаотично внутри большого bounds (рис. 9), можно использовать разные значения углов отклонения в методах checkBounds() класса Collision и init() класса Main, а также применить метод random() из класса Math для вычисления случайного значения угла отклонения с множителем 90, указывающим на ограничение изменения результата от 0 º до 90º:

this.object.vy -= Math.random()*90;

...

var motion:Collision = new Collision(ball, 4, Math.random()*90);

14. Проверьте работу проекта (рис. 9), сохраните и закройте его.

Рис. 9. Ограниченное движение графического объекта

Контрольные вопросы:

1). В чём смысл переменной prototype класса MovieClip?

2). В чём смысл переменных colors, alphas, ratios метода beginGradientFill()?

3). Почему для рисования объекта ball используются координаты (0, 0)?

4). Как изменится вычисление переменной dy через угол наклона движения?

5). Почему для рисования окружности методом drawCircle() в классе Graphics2D недостаточно менее чем 8 сегментов?