- •Лабораторная работа 1 Свободное движение графического объекта
- •Лабораторная работа 2 Ограниченное движение графического объекта
- •Лабораторная работа 3 Изменение траектории движения
- •Лабораторная работа 4 Дублирование графических объектов
- •Лабораторная работа 5 Построение геометрических фракталов
- •Лабораторная работа 6 Программное рисование двумерных объектов
- •Лабораторная работа 7 Столкновение множества графических объектов
- •Лабораторная работа 8 Моделирование системы гравитации
- •Лабораторная работа 9 Моделирование пружинной системы
- •Лабораторная работа 10 Программное рисование трёхмерных объектов
- •Лабораторная работа 11 Моделирование системы освещения
- •Лабораторная работа 12 Моделирование полигональных объектов
- •Лабораторная работа 13 Текстурирование трёхмерных объектов
Лабораторная работа 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?
