Actionscript でスマッジ ツールを作成する方法に関するコードを探しています。私が見つけた最良のものは、こちらの古いエントリですが、他のより良いオプションが存在すると思います.
ありがとうございました。
編集:より良いスニペットが存在しないと仮定します。私が今持っているコードは次のとおりです。
import flash.events.Event;
[SWF(backgroundColor = 0xCCCCCC)]
var canvas:BitmapData = new BitmapData(400,200,true, 0xFFFFFFFF);
addChild(new Bitmap(canvas));
var loader:Loader = new Loader();
loader.load(new URLRequest("http://actionsnippet.com/wp-content/chair.jpg"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
function onComplete(evt:Event):void{
canvas.draw(loader);
}
var brush:Shape = new Shape();
var diameter:Number = 40;
var radius:Number = diameter / 2;
var matrix:Matrix = new Matrix();
var smudgeOn:Boolean = false;
var brushAlpha:BitmapData = new BitmapData(diameter, diameter, true, 0x00000000);
drawRadial();
brushAlpha.draw(brush);
var xp:Number = 0, yp:Number = 0, px:Number = 0, py:Number = 0;
var dx:Number, dy:Number;
stage.addEventListener(MouseEvent.MOUSE_DOWN, turnOnSmudge);
stage.addEventListener(MouseEvent.MOUSE_UP, turnOffSmudge);
stage.addEventListener(MouseEvent.MOUSE_MOVE, onLoop);
function onLoop(evt:Event):void {
xp = mouseX - radius;
yp = mouseY - radius;
dx = xp - px;
dy = yp - py;
if(smudgeOn){
canvas.copyPixels(canvas,
new Rectangle(px, py, diameter, diameter),
new Point(xp, yp), brushAlpha, new Point(0,0), true);
}
px = xp;
py = yp;
}
function turnOnSmudge(e:Event){
smudgeOn = true;
}
function turnOffSmudge(e:Event){
smudgeOn = false;
}
function drawRadial():void{
matrix.createGradientBox(diameter, diameter, 0, 0, 0);
with (brush.graphics){
beginGradientFill(GradientType.RADIAL, [0xFFFFFF, 0xFFFFFF], [1,0], [0, 255], matrix, SpreadMethod.PAD);
drawCircle(radius, radius, radius);
}
}
ただし、同じ場所を長時間汚すと、カーソルの下のポイントの色ではなく、その領域が黒くなります。上記のコードの制限を受けない、汚れツールを作成するためのより良いアルゴリズムはありますか?