Показать сообщение отдельно
Старый 05.12.2005, 12:22
vovakent вне форума Посмотреть профиль Отправить личное сообщение для vovakent Найти все сообщения от vovakent
  № 3  
Ответить с цитированием
vovakent

Регистрация: Nov 2005
Сообщений: 6
Организация перетаскивания
Как организовать перетаскивание объекта? Поскольку все задачи, связанные с отслеживанием положения указателя мыши и соответственным перемещением объекта, возложены на оператор startDrag, нам остается только правильно его применить. В технологии drag-and-drop принято, чтобы перемещение объекта вслед за мышью начиналось после нажатия на нем кнопки мыши и прекращалось после ее отпускания. Поэтому для отслеживания событий мыши на объекте удобно применить оператор on. Однако этот оператор допустим только в сценариях кнопки, следовательно, наш объект нужно сделать кнопкой.

Но в операторе startDrag необходимо указать имя экземпляра, который необходимо перетаскивать, а кнопке "напрямую" имя дать нельзя. К счастью, мы можем в качестве имени использовать ключевое слово this, означающее текущий объект.

Итак, откройте новый ролик, создайте в нем кнопку любого вида и поместите ее экземпляр в рабочую область. Теперь откройте окно сценария кнопки и введите туда такой код:

on (press) {
startDrag (this);
}
on (release) {
stopDrag ();
}

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

Центрирование указателя
Несколько более сложен случай, когда необходимо, чтобы указатель мыши находился точно в центре перетаскиваемого объекта. Для этого у оператора startDrag предусмотрен второй, необязательный аргумент. Если его значение равно true, то в момент начала перетаскивания объекта к указателю мыши "приклеивается" его центр.

Но если просто изменить код предыдущего примера следующим образом

on (press) {
startDrag (this,true);
}
on (release) {
stopDrag ();
}

то случится нечто, на первый взгляд непонятное: при нажатии кнопки мыши на объекте он отпрыгнет куда-то в сторону и начнет перемещаться в месте с указателем мыши, находясь на почтительном расстоянии от него. Более того, объект уже невозможно "освободить", поскольку для этого нужно отпустить кнопку мыши над объектом, а он находится в стороне!

На самом деле в этом нет ничего удивительного. Поскольку наша кнопка расположена в основном ролике, то "центром" своим она считает начало координат основного ролика, то есть левый верхний угол. Поскольку первоначально объект находится, как правило, где-то в середине рабочей области, получается, что при выполнении оператора

startDrag (this,true);

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

Этого неприятного эффекта избежать очень легко, если поместить кнопку внутрь мувика. Начало координат мувика находится в его центре. Поэтому, если просто вставить кнопку в новый мувик (выделив ее в рабочей области и нажав F8), центр мувика автоматически совпадет с центром кнопки.

Теперь мы можем спокойно написать

on (press) (
startDrag (this,true);
}
on (release) {
stopDrag ();
}

и просмотреть ролик. Теперь объект можно перетаскивать мышью, причем при нажатии кнопки мыши центр объекта совмещается с указателем мыши.

Задание области перетаскивания
При перетаскивании объекта можно ограничить область, в которой разрешено его перемещение. Для этого при операторе stratDrag нужно указать координаты прямоугольника, ограничивающего область перемещения, например, вот так:

on (press) {
startDrag (this,true,60,60,200,400);
}
on (release) {
stopDrag ();
}

Четыре числа, стоящие после двух первых аргументов оператора startDrag, означают соответственно координаты левого верхнего (60, 60) и правого нижнего (200,400) углов невидимого прямоугольника, внутри которого разрешено перемещаться объекту (точнее, его центру).