![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Banned
[+5 23.05.09]
[+1 23.05.09] Регистрация: Mar 2009
Сообщений: 93
|
Давно столкнулся с этим вопросом, но отставил "на потом" мелкие вопросы наподобие этого. Вот, пришло время и до них ...
1. В библиотеке находятся мувики, преобразованные из битмепа круглой (овальной) формы. Они программно добавляются на сцену и их можно перетаскивать. Само собой, раз мувик построен на битмепе, то его можно "брать" как за видимые части (круг, овал), так и за углы, что, собственно, нелогично и не очень удобно. Для себя я вижу несколько направлений реализации механизма отлова нажатия мыши на видимой части: - проверка на прозрачность пиксела мувика, на котором сделан клик; - задать для мувика свойство hitArea, которое будет указывать на скрытый спрайт с векторным шаблоном, повторяющим форму видимой части перетаскиваемого мувика; - задать свойство mask для мувика и обрабатывать его события (эта идея самая сырая и схожа с предыдущей, так как также надо рисовать векторный шаблон-маску, только инвертированную - на невидимые части). Наверняка кто-то сталкивался с подобной реализацией. По какому пути лучше пойти? - Особенно в плане быстроты анализа клика. А также, возможно, есть другой (другие) способы "борьбы" с этой проблемой. 2. При перетаскивании мувика он двигается рывками, как бы постоянно доганяя курсор мыши. С одной стороны, перетаскиваемые мувики очень малы - почему бы им не перерисовываться быстрее, да и комп, где тестируется, достаточно мощный, а с другой стороны - бекграунд флешки - это сплошной битмеп, с чем, возможно, можно связать неплавность движения мувика. Можно ли побороть это рывчатое движение? - Возможно, надо просто делать мои мувики на время перетаскивания курсорами мыши? 3. Следствие первых двух, а также мой недавний переход на AS3 с его "слегка измененной" событийной моделью. Пример: мувики находятся друг над другом так, что невидимый уголок верхнего находится над нижним. При нажатии на уголок верхнего событие все равно должен получить нижний мувиклип. Я так понимаю, что при задании hitArea все и так заработает (событие фактически получает шаблон, а на нем клика не было), а вот если через анализ прозрачности, то надо "передать клик" нижнему мувику - так сказать, выполнить диспетчеризацию события (?). Как на практике это делается? Спасибо за советы. |
|
|||||
|
Регистрация: Jul 2007
Адрес: Москва
Сообщений: 996
|
1. Зависит от задачи.
Если нужно динамически, то либо при клике проверять на прозрачность, либо прграммно рисовать маску. Иначе, можно в библиотеке сделать Break Apart и вырезать ненужные куски. 2. У Вас что-то грузит процессор, ищите что. 3. Проблему решит пункт 1.
__________________
Griver |
|
|||||
|
Banned
[+5 23.05.09]
[+1 23.05.09] Регистрация: Mar 2009
Сообщений: 93
|
Н-дааа, многовекторность - хорошая штука. Когда зацикливаешься на чем-то одном, о других вещах просто забываешь.
Есть простая старая вещь - маска, которую можно просто нарисовать в мувике ручками (для окружности или овала никаких проблем). И это снимает все проблемы с перетаскиванием. Правда, неплавность перетаскивания остается, но мне подсказывают, что это именно из-за бекграунда, как я и предполагал. Хотя бекграунд не очень сложный и большой, а перетаскиваемый мувик очень мал, но перерисовка все равно происходит недостаточно плавно. Извините, вопрос решен собственными силами. |
|
|||||
|
Регистрация: Dec 2008
Сообщений: 88
|
хм та же проблемма с hitTestObject
Банально нарисовав линию(по диагонали) получаю true при пересечении квадратной области redraw. ![]() может кто нибудь подскажет как это можно обойти?? маска не помогает Добавлено через 24 минуты тфу hitTestPoint(x,y,true) решение проблеммы но вот правда как быть в случае пересечения двух сложных тел с точностью до пиксела это интересно ![]() Последний раз редактировалось wer32; 10.04.2009 в 00:05. |
|
|||||
|
Регистрация: Aug 2005
Сообщений: 35
|
По поводу рывков: какой у тебя frameRate? попробуй его поставить побольше.
|
|
|||||
|
Вот пример плавного перемещения (описано в книге ActionScript 3.0 Сборник рецептов, авторы Джои Лотт, Деррон Шалл и Кейт Питерс. Глава 6.9). Обратите внимание: fps (во флеше Frame rate) не имеет значения.
Думаю, точность порядка 10 миллисекунд обеспечивается точно. Примечание: если таскаемый MovieClip к примеру содержит поле для ввода текста - уже наблюдаются баги. Необходима доработка. Ваш таскаемый MovieClip: myMc. (Область таскания не обозначена). Код: package { import flash.display.*; import flash.events.*; public class Main extends MovieClip { var draggedObject:DisplayObject; var offsetX:Number; var offsetY:Number; public function Main() { myMc.addEventListener(MouseEvent.MOUSE_DOWN, startDragging); myMc.addEventListener(MouseEvent.MOUSE_UP, stopDragging); } function startDragging(event:MouseEvent):void { draggedObject = DisplayObject(event.target); offsetX = event.stageX - draggedObject.x; offsetY = event.stageY - draggedObject.y; stage.addChild(draggedObject); stage.addEventListener(MouseEvent.MOUSE_MOVE, dragObject); } function stopDragging(event:MouseEvent):void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, dragObject); } function dragObject(event:MouseEvent):void { draggedObject.x = event.stageX - offsetX; draggedObject.y = event.stageY - offsetY; event.updateAfterEvent(); } } }
__________________
круглое тащим, квадратное катим Последний раз редактировалось xpymbl4; 11.04.2009 в 08:01. |
|
|||||
|
Banned
[+5 23.05.09]
[+1 23.05.09] Регистрация: Mar 2009
Сообщений: 93
|
Да, к сожалению, встроенный флешевский драг перерисовывает перетаскиваемый объект по фреймрейту, отсюда и дерганья. Не всегда получается сильно увеличить его, да и даже 100 кадров в секунду не дают абсолютно плавное движение, которое достигается отработкой MOUSE_MOVE. Спасибо, прийдется-таки идти по этому пути.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 12:50. |
|
|
« Предыдущая тема | Следующая тема » |
|
|