【发布时间】:2013-11-05 10:51:32
【问题描述】:
我想在我正在制作的游戏的背景上放置多个光源,这与一个光源配合使用效果很好,如下所示:
这是通过将 .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);
【问题讨论】:
-
好吧,如果你有兴趣,我还有另一个建议:看这里看结果(尤其是正确的蜡烛)jsfiddle.net/gamealchemist/ABfVj
-
很好的解决方案!我会在实际游戏中试一试,看看哪个效果最好。
-
关于您的 1 px 问题:请注意,即使恕我直言,这是一个错误,几何体的笔划是居中的,它不会被几何体尺寸所覆盖。所以当你做 ctx.arc(.,., r ,...) + ctx.stroke();你的意思可能是 ctx.arc(.,., r - ctx.lineWidth/2 , ...) + ctx.stroke();
标签: javascript canvas effects