Недавно я решил похожую проблему и не мог придумать эффективный способ реализации ластика с векторами.Поэтому я сделал растровое изображение, чтобы стереть рисунки.Это работает так: когда пользователь выбирает цветное перо, а он удерживает левую кнопку, рисует линии для спрайта.Когда левая кнопка отпущена, спрайт сбрасывается в BitmapData, и доска перерисовывается с использованием этого растрового изображения.Когда пользователь выбирает ластик, он рисует толстые черные линии на спрайте (они невидимы при альфа = 0).После каждого перемещения затронутая часть спрайта сбрасывается в BitmapData в режиме стирания, и это отражается на доске.Для поддержки масштабирования я сделал растровое изображение большим и подключил к нему BlurFilter.Это не идеально, но работает достаточно быстро.
Редактировать: некоторый код, не проверенный после вырезки, но должен дать идею:
public class DrawingBoard extends Sprite {
//...vars declaration
public function DrawingBoard(width:int, height:int, bitmapWidth:int = 1000, bitmapHeight:int = 1000)
{
super();
scrollRect = new Rectangle(0, 0, width, height);
downMatrix = new Matrix();
downMatrix.scale(bitmapWidth / width, bitmapHeight / height);
upMatrix = new Matrix();
upMatrix.scale(width / bitmapWidth, height / bitmapHeight);
bitmap = new BitmapData(bitmapWidth, bitmapHeight, true, 0x00000000);
//on canvas we draw vector pencils and eraser traces before flush
canvas = new Sprite();
addChild(canvas);
filters = [new BlurFilter(3, 3)];
}
//external control api
public function moveTo(point:Point):void {
canvas.graphics.moveTo(point.x, point.y);
var lineWidth:Number = 4 / parent.scaleX;
canvas.graphics.lineStyle(lineWidth, currentColor, 0.8, false, LineScaleMode.NORMAL);
}
public function lineTo(point:Point):void {
canvas.graphics.lineTo(point.x, point.y);
}
public function eraserLineTo(point:Point):void {
canvas.graphics.lineStyle(eraserSize, 0, 1.0);
canvas.graphics.lineTo(point.x, point.y);
flush(BlendMode.ERASE);
canvas.graphics.moveTo(point.x, point.y);
}
public function flush(blendMode:String = null):void {
//draw temporary vectors to bitmap
bitmap.draw(canvas, downMatrix, null, blendMode, null, true);
//update board
var bounds:Rectangle = canvas.getBounds(this);
with (graphics) {
beginBitmapFill(bitmap, upMatrix);
drawRect(bounds.x, bounds.y, bounds.width, bounds.height);
endFill();
}
//erase temporary vectors
canvas.graphics.clear();
}
}