![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jan 2011
Сообщений: 5
|
Простите если я уже не первый кто пишет подобный пост, но никак не могу в документации по AS3 найти как мне сделать такую штуку:
Есть картинка (класс Image), в нее загружена png с прозрачностью,хотелось бы чтобы когда пользователь кликает (или дропает) другую картинку поверх прозрачности этой, срабатывал соответствующий обработчик не картинки с пустым местом а той что под ней. Проще говоря надо чтобы прозрачность картинки была неактивной областью, так сказать чтобы сквозь нее кликалось и кидалось всякое. Еще раз прошу прощения если повторяюсь, помогите хотя бы ссылкой на пост об этом. Заранее большое спасибо! |
|
|||||
|
http://blog.mosessupposes.com/?p=40 - как вариант.
|
|
|||||
|
Юзайте hitTestObject
Вот с примерами http://dougmccune.com/blog/2007/02/0...nt-png-images/ |
|
|||||
|
Регистрация: Jan 2011
Сообщений: 5
|
Спасибо за примеры, они действительно помогли я разобрался как проверять относятся ли данные координаты к объекту (попали ли мы в видимуюкартинку), однако проблема в том, что если под прозрачной областью картинки лежит вторая, как передать туда событие чтобы уже она обрабатывала событие клика дропа и т.д. ???
|
|
|||||
|
Регистрация: Oct 2010
Адрес: Стык Нижегородской и Мордовской областей, город Саров
Сообщений: 17
|
Я написал функцию-обработчик которая создавала маску для картинки.
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; } } |
|
|||||
|
Супер неоптимальность...
1. Зачем вообще создавать BitmapData, тем более столько раз? И...если доступна BitmapData в созданном 'Image', а она должна быть доступна, иначе все равно никак не обратиться к альфе пикселя, не проще ли сделать hitTest? 2. Я бы не использовал mask, а использовал hitArea - вложил картинку в Sprite, и создал бы кликабельную область, похожую на mask постом выше. 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. Причина: накидал примерчик... |
|
|||||
|
Регистрация: Oct 2010
Адрес: Стык Нижегородской и Мордовской областей, город Саров
Сообщений: 17
|
zuxul, увы, для меня, использующего другие инструменты и библиотеки интерфейсов эта функция была нужна только один раз и естественно она совершенно неудобна. Впрочем дело автора топика, какой вариант использовать, хотя твой, уверен, лучше и оптимальней.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 00:01. |
|
|
« Предыдущая тема | Следующая тема » |
|
|