As3在mouseX和mouseY周围绘制位图+copyPixel
Posted
技术标签:
【中文标题】As3在mouseX和mouseY周围绘制位图+copyPixel【英文标题】:As3 draw bitmap + copyPixel around mouseX and mouseY 【发布时间】:2012-10-15 02:02:37 【问题描述】:我在做放大镜效果?
我有一个工作版本。但是在平板电脑上的表现还不够好。
到目前为止我做了什么:
我在 mouseDown 上有一个 ENTERFRAME 事件
所以当鼠标点击时它开始捕获屏幕,并跟随mouseX和mouseY
它可以工作,但唯一的问题是它一直在绘制整个舞台,而不是在 mouseX 和 mosueY 周围(300px * 300px)。有没有办法根据你的mouseX和mouseY制作绘图区域。我想这也会对性能有所帮助。 :)
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;
【问题讨论】:
什么是bd
,你为什么要画_parentStage.mc_mainContainer
?
@atonparker bd 是位图,_parentStage.mc_mainContainer 几乎是舞台
在你的问题中,你问为什么它会绘制整个舞台,这可能是那条线吗?
【参考方案1】:
您的性能问题来自于您在每一帧上创建新位图、位图数据和矩形的地方。相反,只需在构造函数中或单击时创建一两个,然后重用它们。由于您已经有一个 BitmapData,您可以将它放在舞台上并对其进行遮罩,而不是使用玻璃中的图形对象。至少选择一种方法。两者兼而有之,性能明智。
【讨论】:
同意 bluebill 应该将在每个进入帧期间不改变的任何代码移出处理程序,没有理由重新创建所有这些对象,甚至如果它们没有实际改变,则重新进行所有这些分配时间的过程。如果条件和/或 addChildAt 也可以移出,那将是一个代价高昂的调用。基本上在这里做尽可能少的工作,因为您希望它在分配给您的应用程序的 CPU 时间的一部分内执行,并且默认情况下它每 24 秒执行一次所有代码,点是每一位都很重要。跨度>以上是关于As3在mouseX和mouseY周围绘制位图+copyPixel的主要内容,如果未能解决你的问题,请参考以下文章