Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Как спрограммировать в ActonScript 2.0 перемещение объектов мышкой? (http://www.flasher.ru/forum/showthread.php?t=72815)

K@@ 04.12.2005 20:10

Как спрограммировать в ActonScript 2.0 перемещение объектов мышкой?
 
Привет!
Я новичок в ActonScript 2.0 поэтому заранее прошу прощения, если вопрос окажется глупым. :)
Но столь же искренне прошу помощи в решении следующей проблемы:
Я пишу небольшую карточную игрушку в которой нужно перетаскивать карты с помощью мыши, наподобие того, как перетаскиваются карты в пасьянсе "Косынка". Т.е. захватываем нажатием левой кнопки мыши карту, тащим ее на нужное место, а после того, как отпускаем левую кнопку мыши, карта встает туда куда ее перетащили.
Как раз процесс перетаскивания карт у меня и вызвал кучу затруднений. Понимаю, что нужно обрабатывать событие onPress, но никак не соображу как же будет цепляться карта к курсору мыши и уж тем более как отловить, что клавиша уже опущена.
Уверен, что у многих моя проблема вызовет лишь улыбку, но для меня она на сегодняшний день поболее глобальных будет. :)
Заранее благодарю всех за ответы, советы и поддержку.

KUZEN 04.12.2005 20:23

При нажатии на карту , т.е. karta.onPress = function(){this.startDrag()} , при отпускании карты , т.е. karta.onRelease = function(){this.stopDrag()}

vovakent 05.12.2005 12:22

Организация перетаскивания
Как организовать перетаскивание объекта? Поскольку все задачи, связанные с отслеживанием положения указателя мыши и соответственным перемещением объекта, возложены на оператор 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) углов невидимого прямоугольника, внутри которого разрешено перемещаться объекту (точнее, его центру).

__i 05.12.2005 13:18

Объект не обязательно должен быть кнопкой !!!,

тоже самое можно делать и с обычным мувиком

on (....){} - я считаю что это не удачный стиль программирования!!!, т.к. код расползаеться по всем мувикам, вместо одного места

более удачно это

mc.on....(){}
где on... == onRelease, onPress и т.д

antonyrec 05.12.2005 14:45

Ну vovakent загнул! Прям эпопея целая :)

2vovakent: кнопки действительно не обязательны. К тому же, представь, что у тебя 100 мувиков (кнопок). Что, ты будешь каждой экшн писать ?!

KUZEN 05.12.2005 16:33

Урок для чайников )))

K@@ 05.12.2005 18:04

Согласен, что урок для чайников, т.к. чайником в этом деле и являюсь. :D
Чтож поделать, не спросив так и останусь чайником.

ОГРОМНОЕ СПАСИБО ВСЕМ кто ответил.
Очень рад, что вы помогли мне.
Еще пару ответов и глядишь, перестану быть чайником. :D

K@@ 05.12.2005 19:41

Еще вопрос из той же темы: Я понял по совету vovakent, как ограничить область перемещения, а как сделать так, чтобы опускаемые карты ложились ровно в колоду, а не беспорядочно образовывали кучу нагромождения там, где их бросили?

KUZEN 05.12.2005 19:48

Проверяй координаты мыши при отпускании и если они там где нужно то задавай положение по _x и _y соответствующие, если не донёс до колоды значит задавай начальные координаты ...

MOHCTEP 05.12.2005 21:48

Предлагаю сей топ кинуть в факи.


Часовой пояс GMT +4, время: 06:00.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.