- •Лабораторная работа 1 Свободное движение графического объекта
- •Лабораторная работа 2 Ограниченное движение графического объекта
- •Лабораторная работа 3 Изменение траектории движения
- •Лабораторная работа 4 Дублирование графических объектов
- •Лабораторная работа 5 Построение геометрических фракталов
- •Лабораторная работа 6 Программное рисование двумерных объектов
- •Лабораторная работа 7 Столкновение множества графических объектов
- •Лабораторная работа 8 Моделирование системы гравитации
- •Лабораторная работа 9 Моделирование пружинной системы
- •Лабораторная работа 10 Программное рисование трёхмерных объектов
- •Лабораторная работа 11 Моделирование системы освещения
- •Лабораторная работа 12 Моделирование полигональных объектов
- •Лабораторная работа 13 Текстурирование трёхмерных объектов
Лабораторная работа 2 Ограниченное движение графического объекта
Цель работы:
1). Изучить: простейшие методы физики в компьютерной графике на примере определения момента столкновения подвижного и неподвижного графических объектов; принципы наследования классов и объектов.
2). Создать приложение для управления ограниченным и бесконечным движением одного графического объекта внутри другого.
Порядок выполнения работы:
1. Создайте новую папку, новый проект типа Flash Project и новый документ типа Flash Document с одинаковыми названиями "lab02".
2. В документе "lab02.fla" создайте два объекта "Background" и "Ball" типа MovieClip с параметрами из предыдущей работы, перенесите их в библиотеку документа. На первом кадре создайте экземпляр класса Main.
3. Скопируйте классы Main и Motion из предыдущей лабораторной работы.
4. Создайте новый класс Collision, являющийся наследником класса Motion:
class Collision extends Motion {...}
получаем:
class Collision extends Motion {// Constants:
public static var CLASS_REF = Collision;
public function Collision() {// constructor code}
}
5. Аргументами для конструктора класса Collision будут являться те же значения, что и для класса Motion, поэтому их необходимо передать с помощью оператора вызова суперконструктора super():
public function Collision(target, vx, vy) {
super(target, vx, vy);
this.target.stepMotion = this.stepMotion;
}
т.е. получаем:
class Collision extends Motion{// Constants:
public static var CLASS_REF = Collision;
public function Collision(target, vx, vy)
{
super(target,vx,vy);
this.target.stepMotion = this.stepMotion;
}
}
6. Единственным методом в классе Collision будет метод startMotion(), который полностью повторяет аналогичный метод класса Motion.
получаем:
class Collision extends Motion{// Constants:
public static var CLASS_REF = Collision;
public function Collision(target, vx, vy)
{
super(target,vx,vy);
this.target.stepMotion = this.stepMotion;
}
public function startMotion()
{
this.target.onEnterFrame = this.stepMotion;
}
}
7. Для того, чтобы расширить список вызовов методом onEnterFrame, необходимо использовать анонимную функцию function(), например:
this.target.onEnterFrame = function() {...};
получаем:
class Collision extends Motion{// Constants:
public static var CLASS_REF = Collision;
public function Collision(target, vx, vy)
{
super(target,vx,vy);
this.target.stepMotion = this.stepMotion;
}
public function startMotion()
{
this.target.onEnterFrame = function() { this.stepMotion();};
}
}
8. Для того, чтобы сравнить взаимное расположение двух графических объектов, необходимо присоединить один объект к другому, например:
var background:MovieClip = this.target.attachMovie("Background", "background", 0);
var ball:MovieClip = background.attachMovie("Ball", "ball", 0);
этими строками заменить строки в main.as : this.target.attachMovie("Background","background",0);
this.target.attachMovie("Ball","ball",1);
9. В конструкторе класса Motion создать переменные bx и by типа Number и присвоить им значения границ неподвижного объекта background:
this.bx = target._parent._width;
this.by = target._parent._height; получаем:
public function Motion(target, vx, vy)
{ this.target = target;
this.target.object = this;
this.vy = vy;
this.vx = vx;
this.bx = target._parent._width;
this.by = target._parent._height;}
10. Для того, чтобы проверить, будет ли объект ball своей нижней точкой соприкасаться с границей background, в анонимной функции обработки метода onEnterFrame необходимо написать следующее условие:
if (this._y> this.object.by-this._height) {
this.object.vy *= -1;
}
11. Самостоятельно напишите ещё три условия для проверки столкновения с остальными границами объекта background (рис. 3), а также вызов метода метод startMotion() класса Collision.
условия:
this.target.onEnterFrame = function()
{
this.stepMotion();
if (this._y > this.object.by - this._height)
{
this.object.vy *= -1;
}
if (this._x > this.object.bx - this._width)
{
this.object.vx *= -1;
}
if (this._y < 0)
{
this.object.vy *= -1;
}
if (this._x < 0)
{
this.object.vx *= -1;
};
}
вызов в main.as в функции init
private function init()
{
var background:MovieClip = this.target.attachMovie("Background", "background", 0);
var ball:MovieClip = background.attachMovie("Ball", "ball", 0);
var collision: Collision = new Collision(ball, 4, 4);
collision.startMotion();
}
Рис. 3. Ограниченное движение графического объекта
Контрольные вопросы:
1). Для чего используется метод onEnterFrame класса MovieClip?
2). Зачем используется подстановка для this.stepMotion в классе Collision?
3). В каких случаях используется анонимная функция function()?
4). Как получить доступ к свойствам родительского объекта?
5). Каким образом наследуются методы классов?
