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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 25.08.2009, 14:29
random13 вне форума Посмотреть профиль Отправить личное сообщение для random13 Найти все сообщения от random13
  № 1  
Ответить с цитированием
random13
 
Аватар для random13

Регистрация: Oct 2006
Адрес: Москва
Сообщений: 889
По умолчанию цепочки событий

и так, столкнулся с такой вот проблемой как перекрытие событий:
задействован максимально возможный вариант работы с мышкой (активное использование CLICK, MOUSE_DOWN и пр).

Например:
имеется рабочая область в которой по CLICK выполняются одни действия по DOWN -> MOVE -> UP другие при этом так же нужно учитывать еще одно условие, на рабочей области присутствуют кнопки по нажатию на которые с последствие должны выполняться другие действия по опять же нажатию

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

Старый 25.08.2009, 14:34
ToRR вне форума Посмотреть профиль Отправить личное сообщение для ToRR Найти все сообщения от ToRR
  № 2  
Ответить с цитированием
ToRR

Регистрация: Feb 2007
Сообщений: 63
ловить MOUSE_DOWN, запоминать target, вешать MOVE. при MOUSE_UP отписать MOVE, сравнивать target'ы - если совпали, то вызываем обработчик CLICK.


Последний раз редактировалось ToRR; 25.08.2009 в 14:37.
Старый 25.08.2009, 14:37
random13 вне форума Посмотреть профиль Отправить личное сообщение для random13 Найти все сообщения от random13
  № 3  
Ответить с цитированием
random13
 
Аватар для random13

Регистрация: Oct 2006
Адрес: Москва
Сообщений: 889
всмысле запоминать target, мы же слушатель привязываем к ему то, в данном случае к чему привязать?

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

Регистрация: Feb 2007
Сообщений: 63
если у вас слушатели вешаются на каждый объект:
1) изначально вешать на объекты MOUSE_DOWN.
2) при срабатывании MOUSE_DOWN вешать MOUSE_MOVE (если он срабатывает, то запоминаем это - wasMoved = true) и MOUSE_UP.
3) при срабатывании MOUSE_UP проверяем, wasMoved, если false то вызываем обработку обычного клика. Отписываем объект от MOUSE_MOVE и MOUSE_UP.

если же у вас 1 обработчик на много объектов, то:
1) изначально вешаем на сцену MOUSE_DOWN.
2) при срабатывании MOUSE_DOWN запоминаем объект, на котором был клик. Вешаем MOUSE_UP. Действия c MOUSE_MOVE тут зависят от того, чего вы хотите достичь.
3) при срабатывании MOUSE_UP сравниваем target ивента с тем, что запомнили - совпали - имеем клик, если объект не таскался.

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

Регистрация: Oct 2006
Адрес: Москва
Сообщений: 889
спасибо, это уже интересно, но вот еще вопрос насколько здесь всё таки осмысленно использовать собственные события?

как оказалось я уже активно использую подобную технику это я в плане переменных блокирующих ту или иную операцию

Старый 25.08.2009, 15:27
ToRR вне форума Посмотреть профиль Отправить личное сообщение для ToRR Найти все сообщения от ToRR
  № 6  
Ответить с цитированием
ToRR

Регистрация: Feb 2007
Сообщений: 63
В принципе, никто не мешает унаследоваться от того же Sprite'а, в классе реализовать все эти танцы с MOUSE_DOWN (подписаться в конструкторе), проверками на перетаскивание и т.д.
Наверх диспатчить кастомные(или стандартные MouseEvent.CLICK и т.д.) события, и наследовать все свои классы, требущие этот функционал от вышеописанного. Только в этом классе надо будет реализовать метод, который будет отписывать объекты от внутренних слушателей, чтобы GC смог потом все удалить.
Как-то так:
Код AS3:
public class MySprite extends Sprite 
{
	private var wasDragged:Boolean;
 
    public function MySprite()
    {
    	addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
    }
 
    public function free():void
    {
    	removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
    	removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
    	stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
    }
 
    private function onMouseDown(event:MouseEvent):void
    {
    	addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
    	stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
    }
 
    private function onMouseMove(event:MouseEvent):void
    {
    	wasDragged = true;
    }
 
    private function onMouseUp(event:MouseEvent):void
    {
    	removeEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
    	stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
    	if (!wasDragged)
    	{
			dispatchEvent(new MouseEvent(MouseEvent.CLICK....));    		
    	}
    }
}

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

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

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


 


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


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