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

Лабораторная работа 7 Столкновение множества графических объектов

Цель работы:

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

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

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

1. Используйте копии классов Main, Graphics2D, Motion и Collision.

2. Для того, чтобы создать несколько объектов разного размера (от 25 до 50) при нажатии кнопки мыши на объекте bounds (метод onPress) в месте нажатия (свойства _xmouse и _ymouse объекта типа MovieClip) и ограничить их количество до 5 (рис. 10), используйте следующий обработчик:

bounds.onPress = function() {

var n:Number = this.getNextHighestDepth();

if (n<5) {

ball = this.createEmptyMovieClip ("ball"+n, n);

ball.beginFill(0xffffff, 100);

ball.drawCircle (this._xmouse, this._ymouse, Math.random()*25+25);

ball.endFill();

var motion:Collision = new Collision(ball, 4, 4);

motion.startMotion();

}

};

3. Полученные объекты необходимо поместить в массив в конструкторе Collision, используя метод push для новой переменной targets типа Array, которую нужно определить в начале класса Collision как new Array().

Рис. 10. Столкновение множества графических объектов

4. Для проверки момента столкновения одного подвижного объекта с другим необходимо создать отдельный метод checkBalls() и включить его в список обработчика в методе startMotion() класса Collision:

this.target.onEnterFrame = function() {

this.stepMotion();

this.checkBounds();

this.checkBalls();

};

5. Метод checkBalls() практически полностью повторяет метод checkBounds(), с учётом проверки момента пересечения текущего объекта с другими объектами из массива с помощью метода hitTest():

var balls:Array = this.object.targets;

...

for (var i = 0; i<balls.length; i++) {

if (balls[i] != this && this.hitTest(balls[i])) {

var dx:Number = this._x-balls[i]._x+this.object.vx;

var dy:Number = this._y-balls[i]._y+this.object.vy;

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

var space:Number = distance-(balls[i]._width/2+this._width/2);

if (space<0) {

this.object.vx *= -1;

this.object.vy *= -1;

}

}

}

6. Проверьте работу проекта при добавлении и движении пяти независимых подвижных графических объектов.

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

1). Для чего используется упреждающий расчёт положения объекта ball?

2). Что означает запись new Array() для определения переменной массива?

3). Почему иногда происходит "залипание" подвижных объектов при столкновении их со стенками неподвижного объекта и друг с другом?

4). Как в реальности ведут себя физические тела при столкновении?

5). Какое отношение имеют свойства указателя мыши – координаты _xmouse и _ymouse к графическому объекту типа MovieClip?