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

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

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

Регистрация: Dec 2009
Сообщений: 64
По умолчанию курсор над объектом MovieClip

Доброе время суток. в целом задача следующая: есть MovieClip, который может быть как растровым так и векторным. и необходимо узнать находится ли курсор на объекте. т.е. если это картинка, то необходимо выдавать true (что означает что курсор над объектом) тогда когда курсор действительно попал на объект, а не на пустую область в прямоугольнике. Что можете посоветовать?

Старый 22.12.2009, 12:58
Jewelz вне форума Посмотреть профиль Отправить личное сообщение для Jewelz Найти все сообщения от Jewelz
  № 2  
Ответить с цитированием
Jewelz
 
Аватар для Jewelz

Регистрация: Aug 2008
Адрес: Рязань
Сообщений: 723
вы имеете ввиду что картинка с прозрачностью? тогда проверяйте на пиксель с альфой 0
__________________
low +

Старый 22.12.2009, 13:05
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 3  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Если это растр, то он всегда прямоугольник и курсор действительно всегда попадает на объект. Пустая область - это пиксели растра с альфа=0. Анализируйте прозрачность пикселя под курсором.

Добавлено через 32 секунды
Аха, опередили =)
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

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

Регистрация: Dec 2009
Сообщений: 64
дело в том что я не знаю картинка это или мувик. И то что там лежит может сменится в любой момент.

Старый 23.12.2009, 18:58
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 5  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
>>не знаю картинка это или мувик
остается срисовывать содержимое в битмап (BitmapData#draw) и опять же смотреть прозрачность пикселя под курсором

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

Регистрация: Jan 2009
Сообщений: 1,651
ну так устанавливайте для мувика какой-нибудь флаг, чтобы знать мувик там или битмапа. Или используйте проверку типа if (mc is MovieClip) ... .
__________________
мой пустой блог

Старый 23.12.2009, 19:02
mayakwd вне форума Посмотреть профиль Отправить личное сообщение для mayakwd Посетить домашнюю страницу mayakwd Найти все сообщения от mayakwd
  № 7  
Ответить с цитированием
mayakwd
 
Аватар для mayakwd

Регистрация: Jul 2008
Адрес: t:2, x: 0.76
Сообщений: 553
Отправить сообщение для mayakwd с помощью ICQ Отправить сообщение для mayakwd с помощью Skype™
Цитата:
Сообщение от k0syak Посмотреть сообщение
дело в том что я не знаю картинка это или мувик. И то что там лежит может сменится в любой момент.
о боже, но оно же грузится у вас верно? на момент загрузки ставите слушателя, проверяете мувиклип это или битмапа, ставите флаг и далее по алгоритму при наведении делаете то или иное действие.
__________________
Блог, Twitter
Брюзга.

Старый 24.12.2009, 01:05
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 8  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от k0syak Посмотреть сообщение
И то что там лежит может сменится в любой момент.
Это немного усложняет дело. Вам нужно на хэндлере MOUSE_MOVE делать проверку event.target на принадлежность классу Bitmap. Если последнее имеет место, то производите проверку Bitmap(event.target).bitmapData на пиксели с альфа=0 под курсором. Сложнее будет, если есть необходимость игнорировать прозрачные писксели внутри границ.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 24.12.2009, 14:23
MerlinTwi вне форума Посмотреть профиль Отправить личное сообщение для MerlinTwi Посетить домашнюю страницу MerlinTwi Найти все сообщения от MerlinTwi
  № 9  
Ответить с цитированием
MerlinTwi
 
Аватар для MerlinTwi

Регистрация: Oct 2003
Адрес: Москва
Сообщений: 328
Ситуация сложнее. Если внутри мувиклипа лежит безымянная картинка, то flash IDE из нее делает Shape, а не Bitmap!
И при проверке пересекающихся мувиклипов надо еще определять, кто выше находится.

Столкнувшись с аналогичной ситуацией я написал такой класс, может и вас пригодится:
Код AS3:
package { // CheckMouseOver.as
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.geom.Rectangle;
 
	/** Для определения находится ли мышка над непрозрачной областью мувиклипа */
	public class CheckMouseOver {
 
		/** до какого размера уменьшать картинки */
		private const BITMAP_SIZE:int = 64;
 
		/** Какой мувиклип проверяем */
		public var mc:DisplayObject;
		/** На каком слое у родителя лежит этот mc */
		public var parentIndex:int;
		/** прямоугольник описывающий мувиклип */
		public var bounds:Rectangle;
 
		private var bd:BitmapData;
		private var dx:Number, dy:Number;
		private var p:Point = new Point();
 
		public function CheckMouseOver(mc:DisplayObject) {
			if (mc && mc.width > 0) {
				this.mc = mc;
				if (mc.parent) parentIndex = mc.parent.getChildIndex(mc);
				bounds = mc.getBounds(null);
				// для экономии памяти и сглаживания мелких дырок на картинке
				// сохраняем картинку уменьшенную до BITMAP_SIZE
				dx = BITMAP_SIZE / bounds.width;
				if (dx > 1) dx = 1;
				dy = BITMAP_SIZE / bounds.height;
				if (dy > 1) dy = 1;
				bd = new BitmapData(bounds.width * dx, bounds.height * dy, true, 0);
				bd.draw(mc, new Matrix(dx, 0, 0, dy, -bounds.x * dx, -bounds.y * dy));
			} else {
				trace("Empty MovieClip!", mc);
			}
		}
 
		/** Проверяет, попадает ли указанная точка сцены в наш мувиклип */
		public function check(stageX:Number, stageY:Number):Boolean {
			if (mc) {
				p.x = stageX;
				p.y = stageY;
				var p2:Point = mc.globalToLocal(p);
				if (bounds.containsPoint(p2)) { // мышка попала в наш прямоугольник, проверяем пиксель на прозрачность
					var color:uint = bd.getPixel32((p2.x - bounds.x) * dx, (p2.y - bounds.y) * dy);
					if (((color >> 24) & 0xFF) > 128) return true;
				}
			}
			return false;
		}
 
		/** Очистить память */
		public function dispose():void {
			if (bd) bd.dispose();
			bd = null;
			mc = null;
			bounds = null;
			p = null;
		}
	}
}
пример использования: допустим, у нас на сцене размещены 5 мувиклипов с именами "b0..b4" и нужно их подсвечивать при наведении мышки

Код AS3:
package {
	import flash.display.MovieClip;
	import CheckMouseOver;
	import flash.events.MouseEvent;
	import flash.filters.GlowFilter;
 
	dynamic public class Test extends MovieClip {
 
		/** Сюда складываем CheckMouseOver, которые будем проверять при движении мышки */
		var allObjects:Array;
		/** над каким мувиклипом мышка была в последний раз */
		var lastMouseOver:CheckMouseOver;
		/** Фильтр для подсветки мувиклипа */
		const lightFilter:Array = [new GlowFilter(0xFFFFFF, 1, 16, 16)];
 
		public function Test() {
			allObjects = new Array();
			for (var i:int = 0; i < 5; i++) {
				allObjects.push( new CheckMouseOver(this["b" + i]) );
			}
			// сортируем allObjects по слоям
			allObjects.sortOn('parentIndex', [Array.NUMERIC | Array.DESCENDING]);
			// слушаем движения мышки
			stage.addEventListener(MouseEvent.MOUSE_MOVE, onMMove);
		}
 
		private function onMMove(e:MouseEvent):void {
			// пытаемся определить, над каким объектом находится мышка
			var x0:int = stage.mouseX, y0:int = stage.mouseY;
			var atc:CheckMouseOver;
			for each (var c:CheckMouseOver in allObjects) {
				if (c.check(x0, y0)) {
					atc = c;
					break;
				}
			}
			if (lastMouseOver === atc) return; // ничего не изменилось
			if (lastMouseOver) {
				// выключаем подсветку у предыдущего объекта
				lastMouseOver.mc.filters = null;
			}
			lastMouseOver = atc;
			if (lastMouseOver) {
				// включаем подсветку
				lastMouseOver.mc.filters = lightFilter;
			}
		}
	}
}
в аттаче живой пример
Вложения
Тип файла: zip test.zip (154.3 Кб, 101 просмотров)
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.


Последний раз редактировалось MerlinTwi; 28.12.2009 в 05:01. Причина: поправил ошибку в коде
Старый 26.12.2009, 18:18
k0syak вне форума Посмотреть профиль Отправить личное сообщение для k0syak Найти все сообщения от k0syak
  № 10  
Ответить с цитированием
k0syak

Регистрация: Dec 2009
Сообщений: 64
Спасибаа!! Это все здорово работает. Только вот проблема. У меня мувик расположен не полностью на своём stage, а выше его (это необходимо для последующей привязки) и та часть которая на stage выделяется отлично, а та что выше не реагирует. Что можете посоветовать???

Добавлено через 69 часов 8 минут
Все, всем спасибо!! Все заработало. Убрал сторки, где меняется размер изображения

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

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

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


 


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


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