gpt4 book ai didi

javascript - 使位图环绕 Canvas 以实现无限滚动

转载 作者:行者123 更新时间:2023-11-30 07:25:00 27 4
gpt4 key购买 nike

我正在寻找一种将位图图像环绕在 Canvas 上以实现无限滚动效果的方法。我正在查看 EaselJS,但干净的 JavaScript 代码也足够了。

现在我将图像向左移动,当它到达某个标记时,它会自行重置。

来自 actionscript,有一个选项可以将位图的像素“包裹”到另一边,从而永远不会真正取代图像,而是将像素包裹在图像内部。这在带有 Canvas 的 javascript 中可能吗?

我当前的代码:

this.update = function() {
// super large graphic
_roadContainer.x -= 9;
if(_roadContainer.x < -291) _roadContainer.x = 0;
}

最佳答案

从一张好的风景图片开始。

enter image description here

使用 context.scale(-1,1) 水平翻转图像。

enter image description here

将翻转后的图像合并到原始图像的右侧。

enter image description here

因为我们已经完全镜像图像,所以组合图像的最左侧和最右侧完全相同。

因此,当我们平移组合图像并“用完图像”时,我们只需将组合图像的另一个副本添加到右侧,我们就可以进行无限+无缝平移。

这是代码和 fiddle :http://jsfiddle.net/m1erickson/ywDp5/

<!doctype html>
<html>
<head>
<link rel="stylesheet" type="text/css" media="all" href="css/reset.css" /> <!-- reset css -->
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>

<style>
body{ background-color: ivory; }
canvas{border:1px solid red;}
</style>

<script>
$(function(){

// thanks Paul Irish for this RAF fallback shim
window.requestAnimFrame = (function(callback) {
return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame ||
function(callback) {
window.setTimeout(callback, 1000 / 60);
};
})();


var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");

var infiniteImage;
var infiniteImageWidth;
var img=document.createElement("img");
img.onload=function(){

// use a tempCanvas to create a horizontal mirror image
// This makes the panning appear seamless when
// transitioning to a new image on the right
var tempCanvas=document.createElement("canvas");
var tempCtx=tempCanvas.getContext("2d");
tempCanvas.width=img.width*2;
tempCanvas.height=img.height;
tempCtx.drawImage(img,0,0);
tempCtx.save();
tempCtx.translate(tempCanvas.width,0);
tempCtx.scale(-1,1);
tempCtx.drawImage(img,0,0);
tempCtx.restore();
infiniteImageWidth=img.width*2;
infiniteImage=document.createElement("img");
infiniteImage.onload=function(){
pan();
}
infiniteImage.src=tempCanvas.toDataURL();
}
img.crossOrigin="anonymous";
img.src="https://dl.dropboxusercontent.com/u/139992952/stackoverflow/mountain.jpg";


var fps = 60;
var offsetLeft=0;
function pan() {

// increase the left offset
offsetLeft+=1;
if(offsetLeft>infiniteImageWidth){ offsetLeft=0; }

ctx.drawImage(infiniteImage,-offsetLeft,0);
ctx.drawImage(infiniteImage,infiniteImage.width-offsetLeft,0);

setTimeout(function() {
requestAnimFrame(pan);
}, 1000 / fps);
}

}); // end $(function(){});
</script>

</head>

<body>
<canvas id="canvas" width=500 height=143></canvas><br>
</body>
</html>

关于javascript - 使位图环绕 Canvas 以实现无限滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20263954/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com