Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 04.12.2005, 20:10
K@@ вне форума Посмотреть профиль Отправить личное сообщение для K@@ Найти все сообщения от K@@
  № 1  
Ответить с цитированием
K@@

Регистрация: Dec 2005
Сообщений: 6
Attention Как спрограммировать в ActonScript 2.0 перемещение объектов мышкой?

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

Старый 04.12.2005, 20:23
KUZEN вне форума Посмотреть профиль Отправить личное сообщение для KUZEN Посетить домашнюю страницу KUZEN Найти все сообщения от KUZEN
  № 2  
Ответить с цитированием
KUZEN
Ветеран форума
 
Аватар для KUZEN

Регистрация: Jun 2005
Адрес: MOSCOW
Сообщений: 6,852
Отправить сообщение для KUZEN с помощью ICQ Отправить сообщение для KUZEN с помощью Yahoo Отправить сообщение для KUZEN с помощью Skype™
При нажатии на карту , т.е. karta.onPress = function(){this.startDrag()} , при отпускании карты , т.е. karta.onRelease = function(){this.stopDrag()}
__________________
BestMasterиZация

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

Старый 05.12.2005, 13:18
__i вне форума Посмотреть профиль Отправить личное сообщение для __i Найти все сообщения от __i
  № 4  
Ответить с цитированием
__i
 
Аватар для __i

Регистрация: Jan 2004
Адрес: Украина, Харьков
Сообщений: 1,524
Отправить сообщение для __i с помощью ICQ
Объект не обязательно должен быть кнопкой !!!,

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

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

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

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

Старый 05.12.2005, 14:45
antonyrec вне форума Посмотреть профиль Отправить личное сообщение для antonyrec Найти все сообщения от antonyrec
  № 5  
Ответить с цитированием
antonyrec
 
Аватар для antonyrec

Регистрация: Jul 2005
Адрес: Ульяновск
Сообщений: 198
Ну vovakent загнул! Прям эпопея целая

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

Старый 05.12.2005, 16:33
KUZEN вне форума Посмотреть профиль Отправить личное сообщение для KUZEN Посетить домашнюю страницу KUZEN Найти все сообщения от KUZEN
  № 6  
Ответить с цитированием
KUZEN
Ветеран форума
 
Аватар для KUZEN

Регистрация: Jun 2005
Адрес: MOSCOW
Сообщений: 6,852
Отправить сообщение для KUZEN с помощью ICQ Отправить сообщение для KUZEN с помощью Yahoo Отправить сообщение для KUZEN с помощью Skype™
Урок для чайников )))
__________________
BestMasterиZация

Старый 05.12.2005, 18:04
K@@ вне форума Посмотреть профиль Отправить личное сообщение для K@@ Найти все сообщения от K@@
  № 7  
Ответить с цитированием
K@@

Регистрация: Dec 2005
Сообщений: 6
Согласен, что урок для чайников, т.к. чайником в этом деле и являюсь.
Чтож поделать, не спросив так и останусь чайником.

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

Старый 05.12.2005, 19:41
K@@ вне форума Посмотреть профиль Отправить личное сообщение для K@@ Найти все сообщения от K@@
  № 8  
Ответить с цитированием
K@@

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

Старый 05.12.2005, 19:48
KUZEN вне форума Посмотреть профиль Отправить личное сообщение для KUZEN Посетить домашнюю страницу KUZEN Найти все сообщения от KUZEN
  № 9  
Ответить с цитированием
KUZEN
Ветеран форума
 
Аватар для KUZEN

Регистрация: Jun 2005
Адрес: MOSCOW
Сообщений: 6,852
Отправить сообщение для KUZEN с помощью ICQ Отправить сообщение для KUZEN с помощью Yahoo Отправить сообщение для KUZEN с помощью Skype™
Проверяй координаты мыши при отпускании и если они там где нужно то задавай положение по _x и _y соответствующие, если не донёс до колоды значит задавай начальные координаты ...
__________________
BestMasterиZация

Старый 05.12.2005, 21:48
MOHCTEP вне форума Посмотреть профиль Отправить личное сообщение для MOHCTEP Найти все сообщения от MOHCTEP
  № 10  
Ответить с цитированием
MOHCTEP

Регистрация: Dec 2002
Адрес: Живу вот где-то
Сообщений: 493
Предлагаю сей топ кинуть в факи.

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:25.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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