Я работаю над небольшим проектом HTML5 Canvas. Во время игры мне иногда нужно заставить черные пиксели нескольких спрайтов постоянно «светиться» от чистого черного до светло-серого и снова возвращаться к чистому черному (затем повторяться некоторое время).
Это происходит в несколько этапов (всего 7), так что получается что-то вроде чистого черного -> темно-серый -> серый -> и т. Д.
Ни один из пикселей спрайтов, кроме черных, не должен быть затронут.
Вот пример анимации спрайта
Вот пример того, как должно выглядеть светящееся
Это должно происходить постоянно, пока сам спрайт анимируется. Свечение происходит отдельно от таймера анимации спрайта, поэтому в любой момент у меня может быть любая комбинация рамки анимации и «цвета свечения».
Кроме того, таймер свечения одинаков для всех спрайтов, на которые он влияет. Так что, если спрайт 1 имеет свечение светло-серого цвета, значит, спрайт 2, спрайт 3 и т. Д.
Я знаю, что могу получить данные об изображении спрайта, перебрать каждый пиксель и изменить черные пиксели индивидуально на разные значения, выполнив что-то вроде этого:
var map = ctx.getImageData(sprite.x, sprite.y, sprite.width, sprite.height);
for (var p = 0; p < map.data.length; p += 4) {
if (map.data[p] === 0 && map.data[p + 1] === 0 && map.data[p + 2] === 0) {
// If black pixel, swap with glow's current color
map.data[p] = map.data[p + 1] = map.data[p + 2] = currentGlow;
}
ctx.putImageData(map, sprite.x, sprite.y);
Но меня беспокоят проблемы с производительностью, которые это может принести. Возможно, у меня одновременно может быть хорошее количество различных спрайтов с эффектом свечения (100+), и выполнение всего этого для каждого из них в отдельности в игровом цикле кажется довольно неэффективным.
Какой лучший способ сделать то, что я пытаюсь сделать?