Программное перетаскивание объектов в флеш-роликах

Для перетаскивания мувиков по сцене флеш-ролика в ActionScript 2.0 имеется два специальных метода:

1.) startDrag() - задаёт параметры и начинает перетаскивание; имеет несколько необязательных, но очень полезных параметров:

- первый параметр отвечает за положение курсора мышки относительно перетаскиваемого объекта и может принимать булевы значения true или false. Работу данного параметра наглядно демонстрирует следующий пример.

В данном приложении имеется два мувиклипа, которые можно перетаскивать. Но левому мувиклипу в качестве первого параметра указано значение true. Поэтому при перетаскивании левого мувика курсор мышки всегда располагается над точкой регистрации мувиклипа (в данном примере нулевая точка координат мувиклипа помечена двумя пересекающимися линиями). А правому мувику в качестве первого параметра указано false, благодаря чему жесткой привязки курсора мышки к центру мувиклипа не происходит.

- четыре последующих параметра являются числами и определяют область перетаскивания - это прямоугольная область, в которой возможно перетаскивание данного объекта. Из этих 4-х параметров два первых указывают координаты верхнего левого угла области перетаскивания, а два последних хранят координаты нижнего правого угла прямоугольной области. Именно на основе данных о координатах верхнего левого и нижнего правого углов и строится прямоугольная область, внутри которой возможно перетаскивание объекта.

2.) stopDrag() - останавливает перетаскивание.

Примечания:

[!] на плавность перетаскивания влияет fps данного флеш-ролика. Если fps низкий, то перетаскивание будет происходить рывками, объект будет заметно отставать от курсора мышки;

[!] одновременно можно перетаскивать только один объект.

Чтобы проверить работу этих методов на практике, создаём мувик с именем "mc" и пишем приведённый ниже код на главной временной шкале флеш-ролика.

Код ActionScript 2.0:

mc.onPress = function() { mc.startDrag(false, 100, 100, 450, 300); }; mc.onRelease = function() { mc.stopDrag(); };

В результате у нас получается следующее:

В данном примере границы области перетаскивания обозначены красной пунктирной линией. Сама же прямоугольная область перетаскивания построена на основе координат верхнего левого угла (100,100) и нижнего правого угла (450,300).

В ActionScript 3.0 перетаскивание осуществляется одноимёнными методами, но для определения области перетаскивания используется экземпляр класса Rectangle, который имеет 4 параметра:

- координаты области перетаскивания по оси x;

- координаты области перетаскивания по оси y;

- ширина области перетаскивания;

- высота области перетаскивания.

Код ActionScript 3.0:

addEventListener(MouseEvent.MOUSE_DOWN, mDown); function mDown(event:MouseEvent):void { /* От первого параметра зависит расположение объекта относительно курсора мышки. Второй параметр определяет границы области, в которой осуществляется перетаскивание. */ mc.startDrag(true, new Rectangle(100,100,350,200)); } addEventListener(MouseEvent.MOUSE_UP, mUp); function mUp(event:MouseEvent):void { /* останавливаем перетаскивание */ mc.stopDrag(); }

Автор: admin

Дата добавления: 2011-07-20

Просмотров: 24631

Рейтинг поста: +38-

Правила перепечатки

Социальные закладки:
Комментарии:
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2012-07-20
Alex_M, правило хорошего тона - создать контейнер-мувик, в который поместить и циферблат, и все стрелки. И перетаскивать именно этот контейнер. А вы просто складываете все объекты на главную временную шкалу. Стоит ли удивляться, что с перетаскиванием возникают косяки.
Комментатор
Комментарий добавил(а): Alex_M
Дата добавления: 2012-07-19
Да, конечно!
Это мои новенькие часики:
cs - секундная стрелка;
cm - минутная стрелка;
ch - стрелка показывающая часы.
Вот если эти объекты создавать как _root.createEmptyMovieClip(); - то часики сами по себе идут, но в "контейнере" они уже только "стоят"
-------------------- код часов --------------------------
cs = this.createEmptyMovieClip("cs",2); cs.lineStyle(1,0xC23D3D,40); cs.moveTo(0,0); cs.lineTo(0,-110); cs._x = 275; cs._y = 200;

cm = this.createEmptyMovieClip("cm",1); cm.lineStyle(5,0xD9D9D9,100); cm.moveTo(0,0); cm.lineTo(0,-100); cm._x = 275; cm._y =200;

ch = this.createEmptyMovieClip("ch",0); ch.lineStyle(5,0xd9d9d9,100); ch.moveTo(0,0); ch.lineTo(0,-70); ch._x = 275; ch._y = 200;
var h,m,s:Number;
this.onEnterFrame = function()
{
var d:Date = new Date();
h = d.getHours();
m = d.getMinutes();
s = d.getSeconds();
ch._rotation = (h+m/60)*30;
cm._rotation = (m+s/60)*6;
cs._rotation = s*6;
} ;
---------------------------------------------------------
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2012-07-19
Можно проблемный фрагмент кода показать?
Комментатор
Комментарий добавил(а): Alex_M
Дата добавления: 2012-07-19
У меня получается, что есть разница. Если элементы часов сделаны как "_root.", то от часов отображаются стрелки и они "не тИкают"...
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2012-07-19
А какая разница? Код-то размещается на главной временной шкале.
Комментатор
Комментарий добавил(а): Alex_M
Дата добавления: 2012-07-19
Спасибо! Теперь все работает! Только надо сделать оговорку, что в загружаемом swf-ролике все действия должны быть созданы как "this", а не "_root." .
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2012-07-18

Здесь - о загрузке изображений и роликов с отслеживанием ошибок и прочим. Здесь - урок по созданию часиков на AS 2.0 (у вас, что-то, всё запутанно, да и время они показывали неправильно). Итак, если у вас есть готовые часики, то загружаем их примерно так:

var movieClipLoader:MovieClipLoader = new MovieClipLoader(); var obj:Object = new Object(); obj.onLoadStart = function(target:MovieClip) { trace("Загрузка стартовала..."); }; obj.onLoadProgress = function(target:MovieClip, loadedBytes:Number, totalBytes:Number) { trace("Загружено: " + (totalBytes / totalBytes * 100) + " %"); }; obj.onLoadComplete = function(target:MovieClip) { trace("Загрузка завершена..."); }; obj.onLoadInit = function(target:MovieClip) { target.onPress = function() { target.startDrag(); }; target.onRelease = function() { target.stopDrag(); }; }; obj.onLoadError = function(target:MovieClip, errorCode:String) { trace("Ошибка при загрузке файла! Код ошибки: " + errorCode); }; movieClipLoader.addListener(obj); _root.createEmptyMovieClip("conteiner",_root.getNextHighestDepth()); movieClipLoader.loadClip("mechclock.swf",conteiner);

Результат:

Комментатор
Комментарий добавил(а): Alex_M
Дата добавления: 2012-07-17
http: // narod.ru / disk / 56846286001 . f706440e 4590ee52a756 a18be4cc29b2 / timer . fla . html - исходник часов.
http: // narod . ru / disk / 56846192001 . af52df1406 a1baa34 a44d6225dd9b5b8 / bg1 . fla . html - исходник места, куда загружаются часы. Если не указывать что в объект загружается файл, то работает все как надо. если указать файл - то не работает(((
Комментатор
Комментарий добавил(а): edapskov
Дата добавления: 2012-07-17
Да, с исходником было бы понятнее и быстрее :-)
Комментатор
Комментарий добавил(а): Alex_M
Дата добавления: 2012-07-16
Вот в том-то все и дело, что так не получается((( Т.е. я пытался на actionscript 2.0 такое сделать - сам контейнер без подгрузки картинки двигается мышью, а если в него загружать файл swf - перестает двигаться перетаскиванием, а только выполняется его программное действие - ход часов. могу прислать исходники - они небольшие.
Добавить комментарий:







[ + ] помощь по форматирование текста

Идиот-тест

Если все обязательные поля (отмечены * ) заполнены необходимой информацией, то нажимаем кнопку Добавить комментарий.

Страница 3 из 4: 1234
Меню
Подписка
Рубрики
Метки
Последние комментарии
Рейтинг постов
Реклама
Друзья
География гостей
Статистика
Яндекс.Метрика