html5水池,分享用canvas实现水流和水池动画的代码

利用Html 5的canvas标签绘制水流和水池动画

在利用HTML 5的canvas进行动画绘制之前,首先先介绍一下基本知识,包括canvas(如果对canvas比较熟悉的可以直接跳过该节)、oCanvas框架、精灵动画。在了解了以上的基本知识后,就可以开始利用canvas做动画了。

canvas标签简介

在这部分,东西比较多,比较杂,各个网站上都可以找到相关的简介,在此我就不造轮子了,菜鸟上的教程就挺不错的,另外推荐一个相当好的博文玩转html 5 canvas画图,这篇文章介绍的非常详细,推荐好好看看。

canvas框架oCanvas简介

canvas标签功能非常强大,既可以处理图片,又可以进行像素级的处理,完全可以取代浏览器端的flash,但是由于canvas发展还未完善,API还不是太全,元素的事件处理功能等还没有提供接口,在实现一些复杂功能时,尚需耗费许多精力,于是出现了许多第三方的基于canvas 的框架,这些框架相比于原生的canvas标签,有了更多简单易用的API,大大提高了我们编码的效率,在这里我选用的是oCanvas框架,相关的使用文档和demo都可以去上面的链接中查看。

精灵动画简介

精灵动画一般由一组自定义的属性值和3个子函数组成(init、advance、draw)。

三个函数的作用分别如下:

init:初始化精灵动画的属性值

advance:再画下一帧之前首先更新下一帧的状态值

draw:将advance函数中更新的状态值绘制到画布中

以上三个函数的执行顺序是:init->advance->draw->advance->draw->…..一直循环下去。下面我以一个随机产生上升气泡的例子说明一下上面的执行过程。var constructor_bubble = function (settings, core) {

return oCanvas.extend({

core: core,

shapeType: "rectangular",//下面定义了上面我们提到的三个函数:init(),advance(),draw()//在init中,我们map对象组、一个空的数组和一个代表高度的属性值

init: function () {

this.map=[

{r:2,speed:3},

{r:3,speed:3},

{r:4,speed:3},

{r:5,speed:3},

{r:6,speed:3},

{r:7,speed:3},

{r:8,speed:3},

{r:9,speed:3},

{r:10,speed:3}

]; this.points=[]; this.height=this.container.height_now;

},//下面是advance函数,在函数中我们利用if逻辑判断是否添加新的气泡以及进行气泡的位置更新,points数组利用队列的先进先出来存储气泡的

advance: function () {

this.height=this.container.height_now; if(Math.random()>0.95){ var new_point={

x:this.start.x+this.offset*2*(Math.random()-0.5),

y:this.start.y-this.map[0].r,

r:this.map[0].r

}; this.points.push(new_point);

} if(this.points.length>0){ for(var i=0;ithis.height-this.points[i].r-33){ this.points.shift();

}

}

}

},//draw函数中,利用canvas的圆弧绘制指令,将points数组中存储的气泡依次画出

draw: function () {

var canvas = this.core.canvas;

canvas.lineJoin = 'round';

canvas.lineWidth = this.GDwidth;

canvas.strokeStyle = "#fff"; if(this.points.length>0){ for(var i=0;i

canvas.beginPath();

canvas.arc(this.points[i].x,this.points[i].y,5,0,2*Math.PI);

canvas.stroke();

canvas.closePath();

}

}

}

}, settings);

};

oCanvas.registerDisplayObject("bubble", constructor_bubble, "init");//下面是在应用中定义和添加上面定义的精灵动画,其中:start数组代表了气泡的产生点,container代表了气泡的存在区域var pp1=canvas.display.bubble({

start:{x:425,y:566},

container:SC02,

width:50,

offset:1,

speed:5

}).add();

水流和水池动画实现

下面详细介绍一下,项目中如何实现水流动画和水池动画的详细步骤:

水池动画的绘制var constructor_show = function (settings, core) {

return oCanvas.extend({

core: core,

shapeType: "rectangular",//上面四行都是oCanvas框架的结构语法/*下面init()、advance()、draw()分别是上节中说的动画精灵三元素,第一个用来初始化,第二个用来

更新操作,第三个用来绘制图像/动画在管道对象中,定义了一些属性,包括:x、y、height、width、start、

height_now、full、speed、fill、trail_flag、[trail]。其中x、y分别代表水池参考点相对画布左

上角的位置,height、width是水池的宽高属性,start表征了动画是否开始,height_now代表了水池中水

位的高度,full表征了水池是否填满,speed水池上涨的速度,fill水的颜色,trail_flag表征了该水池

是否是一个标准的矩形,如果不是的话,配合trail属性,指定水池的轮廓*/

init: function () {

//默认动画关闭,水池full为0,当前高度为0

this.start=0; this.full=0; this.height_now=0;

},

advance: function () {

//如果水池未满并且是开启状态,水位未满就更新当前高度,否则将full置为1

if(this.start==1&&this.full!=1){ if (this.height_now < this.Height) { this.height_now += this.speed;

} else { this.full = 1;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的HTML5 Canvas幽灵动画代码: ```html <!DOCTYPE html> <html> <head> <title>Canvas Ghost Animation</title> <style> canvas { border: 1px solid black; margin: 20px; } </style> </head> <body> <canvas id="myCanvas" width="400" height="400"></canvas> <script> var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext("2d"); // 设置幽灵的初始位置和速度 var x = canvas.width / 2; var y = canvas.height / 2; var dx = 2; var dy = -2; // 绘制幽灵 function drawGhost() { ctx.beginPath(); ctx.arc(x, y, 20, 0, Math.PI * 2); ctx.fillStyle = "#ffffff"; ctx.fill(); ctx.closePath(); ctx.beginPath(); ctx.rect(x - 20, y, 40, 40); ctx.fillStyle = "#ffffff"; ctx.fill(); ctx.closePath(); ctx.beginPath(); ctx.arc(x, y + 40, 20, Math.PI, Math.PI * 2); ctx.fillStyle = "#ffffff"; ctx.fill(); ctx.closePath(); } // 动画循环 function animate() { // 清除画布 ctx.clearRect(0, 0, canvas.width, canvas.height); // 绘制幽灵 drawGhost(); // 更新位置 x += dx; y += dy; // 碰到边界时改变方向 if (x + dx > canvas.width - 20 || x + dx < 20) { dx = -dx; } if (y + dy > canvas.height - 20 || y + dy < 20) { dy = -dy; } } // 每隔10毫秒执行一次动画循环 setInterval(animate, 10); </script> </body> </html> ``` 在这个代码中,我们使用了HTML5的`<canvas>`标签来绘制图形。我们通过`canvas.getContext("2d")`获取到一个2D绘图上下文,然后使用绘图上下文的方法来绘制幽灵。 我们使用`setInterval`函数来循环执行动画,每隔10毫秒执行一次`animate`函数。在`animate`函数中,我们首先清除画布,然后绘制幽灵。接着更新幽灵的位置,如果碰到边界则改变方向。最后,循环执行动画直到页面关闭。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值