我想在我正在制作的游戏的背景上放置多个光源,这与一个光源配合得很好,如下所示:
这是通过将 .png 图像放在其他所有内容之上来实现的,该图像对中心变得更加透明,如下所示:
适用于一个光源,但我需要另一种方法,我可以添加更多并移动光源。
我考虑过为每一帧逐个像素地绘制一个类似的“阴影层”,并根据到每个光源的距离计算透明度。但是,这可能会非常慢,我相信有更好的解决方案来解决这个问题。
这些图像只是示例,每一帧都会有更多的内容可以使用 requestAnimationFrame 移动和更新。
有没有一种重量轻且简单的方法来实现这一目标?提前致谢!
编辑
在 ViliusL 的帮助下,我想出了这个掩蔽解决方案:
// Create canvas
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
canvas.width = 300;
canvas.height = 300;
document.body.appendChild(canvas);
// Draw background
var img=document.getElementById("cat");
ctx.drawImage(img,0,0);
// Create shadow canvas
var shadowCanvas = document.createElement('canvas');
var shadowCtx = shadowCanvas.getContext('2d');
shadowCanvas.width = canvas.width;
shadowCanvas.height = canvas.height;
document.body.appendChild(shadowCanvas);
// Make it black
shadowCtx.fillStyle= '#000';
shadowCtx.fillRect(0,0,canvas.width,canvas.height);
// Turn canvas into mask
shadowCtx.globalCompositeOperation = "destination-out";
// RadialGradient as light source #1
gradient = shadowCtx.createRadialGradient(80, 150, 0, 80, 150, 50);
gradient.addColorStop(0, "rgba(255, 255, 255, 1.0)");
gradient.addColorStop(1, "rgba(255, 255, 255, .1)");
shadowCtx.fillStyle = gradient;
shadowCtx.fillRect(0, 0, canvas.width, canvas.height);
// RadialGradient as light source #2
gradient = shadowCtx.createRadialGradient(220, 150, 0, 220, 150, 50);
gradient.addColorStop(0, "rgba(255, 255, 255, 1.0)");
gradient.addColorStop(1, "rgba(255, 255, 255, .1)");
shadowCtx.fillStyle = gradient;
shadowCtx.fillRect(0, 0, canvas.width, canvas.height);