as3で描画アプリケーションを構築していますが、ブラシのエッジがぼかしたりぼやけたりする問題があります。ブラシを描画するためにbitmapData.draw()を使用していますが、ゆっくり描画すると、エッジの周りに暗い色の領域が表示されます。
関係するすべての表示オブジェクトをcacheAsBitmap=trueに設定したり、描画の代わりにcopyPixelsを使用したり、フィルターをぼかしたり、グラデーションを塗りつぶしたりするなど、さまざまなオプションを試しました。
次のクラスは私の問題を示しています。正しく機能するがフェザーエッジのないsolid()メソッド、gradient()メソッド、filter()メソッドを含めましたが、どちらも同じ問題を示しています。また、onMove2はcopyPixels()を使用しており、同じ問題があります。
これを修正するために私にできることはありますか?!こんなに単純なものにピクセルベンダーシェーダーを使いたくありません...
package test {
import flash.display.*;
import flash.events.*;
import flash.filters.*;
import flash.geom.*;
public class Sucks extends Sprite {
private var brush:Sprite;
private var brushMap:BitmapData;
private var bmd:BitmapData;
private var radius:Number = 50;
private var color:uint = 0x990000;
public function Sucks() {
brush = new Sprite();
brushMap = new BitmapData(radius*2, radius*2, true, 0x00ffffff);
bmd = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0x0);
var bmp:Bitmap = new Bitmap(bmd, PixelSnapping.ALWAYS, true);
addChild(bmp);
//solid();
gradient();
//filter();
brushMap.draw(brush, new Matrix(1, 0, 0, 1, radius, radius));
stage.addEventListener(Event.ENTER_FRAME, onMove);
}
private function solid():void {
brush.graphics.beginFill(color, 1);
brush.graphics.drawCircle(0, 0, radius);
brush.graphics.endFill();
}
private function gradient():void {
var m:Matrix = new Matrix();
m.createGradientBox(radius*2, radius*2, 0, -radius, -radius);
brush.graphics.beginGradientFill(GradientType.RADIAL, [color, color], [1, 0], [0, 250], m);
brush.graphics.drawCircle(0, 0, radius);
brush.graphics.endFill();
}
private function filter():void {
solid();
brush.filters = [new BlurFilter(8, 8, 3)];
}
private function onMove(e:Event):void {
var mp:Matrix = new Matrix();
mp.tx = mouseX;
mp.ty = mouseY;
bmd.draw(brush, mp);
//bmd.applyFilter(bmd, new Rectangle(0, 0, stage.stageWidth, stage.stageHeight), new Point(), new BlurFilter(2, 2, 3));
}
private function onMove2(e:Event):void {
bmd.copyPixels(brushMap, new Rectangle(0, 0, radius*2, radius*2), new Point(mouseX-radius, mouseY-radius), null, null, true);
}
}
}