横向卷轴(side-scrolling)地图的canvas实现

标题有点小题大作了,实际上是实现一张看起来连续的运动背景图片。 效果如下:

 

实现原理:

图片1与图片2是两张首尾衔接的图片,图片1以一定速度移出canvas,图片2慢慢移进canvas,当图片1完全移出canvas范围后,立即将图片1位置重置,由于两张图片是首尾衔接的,所以看起来就像是一张无限滚动的地图。

关键代码:

复制代码
 1 var c = document.getElementById('c'),    //canvas
 2         ctx = canvas.getContext('2d'),
 3         img = new Image(),
 4         offset = 0,
 5         fps = 60,
 6         speed = 80 / fps; //每帧的速度
 7 
 8     img.src = "test.jpg";
 9 
10     function draw(ctx) {
11         ctx.save();
12         //offset < c.width ? (offset + speed) : 0
13         //后者不能简单重置为0,由于速度过快offset可能超过canvas的大小
14         //故需要计算两者的差值
15         offset = offset < c.width ? (offset + speed) : (offset - c.width);
16         //通过translate来实现图片的滚动
17         ctx.translate(-offset, 0);
18 
19         //只需将图片正常地绘制在画面上即可,不需要操作其位置
20         ctx.drawImage(img, 0, 0);
21         ctx.drawImage(img,img.width,0);
22         ctx.restore();
23     }
24     window.onload = function() {
25         (function() {
26             ctx.clearRect(0, 0, c.width, c.height);
27             draw(ctx);
28             requestAnimationFrame(arguments.callee,c);
29         })();
30     };
View Code
复制代码

 

posted @ 2016-06-01 21:07  逐影  阅读(1665)  评论(0)    收藏  举报
编辑推荐:
· C#.Net 筑基-优雅 LINQ 的查询艺术
· 一个自认为理想主义者的程序员,写了5年公众号、博客的初衷
· 大数据高并发核心场景实战,数据持久化之冷热分离
· 运维排查 | SaltStack 远程命令执行中文乱码问题
· Java线程池详解:高效并发编程的核心利器
阅读排行:
· C#.Net筑基-优雅LINQ的查询艺术
· Cursor生成UI,加一步封神
· 一个基于 .NET 8 开源免费、高性能、低占用的博客系统
· 为什么说方法的参数最好不要超过4个?
· 博客园众包平台:诚征3D影像景深延拓实时处理方案(预算8-15万)
点击右上角即可分享
微信分享提示