Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   rollover картинка png (http://www.flasher.ru/forum/showthread.php?t=123823)

incvizitor 10.04.2009 22:06

rollover картинка png
 
у меня есть картинка png. Некоторые её области прозрачны. Создаю клип buttonmode делаю true и заганяю в него png. Как сделать чтобы мышь меняла курсор только в видимой зоне???

serenkiy 10.04.2009 22:28

Вам поможет метод getPixel32 у BitmapData картинки. Считываете пиксель под курсором, смотрите на его alpha-компонент (прозрачность).

silin 10.04.2009 23:56

http://blog.mosessupposes.com/?p=40

incvizitor 11.04.2009 02:42

короче говоря написал я функцию

Код AS3:

private function createMask(img)
{
        var mask_sp=new Sprite();
        mask_sp.graphics.lineStyle(1,0x000000,0);
 
        var myData=img.bitmapData;
 
        for(var i=0; i<myData.width; i++)
        {
                for(var j=0; j<myData.height; j++)
                {
                        var pix=myData.getPixel32(i,j);
                        if((pix & 0x000000ff)>0)
                        {
                                mask_sp.graphics.moveTo(i,j);
                                mask_sp.graphics.lineTo(i+1,j);
                        }
                }
        }
 
        addChild(mask_sp);
        //mask_sp.buttonMode=true;
        mask_sp.addEventListener(MouseEvent.ROLL_OVER,handleMouseEvent)
}
 
private function handleMouseEvent(e:MouseEvent)
{
        dispatchEvent(new MouseEvent(e.type));
        //trace(1);
}

То есть. Я создал прозрачный спрайт который формой в точности повторяет мой клип. Так же как вы видите, если я навожу на спрайт мышкой, то это оповещается как событие всего класса. Но ведь оно оповещается и когда я навожу мышкой на битмап (то есть и на прозрачную область тоже)... Можно ли вырубить оповещение в этом случае???

serenkiy 11.04.2009 04:12

Попробуйте вместо
Код AS3:

pix & 0x000000ff

написать
Код AS3:

(pix & 0xff000000) >> 24

изменить ф-цию handleMouseEvent:
Код AS3:

private function handleMouseEvent(e:MouseEvent)
{
    if((e.target as Sprite).hitTestPoint(e.localX,e.localY,true)) {
        dispatchEvent(new MouseEvent(e.type));
        //trace(1);
    }
}


incvizitor 11.04.2009 12:57

Цитата:

Сообщение от serenkiy (Сообщение 812471)

Код AS3:

(pix & 0xff000000) >> 24


Так я узнаю канал RED, зачем он мне? спрайт создаётся нармально, и функция тоже оповещает событие когда надо.

Только вот класс Sprite оповещает событие и сам по себе. То есть если бы я даже не написал функцию handleMouseEvent, так вот можно ли отключить этот стандартный оповеститель???

Теоретически можно былобы написать свой класс расщиряющий MouseEvent. Но может быть и без этого получится:quiet:

serenkiy 11.04.2009 14:16

Цитата:

Сообщение от incvizitor (Сообщение 812495)
Так я узнаю канал RED, зачем он мне?...

Так Вы узнаете канал Alpha. Ф-ция getPixel32 возвращает значение цвета ARGB, а не RGBA.

Добавлено через 40 минут
Вообще, без всяких ухищрений, можно сделать так: ваш прозрачный Bitmap помещаете в контейнер (Sprite), на контейнер вешаете листенер:
Код AS3:

container.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler);

ну и разумеется описание приемника:
Код AS3:

private function mouseMoveHandler(e:MouseEvent):void {
        if (((yourBitmap.bitmapData.getPixel32(e.localX, e.localY) & 0xFF000000) >> 24) != 0x00)
        trace ("Непрозрачная область");
        else trace("Прозрачная область");
}


incvizitor 11.04.2009 15:53

Да но в таком случае эту функцию надо будет переписывать каждый раз... Я вот так сделал.

Код AS3:

private function createMask(img)
{
        mask_sp=new Sprite();
 
        var myData=img.bitmapData;
 
        for(var i=0; i<myData.width; i++)
        {
                for(var j=0; j<myData.height; j++)
                {
                        var pix=myData.getPixel32(i,j);
                        if((uint(pix & 0xff000000) >>> 24 ) > 0)
                        {
                                with(mask_sp.graphics)
                                {
                                        beginFill(0x000000);
                                        drawRect(i,j,1,1);
                                        endFill();
                                }                                       
                        }
                }
        }
 
        addChild(mask_sp);
        img.mask=mask_sp;       
}

поесню код:

Насчет ARGB ты был прав, только в этом случае надо результат операции
"pix & 0xff000000" надо трасформировать в uint, так как в обычном int если первая цифра это 1, значит номер отрицательный. Также для шифта надо использовать оператор ">>>", так как ">>" тоже может превратить загнать ваш номер в минис.

Что бы не мучаться с деспетчерами, прото наложил маску на PNG. Раньше компилятор её не распознавал, так как она была нарисована линиями. Но сечас, так как она нарисова квадратами она распознается. Короче работает, всем спасибо за помощь :)


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

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