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

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

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

Регистрация: Dec 2008
Сообщений: 87
Question Как это - MOUSE_OUT сработал, а hitTestPoint возвращает true

Вот упрощенный вариант.
На сцене клип mc с двумя кадрами.
По MOUSE_OVER и MOUSE_OUT - прыгает с кадра на кадр.
При перетаскивании - мышь слетает с клипа и он "моргает".
Чтобы этого избежать - отключаю слушатели на время таскания.
При MOUSE_UP возвращаю их на место, но нужно перевести клип в нужный кадр.
И тут использую hitTestPoint, чтобы проверить, над клипом мышь или нет.
Если нет - прыгаю на первый кадр.

Так вот: если резко потащить клип и бросить его - можно отловить ситуацию, когда hitTestPoint вернет true и клип не сбросится в деактивированное состояние. По идее, если MOUSE_UP сработало над клипом, должен был включиться обработчик MOUSE_OUT и сбросить клип, но trace показывает, что событие уже произошло ДО этого.

Минималистический пример:
Код AS3:
import flash.events.MouseEvent;
import flash.geom.Point;
 
var dltY:Number;
 
mc.buttonMode = true;
 
mc.addEventListener(MouseEvent.MOUSE_OVER, mOver);
mc.addEventListener(MouseEvent.MOUSE_OUT, mOut);
 
mc.addEventListener(MouseEvent.MOUSE_DOWN, mDown);
 
 
function mOver(e:MouseEvent){
	mc.gotoAndStop(2);
}
 
function mOut(e:MouseEvent){
	mc.gotoAndStop(1);
}
 
function mDown(e:MouseEvent){
	mc.removeEventListener(MouseEvent.MOUSE_OVER, mOver);
	mc.removeEventListener(MouseEvent.MOUSE_OUT, mOut);
 
	stage.addEventListener(MouseEvent.MOUSE_MOVE, mMove);
	stage.addEventListener(MouseEvent.MOUSE_UP, mUp);
 
	dltY = mouseY - mc.y;
}
 
function mMove(e:MouseEvent){
	mc.y = mouseY - dltY;
	e.updateAfterEvent();
}
 
function mUp(e:MouseEvent){
	mc.addEventListener(MouseEvent.MOUSE_OVER, mOver);
	mc.addEventListener(MouseEvent.MOUSE_OUT, mOut);
 
	stage.removeEventListener(MouseEvent.MOUSE_MOVE, mMove);
	stage.removeEventListener(MouseEvent.MOUSE_UP, mUp);
	checkHit();
}
 
function checkHit(){
 
	if(!mc.hitTestPoint(stage.mouseX, stage.mouseY)){
		mc.gotoAndStop(1);
	}
}

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

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

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


 


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


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