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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 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 Кб, 114 просмотров)
__________________
Создатель: Бойцовский клуб | TimeZero | Sky2Fly
Я возьму сам.


Последний раз редактировалось MerlinTwi; 28.12.2009 в 05:01. Причина: поправил ошибку в коде
Создать новую тему   Часовой пояс GMT +4, время: 17:56.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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