1

データを含むビットマップを作成し、それをスプライトに配置して、マウス イベントを受け取りました。ただし、スプライト内の 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;
    }
4

3 に答える 3

1

あなたは誰bmapからフィールドを読み込もうとしていて、そのようなフィールドを持っていません。eMouseEvent

また、BitmapにはbDataという名前のフィールドはありませんがbitmapData

スプライトからビットマップを取得する1つの方法は、イベントのターゲットを使用し、getObjectsUnderPointを使用してビットマップを取得することです(スプライトに複数のビットマップがある場合)

また、bmapからマウス座標を取得することを忘れないでください。そうしないと、globalToLocalLocalToGlobalを使用してポイント変換を試す必要があります。

// 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;
    }
于 2010-03-03T13:06:15.993 に答える
1

最も簡単な方法は、ビットマップをキャンバスのプロパティにして、キャンバスから簡単に参照できるようにすることです。イベントはキャンバス オブジェクトから発生するため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;
    }
于 2010-03-03T23:01:01.117 に答える
0

問題は、「e」がbmapプロパティを持たないイベントであるということです。ターゲットプロパティがありますが、それはイベントディスパッチャ、この場合はキャンバスになります。

私は提案します:

スプライトを拡張し、ビットマップを含むカスタムクラスを作成します。そのクラスのインスタンスを作成し、ステージに追加します。ステージではなく、そのオブジェクトにイベントリスナーを追加します。イベントリスナーで、event.targetがカスタムクラスのインスタンスであることを確認します。その場合は、イベントのlocalXとlocalYを使用して、オブジェクトのビットマッププロパティのピクセル値を取得できます。

于 2010-03-03T13:08:27.377 に答える