2012-10-24 86 views
0

我在做放大鏡效果?As3繪製位圖+鼠標左右複製像素X和鼠標Y

我有一個工作版本。然而,平板電腦的性能還不夠好。

是我迄今所做的:

我有一個enterFrame事件上的鼠標按下

所以它開始捕捉畫面時,鼠標點擊,並遵照mouseX和mouseY的

它可以工作,但它保持的唯一問題是繪製整個舞臺,而不是圍繞mouseX和mosueY繪製(300px * 300px)。有沒有一種方法可以根據你的鼠標X和鼠標Y來繪製繪製區域。我想這也有助於表現。 :)

e.target.removeEventListener(Event.ENTER_FRAME, startCapture); 

function startCapture(e:Event):void{ 
    var glassWidth:uint=80; 
    var glassHeight:int=80; 
    var curBd:BitmapData; 
    var curBmp:Bitmap; 
    var posX:int = _parentStage.mouseX - 40; 
    var posY:int = _parentStage.mouseY - 40; 

    //------------------------------------------------------------- 
    //var subArea:Rectangle = new Rectangle(0,0,500,500); 
    //var newBmp:Bitmap = new BitmapData(500,500); 
    //var cutoutBmp:Bitmap = new Bitmap(newBmp, PixelSnapping.ALWAYS, true); 
    //cutoutBmp.bitmapData.draw(jpgSource, new Matrix(1, 0, 0, 1, -357, -341) , null, null, subArea, true); 
    //------------------------------------------------------------- 

    bd = new BitmapData(1024, 768, true, 0); 
    var subArea:Rectangle = new Rectangle(_parentStage.mouseX, _parentStage.mouseY, 500, 500); 
    // bd = new BitmapData(500, 500); 
    bd.draw(_parentStage.mc_mainContainer); 
    // bd.draw(_parentStage.mc_mainContainer); 

    curBmp=new Bitmap(new BitmapData(glassWidth,glassHeight), PixelSnapping.ALWAYS); 
    curBmp.bitmapData.copyPixels(bd,new Rectangle(posX,posY,_parentStage.mouseX,_parentStage.mouseY),new Point(0,0)); 
    curBd=curBmp.bitmapData; 

    var ma:Matrix = new Matrix(1, 0, 0, 1, -40, -40); 
    glass.name = 'glass'; 
    glass.alpha = 1; 
    glass.graphics.clear(); 
    glass.graphics.beginBitmapFill(curBd, ma); 
    glass.graphics.drawCircle(0, 0, 35); 
    //glass.graphics.drawCircle(0, 0, 35); 
    glass.graphics.endFill(); 

    //var imageCircle:Bitmap = new _magGlass(); 
    //trace(_magGlass); 
    //glass.addChild(_magGlass); 

    if(!_parentStage.contains(glass))_parentStage.addChildAt(glass, _parentStage.numChildren - 2); 
    glass.x = _parentStage.mouseX; 
    glass.y = _parentStage.mouseY - 75; 
} 
+0

什麼是'bd',你爲什麼要畫'_parentStage.mc_mainContainer'呢? – 2012-10-25 01:06:53

+0

@atonparker bd是位圖和_parentStage.mc_mainContainer幾乎是舞臺 – Bruce

+0

在你的問題中,你問爲什麼它正在繪製整個舞臺,這可能是這樣做的線? – 2012-10-25 14:15:59

回答

2

如果您的性能問題來自於您在哪裏創建每個幀的新位圖和位圖數據表和矩形。相反,只需在構造函數中創建一個或兩個,或單擊然後重新使用它們。既然你已經有了一個BitmapData,你可以把它放在舞臺上並遮住它,而不是用玻璃上的圖形對象。至少選擇一種方法或另一種方法。做這兩件事都會令你失望,表現明智。

+1

同意bluebill應該將任何在每個輸入框架內不會改變的代碼移出處理程序,沒有理由重新創建所有這些對象,或者如果這些對象沒有根據時間進行實際更改,那麼將重新創建所有這些分配。如果條件和/或addChildAt可以移出,那麼這將是一個昂貴的通話。基本上在這裏做盡可能少的工作,因爲你期望它在給你的應用程序的CPU時間部分執行,並且默認情況下它會一次執行所有的代碼,每一點都是重要的。 – shaunhusain

+0

@shaunhusain謝謝隊友我會更新代碼:) – Bruce