【发布时间】:2013-11-30 13:30:13
【问题描述】:
好的,我刚刚查看了 Canvas 元素,但遇到了问题。
我发现了一个演示,它使用箭头键将三个图像相互叠加。
但是,我剪掉了其中一个,即使上面剪裁的图像移动了,下面的图像现在也没有移动。
HTML:
<canvas id="parallax-canvas">
Sorry, your browser does not support HTML5 Canvas.
</canvas>
CSS:
.parallax-canvas {
width: 400px;
height: 300px;
}
JavaScript:
$(document).ready(function() {
var w = $("#parallax-canvas").width();
var h = $("#parallax-canvas").height();
var sky = new Image();
sky.src = "assets/img/sky.jpg";
var skydx = 2;
var skyx = 0;
var mountains = new Image();
mountains.src ="assets/img/mountains.png";
var mountainsdx = 10;
var mountainsx = 0;
var jeep = new Image();
jeep.src ="assets/img/jeep.png";
var jeepx = 100;
var jeepy = 210;
var jeepsx = 0;
var jeepsxWidth = 155;
var cntx = $("#parallax-canvas")[0].getContext("2d");
setInterval(draw, 10, cntx);
$(window).keydown(function(evt) {
switch (evt.keyCode) {
case 37: // Left arrow
if ((skyx + skydx) > skydx)
skyx -= skydx;
else
skyx = w;
if ((mountainsx + mountainsdx) > mountainsdx)
mountainsx -= mountainsdx;
else
mountainsx = 398;
if (jeepsx > 0)
jeepsx -= jeepsxWidth;
else
jeepsx = (jeepsxWidth*2);
break;
case 39: // Right arrow
if ((skyx + skydx) < (w - skydx))
skyx += skydx;
else
skyx = 0;
if ((mountainsx + mountainsdx) < (w - mountainsdx))
mountainsx += mountainsdx;
else
mountainsx = 0;
if (jeepsx < (jeepsxWidth*2))
jeepsx += jeepsxWidth;
else
jeepsx = 0;
break;
}
});
function draw(_cntx) {
drawRectangle(_cntx, 0, 0, w, h);
_cntx.drawImage(sky, skyx, 0, 300, 300, 0, 0, w, 300);
_cntx.beginPath();
_cntx.moveTo(0,300);
_cntx.lineTo(150,150);
_cntx.lineTo(300, 300);
_cntx.closePath();
_cntx.clip();
_cntx.drawImage(mountains, mountainsx, 0, 300, 300, 0, 0, w, 300);
_cntx.drawImage(jeep, jeepsx, 0, jeepsxWidth, 60, jeepx, jeepy, 155, 60);
}
function drawRectangle(_cntx, x, y, w, h) {
_cntx.beginPath();
_cntx.rect(x,y,w,h);
_cntx.closePath();
_cntx.fill();
_cntx.stroke();
}
});
我添加剪辑的部分是这个部分:
function draw(_cntx) {
drawRectangle(_cntx, 0, 0, w, h);
_cntx.drawImage(sky, skyx, 0, 300, 300, 0, 0, w, 300);
_cntx.beginPath();
_cntx.moveTo(0,300);
_cntx.lineTo(150,150);
_cntx.lineTo(300, 300);
_cntx.closePath();
_cntx.clip();
_cntx.drawImage(mountains, mountainsx, 0, 300, 300, 0, 0, w, 300);
_cntx.drawImage(jeep, jeepsx, 0, jeepsxWidth, 60, jeepx, jeepy, 155, 60);
}
如果您从 beginPath 方法中删除并将其包含在 clip 方法中,它将允许三个图像全部移动。
发生了什么:按左右箭头键时天空图像不移动,山和吉普车被剪裁,但在剪裁区域内移动。
我想要发生的事情:要移动的天空图像以及剪辑区域中的山和吉普车。
还有:
我想知道如何使用箭头键移动剪切区域。我的意思是,目前有一个剪切区域,通过左右按图像移动,但剪切(剪切)区域保持静止。我想知道(如果可能的话)如何使用箭头键移动剪切区域。
正在使用的演示:http://www.ibm.com/developerworks/web/library/wa-parallaxprocessing/
不幸的是,由于图像不在网站上,因此无法设置 Fiddle,因此无法提供 URL,但 .zip 在网站上,并通过复制和粘贴其方法位于 JavaScript 文件中的代码的底部部分,即我得到了什么。
感谢您的帮助!
编辑:感谢 Ken 在缩短代码和提高效率方面的帮助。到目前为止,还没有回答我最初关于如何移动图像以及剪切位置的问题。
【问题讨论】:
-
JScript 与 JavaScript
-
不错的汤姆,原谅我现在有点累了,哈哈。
-
你能为我们设置一个小提琴吗?
-
不幸的是,我使用的演示 (ibm.com/developerworks/web/library/wa-parallaxprocessing) 在网站上实际上没有图像,因此我无法在 Fiddle 上为它们提供 URL。但是(我知道这有点问)但是在该链接的底部可以下载.zip,并通过复制和粘贴“beginPath”方法,包括我的代码底部的“clip”方法发布你可以看到我得到了什么。
-
您可以将图像上传到 imgur.com,但我提供了一个简单的答案。看看到目前为止是否对您有所帮助。
标签: javascript html canvas clip