Html5 中的 3 层 canvas
3 layered canvas in Html5
我正在尝试创建一个简单的游戏,但我想知道如何在 canvas 中实现 3 层,就像在 photoshop 中一样。我想要背景作为背景,透明的是可以将背景反射到前景的东西,前景层是主要的animations/rendering。这将是一个很好的表现点吗?另外,这里的3层结构如何实现?
HTML
<div id ="container">
<canvas id = "canvas_background" width = "800" height = "500">
<canvas id = "canvas_trans" width = "800" height = "500">
<canvas id = "canvas_foreground" width = "800" height = "500">
</canvas>
</canvas>
</canvas>
</div>
CSS
#container {
width: 800px;
margin: 20px auto;
height: 200px;
}
#canvas_background{
border: 1px solid #666;
position: absolute;
}
#canvas_trans{
position: absolute;
background-color: transparent;
z-index: 1;
}
#canvas_foreground{
position: absolute;
}
多个canvas层绝对可以是一个good thing for performance!如果你的背景层每个场景只需要绘制一次,那么它可以让你多次重绘前景,而不必担心重绘背景会浪费时间。
但是,它们需要分层 而不是而不是嵌套。
<div id = "container" class = "container">
<canvas id = "canvas_background" width = "800" height = "500"></canvas>
<canvas id = "canvas_trans" width = "800" height = "500"></canvas>
<canvas id = "canvas_foreground" width = "800" height = "500"></canvas>
</div>
谢天谢地,这对于 CSS 来说是微不足道的。我们可以使用绝对定位并利用 DOM 元素默认透明的事实。
.container {
position: relative;
}
.container > canvas {
position: absolute;
top: 0;
left: 0;
}
这会将所有 canvas 元素设置为绝对定位在容器元素中。
您需要记住的最后一件事是要清除 canvases,您必须使用 context.clearRect
方法,以便 return canvas 改为透明,而不是用纯色填充。
我建议在您的逻辑中处理此问题:执行三个函数,资源密集度较低且更易于维护,如果您需要更多 "layers" 只需创建新函数。不要把你的 dom 搞砸了。
var drawBackground = function(){
//works with images
canvas2d.globalAlpha = 1;
//draw background elements.
};
var drawTrans = function(){
//works with images
canvas2d.globalAlpha = 0.5;
//draw Transparent elements.
};
var drawForeground = function(){
canvas2d.globalAlpha = 1;
//draw foreground elements.
};
在它们中的每一个中,您只绘制该层的项目您可以在绘制图像之前通过设置 globalAlpha 参数来设置图像的透明度。对于形状,请使用
canvas2d.fillStyle = "rgba(255, 255, 255, 0.5)";
例如。
我正在尝试创建一个简单的游戏,但我想知道如何在 canvas 中实现 3 层,就像在 photoshop 中一样。我想要背景作为背景,透明的是可以将背景反射到前景的东西,前景层是主要的animations/rendering。这将是一个很好的表现点吗?另外,这里的3层结构如何实现?
HTML
<div id ="container">
<canvas id = "canvas_background" width = "800" height = "500">
<canvas id = "canvas_trans" width = "800" height = "500">
<canvas id = "canvas_foreground" width = "800" height = "500">
</canvas>
</canvas>
</canvas>
</div>
CSS
#container {
width: 800px;
margin: 20px auto;
height: 200px;
}
#canvas_background{
border: 1px solid #666;
position: absolute;
}
#canvas_trans{
position: absolute;
background-color: transparent;
z-index: 1;
}
#canvas_foreground{
position: absolute;
}
多个canvas层绝对可以是一个good thing for performance!如果你的背景层每个场景只需要绘制一次,那么它可以让你多次重绘前景,而不必担心重绘背景会浪费时间。
但是,它们需要分层 而不是而不是嵌套。
<div id = "container" class = "container">
<canvas id = "canvas_background" width = "800" height = "500"></canvas>
<canvas id = "canvas_trans" width = "800" height = "500"></canvas>
<canvas id = "canvas_foreground" width = "800" height = "500"></canvas>
</div>
谢天谢地,这对于 CSS 来说是微不足道的。我们可以使用绝对定位并利用 DOM 元素默认透明的事实。
.container {
position: relative;
}
.container > canvas {
position: absolute;
top: 0;
left: 0;
}
这会将所有 canvas 元素设置为绝对定位在容器元素中。
您需要记住的最后一件事是要清除 canvases,您必须使用 context.clearRect
方法,以便 return canvas 改为透明,而不是用纯色填充。
我建议在您的逻辑中处理此问题:执行三个函数,资源密集度较低且更易于维护,如果您需要更多 "layers" 只需创建新函数。不要把你的 dom 搞砸了。
var drawBackground = function(){
//works with images
canvas2d.globalAlpha = 1;
//draw background elements.
};
var drawTrans = function(){
//works with images
canvas2d.globalAlpha = 0.5;
//draw Transparent elements.
};
var drawForeground = function(){
canvas2d.globalAlpha = 1;
//draw foreground elements.
};
在它们中的每一个中,您只绘制该层的项目您可以在绘制图像之前通过设置 globalAlpha 参数来设置图像的透明度。对于形状,请使用
canvas2d.fillStyle = "rgba(255, 255, 255, 0.5)";
例如。