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

Лабораторная работа 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). Каким образом наследуются методы классов?