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

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

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

Регистрация: Jan 2011
Сообщений: 5
The bomb! Как сделать некликабельную область в Image?

Простите если я уже не первый кто пишет подобный пост, но никак не могу в документации по AS3 найти как мне сделать такую штуку:
Есть картинка (класс Image), в нее загружена png с прозрачностью,хотелось бы чтобы когда пользователь кликает (или дропает) другую картинку поверх прозрачности этой, срабатывал соответствующий обработчик не картинки с пустым местом а той что под ней. Проще говоря надо чтобы прозрачность картинки была неактивной областью, так сказать чтобы сквозь нее кликалось и кидалось всякое. Еще раз прошу прощения если повторяюсь, помогите хотя бы ссылкой на пост об этом. Заранее большое спасибо!

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

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
http://blog.mosessupposes.com/?p=40 - как вариант.

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

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Юзайте hitTestObject
Вот с примерами http://dougmccune.com/blog/2007/02/0...nt-png-images/

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

Регистрация: Jan 2011
Сообщений: 5
Спасибо за примеры, они действительно помогли я разобрался как проверять относятся ли данные координаты к объекту (попали ли мы в видимуюкартинку), однако проблема в том, что если под прозрачной областью картинки лежит вторая, как передать туда событие чтобы уже она обрабатывала событие клика дропа и т.д. ???

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

Регистрация: Oct 2010
Адрес: Стык Нижегородской и Мордовской областей, город Саров
Сообщений: 17
Я написал функцию-обработчик которая создавала маску для картинки.
Код AS3:
img.mask = getMask(img as Display Object);
 
private function getMask(imgDisplay:DisplayObject):Sprite
{
  var sprite:Sprite = new Sprite();
  var y:int = 0;
  while (y < imgDisplay.height)
  {
    var x:int = 0;
    while (x < imgDisplay.width)
    {
      var pixelMatrix:Matrix = new Matrix();
      pixelMatrix.translate( -x, -y);
 
      var pixelData:BitmapData = new BitmapData(1, 1, true, 0x00000000);
      pixelData.draw(imgDisplay, pixelMatrix);
 
      var alpha:uint = ((pixelData.getPixel32(0, 0) >> 24) & 0xFF);
      if (alpha > 0x0F)
      {
        sprite.graphics.beginFill(0xFFFFFF);
        sprite.graphics.drawRect(x, y, 1, 1);
        sprite.graphics.endFill();
        ++x;
      }
      ++y;
    }
    return sprite;
  }
}
Если что-то напутал, то я не виноват, писал по памяти =)

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

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
Супер неоптимальность...
1. Зачем вообще создавать BitmapData, тем более столько раз? И...если доступна BitmapData в созданном 'Image', а она должна быть доступна, иначе все равно никак не обратиться к альфе пикселя, не проще ли сделать hitTest?
2. Я бы не использовал mask, а использовал hitArea - вложил картинку в Sprite, и создал бы кликабельную область, похожую на mask постом выше.
Код AS3:
package 
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;
 
	public class Main2 extends Sprite 
	{
		[Embed(source='../fla/sun.png')]
		private var Sun:Class;
 
		public function Main2() {
			if (stage) addedToStageListener();
			else addEventListener(Event.ADDED_TO_STAGE, addedToStageListener);
		}
 
		private function addedToStageListener(event:Event = null):void {
 
			var s:Sprite = new Sprite();
			var sun:Bitmap = new Sun() as Bitmap;
			s.addChild(sun);
			var bmd:BitmapData = sun.bitmapData;
 
			var h:Sprite = new Sprite();
			h.graphics.beginFill(0);
			var zeroPoint:Point = new Point(0, 0);
			var p:Point = new Point();
			for (var x:int = 0; x < bmd.width; x++) {
				for (var y:int = 0; y < bmd.height; y++) {
					p.x = x;
					p.y = y;
					if (bmd.hitTest(zeroPoint, 128, p)) {
						h.graphics.drawRect(x, y, 1, 1);
					}
				}
			}
			h.graphics.endFill();
			h.visible = false;
			h.mouseEnabled = false;
			s.addChild(h);
			s.hitArea = h;
			addChild(s);
			s.buttonMode = s.useHandCursor = true;
			s.addEventListener(MouseEvent.CLICK, clickListener);
		}
 
		private function clickListener(event:MouseEvent):void {
			trace(event.localX, event.localY);
		}
 
	}
}


Последний раз редактировалось zuxul; 01.02.2011 в 18:43. Причина: накидал примерчик...
Старый 01.02.2011, 20:10
krabanek вне форума Посмотреть профиль Отправить личное сообщение для krabanek Найти все сообщения от krabanek
  № 7  
Ответить с цитированием
krabanek

Регистрация: Oct 2010
Адрес: Стык Нижегородской и Мордовской областей, город Саров
Сообщений: 17
zuxul, увы, для меня, использующего другие инструменты и библиотеки интерфейсов эта функция была нужна только один раз и естественно она совершенно неудобна. Впрочем дело автора топика, какой вариант использовать, хотя твой, уверен, лучше и оптимальней.

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

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

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


 


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


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