Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как работает BitmapData.hitTest? (http://www.flasher.ru/forum/showthread.php?t=154625)

zuxul 20.04.2011 12:59

Как работает BitmapData.hitTest?
 
Вложений: 1
Нужна формула, для определения того, как определяет hitTest непрозрачный (с пороговой альфой) пиксель.
Разница появляется на некоторых файлах с разным порогом альфы.
Код AS3:

package 
{
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.geom.Point;
        import flash.text.TextField;
 
        public class Main extends Sprite
        {
 
                [Embed(source = '../fla/sun.png')]
                private var Sun:Class;
 
                private var tf:TextField;
                private function log(text:String):void {
                        tf.appendText(text + '\n');
                }
 
                public function Main() {
 
                        tf = new TextField();
                        tf.width = tf.height = 300;
                        tf.border = true;
 
                        addChild(tf);
 
                        if (stage) addedToStageListener();
                        else addEventListener(Event.ADDED_TO_STAGE, addedToStageListener);
                }
 
                private function addedToStageListener(event:Event = null):void {
                        var pic:Bitmap = new Sun() as Bitmap;
                        var bmd:BitmapData = pic.bitmapData;
                        var i:int, j:int;
 
                        var v:Vector.<uint> = bmd.getVector(bmd.rect);
                        var k:int = 0;
                        for (j = 0; j < bmd.height; j++) {
                                for (i = 0; i < bmd.width; i++) {
                                        var thrasholdAlpha:uint = 1;
                                        var hitTest:Boolean = bmd.hitTest(new Point(), thrasholdAlpha, new Point(i, j));
                                        var hitPixel:Boolean = (v[k] >>> 24) > thrasholdAlpha;// нужна правильная формула
                                                                                              // (v[k] >>> 24) >= thrasholdAlpha) дает другой эффект
                                        if (hitTest != hitPixel) {
                                                // выводим пиксель
                                                log('hitTest:' + String(hitTest) + ', hitPixel: ' + String(hitPixel) + ', pixel: 0x' + v[k].toString(16));
                                        }
                                        k++;
                                }
                        }
                }
        }
}


goodguy 20.04.2011 13:23

По-моему здесь лучше использовать getPixel() вместо тормозного hitTest

zuxul 20.04.2011 13:32

Так я для этого и задал вопрос на форуме.
Как с помощью getPixel() (что то же самое что и getPixels и getVector) сделать то же самое, что и делает hitTest?

goodguy 20.04.2011 18:06

Цитата:

(что то же самое что и getPixels и getVector)
Не то же самое.
Цитата:

сделать то же самое, что и делает hitTest?
Например так:

Код AS3:

var pixel:uint = someImage.bitmapData.getPixel(this.x, this.y);                                                        
var alpha:uint = (pixel >> 24)  & 0xff;
 
if (alpha > 100) {
    // замеряем уровень альфа канала от 0 до 255
}



п.с. Писал по памяти, может где-то ошибся. Но думаю идея ясна

zuxul 21.04.2011 10:56

Вложений: 1
Млин...извиняюсь, Вы читаете сообщения полостью? То что Вы написали, есть в первом посту...и в данном случае getPixels и getVector то же самое...
Вообщем, hitTest как-то странно работает, вот я и хочу разобраться, что за формула у него внутри. Вот собрал демку...там проект FlashDevelop и есть готовый swf.


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

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