Я создаю мобильную веб-игру, которая позволяет пользователю пронести по экрану, чтобы очистить его. Я пытаюсь написать умную функцию, которая обнаруживает, когда почти весь холст прозрачен.canvas getImageData возвращает слишком много пикселей
У меня есть интервал, который вызывает функцию ниже каждой секунды, чтобы выполнить проверку. То, как это должно работать, заключается в том, что я беру сектор холста шириной 20 пикселей и высок, как холст.
Эта функция должна работать довольно гладко, но по какой-либо причине функция getImageData возвращается к множеству пикселей. Мой сектор всегда имеет ширину 20 пикселей и имеет одинаковую высоту, поэтому он должен возвращать одинаковое количество пикселей каждый раз. Конечно, поскольку getImageData возвращает большее и большее число, мой цикл становится медленнее и медленнее.
Кто-нибудь знает, что вызывает это? Я неправильно понял функцию getImageData так, как она работает?
isCanvasTransparent: function (fromX, toX, currentIteration) {
if(currentIteration < this.clearedIterations) { // If a sector is already clear, we dont need to check it again
this.isCanvasTransparent(fromX + 20, toX + 20, currentIteration + 1);
return;
} else {
var data = this.context.getImageData(fromX, 0, toX, parseInt(this.canvas.style.width)).data;
var counter = 0;
var i = 0;
// For some reason, the length increases, but the diff between fromX and toX is always 20
console.log(data.length);
for(i=0;i<(data.length);i+=4) {
if(data[i+3]!==0){
counter++;
// I stop iterating, since there are too many non transparent pixels
if(counter > 10) {
break;
}
}
}
// I accept that 10 pixels in each sector is not transparent
if((counter < 10) && !this.alerted) {
this.clearedIterations++; // Here we increase clearedIterations, since this sector is clear
// There are no more iterations, so we are done
if(currentIteration === this.maxIterations) {
// this is the interval that calls isCanvasTransparent(0, 20, 0)
// in the first place. The interval is called each second. But as soon the whole view
// is transparent, we clear it, so that isCanvasTransparent is no longer called
clearInterval(this.checkCanvasTimeout);
this.alerted = true;
TouchHelpers.removeTouchEvents();
this.levelCompleted();
return;
} else {
// this sector is clear, but we need to check the next one, since we are not at the end
this.isCanvasTransparent(fromX + 20, toX + 20, currentIteration + 1);
}
}
}
},
Извините, если я был неясен. Я попытался объяснить это в коде clearinterval, который вы там видите. Но в любом случае способ, которым я изначально называл функцию, - с этим параметром (0,0, 20, <высота холста>). Затем он рекурсивно перемещает 20 пикселей вправо в следующий раз. Итак, второй раз (20, 0, 40, <высота холста>) вызывается. – funkyfly
Есть проблема ... Ваш второй вызов s/b (20,0,20, canvas.height) - аргумент 3-й ширины должен оставаться на 20, а не увеличиваться до 40. Приветствия! – markE
Ахх ... ты абсолютно прав! Теперь моя функция работает очень гладко. Я не могу поблагодарить вас за это! Действительно ценю это! :) – funkyfly