AS3

2008-09-17 26 views
10

'da bir farenin tıklatıldığı rengi elde etmenin en iyi yolu Bir görüntüüm (mx) var ve tıklatılan pikselin uyandırmasını yapmak istiyorum.AS3

Herhangi bir fikrin var mı?

cevap

8

İşte daha basit uygulama görebilirsiniz: -

İşte (YMMV mxmlc kullanarak) benim için çalıştı BitmapData sayfasında verilen Örnek bir değişiklik var. Yapmanız gereken tek şey, draw() bitmapData yöntemini kullanarak sahnenin anlık görüntüsünü almaktır, ardından farenin altındaki pikselde getPixel() kullanın. Bunun avantajı, sadece belirli bir bitmap için değil, sahneye çizilen her şeyi örneklemenizdir.

import flash.display.Bitmap; 
import flash.display.BitmapData; 
import flash.events.*; 

stage.addEventListener(MouseEvent.CLICK, getColorSample); 

function getColorSample(e:MouseEvent):void { 
    var bd:BitmapData = new BitmapData(stage.width, stage.height); 
    bd.draw(stage); 
    var b:Bitmap = new Bitmap(bd); 
    trace(b.bitmapData.getPixel(stage.mouseX,stage.mouseX)); 
} 

Umut Bu yardımcı olur!


Düzenleme:

Düzenlenen tek BitmapData kullanır ve bir Bitmap oluşturma gereksiz aşamasını ortadan kaldırır. Renkleri MOUSE_MOVE'dan örnekliyorsanız, bu, bellek sorunlarını önlemek için önemlidir.

Not: Özel bir imleç hareketli grafiğini kullanıyorsanız, 'durum' dışında bir nesneyi kullanmanız gerekir, aksi takdirde altında ne yazdığı yerine özel hareketli grafiğin rengini örnekleyebilirsiniz.

import flash.display.Bitmap; 
import flash.display.BitmapData; 
import flash.events.*; 

private var _stageBitmap:BitmapData; 

stage.addEventListener(MouseEvent.CLICK, getColorSample); 

function getColorSample(e:MouseEvent):void 
{ 
    if (_stageBitmap == null) { 
     _stageBitmap = new BitmapData(stage.width, stage.height); 
    } 
    _stageBitmap.draw(stage); 

    var rgb:uint = _stageBitmap.getPixel(stage.mouseX,stage.mouseY); 

    var red:int = (rgb >> 16 & 0xff); 
    var green:int = (rgb >> 8 & 0xff); 
    var blue:int = (rgb & 0xff); 

    trace(red + "," + green + "," + blue); 
} 
+0

ÖLDÜRECEK YAŞIYORUM !!!!!!!!!!! Neden olduğunu herkes anlayabiliyor .... ;-) İpucu: Kullanmadan önce her zaman çift geçişli çıkış kodunu kontrol edin :-) –

+0

x'inizi yakaladığınızdan emin olmak için iyi bir kontrol için bazı basit sınırlar atacağım. ve y sahne alanının dışında. –

+1

Sadece bir piksel değerini almak için tüm sahneyi çizmeniz gerekmez. BitmapData 1x1'i yapın ve bu çizim çağrısına matris ve clipRect iletin. – darscan

10

BitmapData LiveDoc Page'un birkaç dakikasında, gitmeniz gereken yere götüreceksiniz. Resminizi bir Bitmap değişkenine yükledikten sonra, BitmapData özelliğine erişebilirsiniz. Görüntüye bir Dinleyici ekleyin ve BitmapData::getPixel kullanın. GetPixel örneği, uint yanıtının bir rgb hex koduna nasıl dönüştürüleceğini gösterir.

package { 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
    import flash.display.Loader; 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 
    import flash.net.URLRequest; 

    public class BitmapDataExample extends Sprite { 
     private var url:String = "santa-drunk1.jpg"; 
     private var size:uint = 200; 
     private var image:Bitmap; 

     public function BitmapDataExample() { 
      configureAssets(); 
     } 

     private function configureAssets():void { 
      var loader:Loader = new Loader(); 
      loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler); 

      var request:URLRequest = new URLRequest(url); 
      loader.load(request); 
      addChild(loader); 
     } 

     private function completeHandler(event:Event):void { 
      var loader:Loader = Loader(event.target.loader); 
      this.image = Bitmap(loader.content); 

      this.addEventListener(MouseEvent.CLICK, this.clickListener); 
     } 

     private function clickListener(event:MouseEvent):void { 
      var pixelValue:uint = this.image.bitmapData.getPixel(event.localX, event.localY) 
      trace(pixelValue.toString(16)); 
     } 
    } 
} 
8

Bu Flex veya mx özgü değildir: Görüntü ve herhangi bitmap çekilebilir nesneden piksel renk değeri (izniniz olması koşuluyla) kapmak sağlar:

private const bitmapData:BitmapData = new BitmapData(1, 1); 
private const matrix:Matrix = new Matrix(); 
private const clipRect:Rectangle = new Rectangle(0, 0, 1, 1); 

public function getColor(drawable:IBitmapDrawable, x:Number, y:Number):uint 
{ 
    matrix.setTo(1, 0, 0, 1, -x, -y) 
    bitmapData.draw(drawable, matrix, null, null, clipRect); 
    return bitmapData.getPixel(0, 0); 
} 

Kolayca kapmak sahneden bir piksel veya mx: Image örneği. Tüm aşamayı (veya çekilebilir nesneyi) çizmekten çok daha verimlidir ve anlık görsel geri bildirim için MouseEvent.MOUSE_MOVE'a bağlanacak kadar hızlı olmalıdır.

+1

IMO, bu, tüm sahneyi çizmediği ve daha kesin bir şekilde soruya cevap vermemesi nedeniyle kesinlikle üstün bir cevaptır. – Allar