Я пытался разработать скретч-карту в EaselJS. До сих пор мне удалось получить экземпляр Shape над растровым изображением и включить его с помощью щелчка и перетаскивания событий, поэтому изображение ниже становится видимым.Создание скретч-карты в EaselJS
Я использовал updateCache()
с compositeOperation
подходом, и это было достаточно легко, но вот мой вопрос:
Как я могу узнать, сколько пользователь уже стерта из экземпляра Shape, так что я могу настроить функцию обратного вызова, когда, например, отображается 90% изображения ниже?
Вот функционирующий пример того, что я преследует: http://codecanyon.net/item/html5-scratch-card/full_screen_preview/8721110?ref=jqueryrain&ref=jqueryrain&clickthrough_id=471288428&redirect_back=true
Это мой код до сих пор:
function Lottery(stageId) {
this.Stage_constructor(stageId);
var self = this;
var isDrawing = false;
var x, y;
this.autoClear = true;
this.enableMouseOver();
self.on("stagemousedown", startDrawing);
self.on("stagemouseup", stopDrawing);
self.on("stagemousemove", draw);
var rectWidth = self.canvas.width;
var rectHeight = self.canvas.height;
// Image
var background = new createjs.Bitmap("http://www.taxjusticeblog.org/lottery.jpg");
self.addChild(background);
// Layer above image
var overlay = new createjs.Shape();
overlay.graphics
.f("#55BB55")
.r(0, 0, rectWidth, rectHeight);
self.addChild(overlay);
overlay.cache(0, 0, self.canvas.width, self.canvas.height);
// Cursor
self.brush = new createjs.Shape();
self.brush.graphics
.f("#DD1111")
.dc(0, 0, 5);
self.brush.cache(-10, -10, 25, 25);
self.cursor = "none";
self.addChild(self.brush);
function startDrawing(evt) {
x = evt.stageX-0.001;
y = evt.stageY-0.001;
isDrawing = true;
draw(evt);
};
function stopDrawing() {
isDrawing = false;
};
function draw(evt) {
self.brush.x = self.mouseX;
self.brush.y = self.mouseY;
if (!isDrawing) {
self.update();
return;
}
overlay.graphics.clear();
// Eraser line
overlay.graphics
.ss(15, 1)
.s("rgba(30,30,30,1)")
.mt(x, y)
.lt(evt.stageX, evt.stageY);
overlay.updateCache("destination-out");
x = evt.stageX;
y = evt.stageY;
self.update();
$rootScope.$broadcast("LotteryChangeEvent");
};
}
Любые идеи?
Спасибо за очень быстрый ответ, gskinner. (: Второй подход кажется хорошей идеей, но у меня возникает вопрос: когда я «стираю» из формы с помощью опции «destination-out», являются ли точки из объекта «Shape» измененными или просто альфа-значения пикселей? (Что я действительно имею в виду, могу ли я просто реализовать анализ «cacheCanvas», как вы упомянули, без изменения процесса, который у меня уже есть, или изменить его?) – uaite
С учетом этого вы должны Хорошо бы просто проанализировать cacheCanvas, поскольку он уже есть. – gskinner
Правильно, я отдам его. Большое спасибо! – uaite