![]() |
|
|
![]() |
![]() |
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
Регистрация: Dec 2005
Сообщений: 6
|
![]() Привет!
Я новичок в ActonScript 2.0 поэтому заранее прошу прощения, если вопрос окажется глупым. ![]() Но столь же искренне прошу помощи в решении следующей проблемы: Я пишу небольшую карточную игрушку в которой нужно перетаскивать карты с помощью мыши, наподобие того, как перетаскиваются карты в пасьянсе "Косынка". Т.е. захватываем нажатием левой кнопки мыши карту, тащим ее на нужное место, а после того, как отпускаем левую кнопку мыши, карта встает туда куда ее перетащили. Как раз процесс перетаскивания карт у меня и вызвал кучу затруднений. Понимаю, что нужно обрабатывать событие onPress, но никак не соображу как же будет цепляться карта к курсору мыши и уж тем более как отловить, что клавиша уже опущена. Уверен, что у многих моя проблема вызовет лишь улыбку, но для меня она на сегодняшний день поболее глобальных будет. ![]() Заранее благодарю всех за ответы, советы и поддержку. |
|
|||||
Ветеран форума
|
При нажатии на карту , т.е. karta.onPress = function(){this.startDrag()} , при отпускании карты , т.е. karta.onRelease = function(){this.stopDrag()}
__________________
BestMasterиZация |
|
|||||
Регистрация: 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) углов невидимого прямоугольника, внутри которого разрешено перемещаться объекту (точнее, его центру). |
|
|||||
Объект не обязательно должен быть кнопкой !!!,
тоже самое можно делать и с обычным мувиком on (....){} - я считаю что это не удачный стиль программирования!!!, т.к. код расползаеться по всем мувикам, вместо одного места более удачно это mc.on....(){} где on... == onRelease, onPress и т.д |
|
|||||
Регистрация: Jul 2005
Адрес: Ульяновск
Сообщений: 198
|
Ну vovakent загнул! Прям эпопея целая
![]() 2vovakent: кнопки действительно не обязательны. К тому же, представь, что у тебя 100 мувиков (кнопок). Что, ты будешь каждой экшн писать ?! |
|
|||||
Ветеран форума
|
Урок для чайников )))
__________________
BestMasterиZация |
|
|||||
Регистрация: Dec 2005
Сообщений: 6
|
Согласен, что урок для чайников, т.к. чайником в этом деле и являюсь.
![]() Чтож поделать, не спросив так и останусь чайником. ОГРОМНОЕ СПАСИБО ВСЕМ кто ответил. Очень рад, что вы помогли мне. Еще пару ответов и глядишь, перестану быть чайником. ![]() |
|
|||||
Регистрация: Dec 2005
Сообщений: 6
|
Еще вопрос из той же темы: Я понял по совету vovakent, как ограничить область перемещения, а как сделать так, чтобы опускаемые карты ложились ровно в колоду, а не беспорядочно образовывали кучу нагромождения там, где их бросили?
|
|
|||||
Ветеран форума
|
Проверяй координаты мыши при отпускании и если они там где нужно то задавай положение по _x и _y соответствующие, если не донёс до колоды значит задавай начальные координаты ...
__________________
BestMasterиZация |
|
|||||
Регистрация: Dec 2002
Адрес: Живу вот где-то
Сообщений: 493
|
Предлагаю сей топ кинуть в факи.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 19:44. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|