Actionscript Получение BitmapData из события мыши Sprite - PullRequest
1 голос
/ 03 марта 2010

Я создал растровое изображение с данными и поместил его в спрайт, чтобы получать события мыши. Тем не менее, я борюсь с чтением BitmapData внутри спрайта.

function showBitmapData(e:Event):void
    {
    var bData:BitmapData = new BitmapData(video.width, video.height);
    bData.draw(video);

    var bmap:Bitmap = new Bitmap(bData);
    bmap.x = 220;
    bmap.y = 20;
    bmap.scaleX = bmap.scaleY = 2;

    canvas = new Sprite;
    addChild(canvas);
    canvas.addChild(bmap);

    //Mouse Track Pixel Colors
    canvas.addEventListener(MouseEvent.CLICK, readPixel);
    }

function readPixel(e:MouseEvent):void
    {
    var hex:uint = e.bmap.bData.getPixel32(mouseX, mouseY); // <- is the problem?
    var pixelAlpha:int = (hex >>> 0x18) & 0xff;
    var red:int = (hex >>> 0x10) & 0xff;
    var green:int = (hex >>> 0x08) & 0xff;
    var blue:int = hex & 0xff;

    colorText.text = "Red:" + red + " Green:" + green + " Blue:" + blue + " Alpha:" + pixelAlpha;
    }

Ответы [ 3 ]

1 голос
/ 04 марта 2010

Самый простой способ - сделать ваше растровое изображение свойством холста, чтобы на него можно было легко ссылаться из холста. Событие запускается из объекта canvas, поэтому e.target будет вашим холстом. Оттуда вы можете нажать на ваше растровое изображение, и свойство bitmapData вашего растрового изображения будет ссылаться на ваши растровые данные.

function showBitmapData(e:Event):void
    {
    var bData:BitmapData = new BitmapData(video.width, video.height);
    bData.draw(video);

    var bmap:Bitmap = new Bitmap(bData);
    bmap.x = 220;
    bmap.y = 20;
    bmap.scaleX = bmap.scaleY = 2;

    canvas = new MovieClip(); //sprites can't have arbitrary properites
    addChild(canvas);
    canvas.bmap = bmap; //*** Look at me! I can be referenced later!
    canvas.addChild(bmap);

    //Mouse Track Pixel Colors
    canvas.addEventListener(MouseEvent.CLICK, readPixel);
    }

function readPixel(e:MouseEvent):void
    {

    var hex:uint = e.target.bmap.bitmapData.getPixel32(mouseX, mouseY); // e.target is your "canvas" from before
    var pixelAlpha:int = (hex >>> 0x18) & 0xff;
    var red:int = (hex >>> 0x10) & 0xff;
    var green:int = (hex >>> 0x08) & 0xff;
    var blue:int = hex & 0xff;

    colorText.text = "Red:" + red + " Green:" + green + " Blue:" + blue + " Alpha:" + pixelAlpha;
    }
1 голос
/ 03 марта 2010

Вы пытаетесь прочитать поле bmap из e, которое является MouseEvent и не имеет такого поля.

Также Bitmap не имеет поля с именем bData, но bitmapData.

Один из способов получить растровое изображение из вашего спрайта - использовать цель события и использовать getObjectsUnderPoint , чтобы получить растровое изображение (в случае, если в вашем спрайте имеется несколько растровых изображений)

Также не забудьте взять координаты мыши с карты, иначе вам придется поиграть с преобразованием точек, используя globalToLocal и LocalToGlobal

// function to get the bitmap from a display object container
// using the mouse coordinate
function findBitmap(container:DisplayObjectContainer):Bitmap {
 if (container === null)
   return null;

 var childs:Array = container.getObjectsUnderPoint(
    new Point(container.mouseX, container.mouseY)
 );

 while (childs.length > 0) {
   var ret:Bitmap = childs.pop() as Bitmap;
   if (ret !== null)
     return ret;
 }

 return null;
}

// ....
canvas = new Sprite;
addChild(canvas);
canvas.addChild(bmap);
//Mouse Track Pixel Colors
canvas.addEventListener(MouseEvent.CLICK, readPixel);
// ...

function readPixel(e:MouseEvent):void {
    // found the bitmap from the currentTarget
    var bmap:Bitmap=findBitmap(e.currentTarget as DisplayObjectContainer);

    var hex:uint=0;

    if (bmap!==null) {
     hex = bmap.bitmapData.getPixel32(bmap.mouseX, bmap.mouseY); 
    }

    var pixelAlpha:int = (hex >>> 0x18) & 0xff;
    var red:int = (hex >>> 0x10) & 0xff;
    var green:int = (hex >>> 0x08) & 0xff;
    var blue:int = hex & 0xff;

    colorText.text =
         "Red:" + red + " Green:" + green + " Blue:" + blue + " Alpha:" + pixelAlpha;
    }
0 голосов
/ 03 марта 2010

Проблема в том, что "e" - это событие, которое не имеет свойства bmap. У него будет целевое свойство, но это будет диспетчер событий, в данном случае ваш холст.

Я бы предложил:

Создайте собственный класс, который расширяет спрайт и содержит ваше растровое изображение. Создайте экземпляр этого класса и добавьте его на сцену. Добавьте слушателя событий к этому объекту вместо сцены. В вашем слушателе событий проверьте, что event.target является экземпляром вашего пользовательского класса. Если это так, вы можете использовать localX и localY события, чтобы получить значение в пикселях свойства объекта bitmap.

...