如何利用HTML5 Canvas制作键盘及鼠标动画的实例分享

在放大镜下,你可以看到每一片雪花都是一幅幅精美的图案:有的是晶莹的薄片,有的像白亮的银针,有的像一把张开的小扇,有的像夜空的星星……

键盘控制小球移动

众所周知,我们所看到的动画实际上就是一系列静态画面快速切换,从而让肉眼因视觉残像产生了「画面在活动」的视觉效果。明白了这一点后,在canvas上绘制动画效果就显得比较简单了。我们只需要将某个静态图形先清除,然后在另外一个位置重新绘制,如此反复,让静态图形按照一定的轨迹进行移动,就可以产生动画效果了。

下面,我们在canvas上绘制一个实心小球,然后用键盘上的方向键控制小球的移动,从而产生动态效果。示例代码如下:

JavaScript Code复制内容到剪贴板
  1. <!DOCTYPEhtml>
  2. <html>
  3. <head>
  4. <metacharset="UTF-8">
  5. <title>html5canvas绘制可移动的小球入门示例</title>
  6. </head>
  7. <bodyonkeydown="moveBall(event)">
  8. <!--添加canvas标签,并加上红色边框以便于在页面上查看-->
  9. <canvasid="myCanvas"width="400px"height="300px"style="border:1pxsolidred;">
  10. 您的浏览器不支持canvas标签。
  11. </canvas>
  12. <scripttype="text/javascript">
  13. //获取Canvas对象(画布)
  14. varcanvas=document.getElementById("myCanvas");
  15. //表示圆球的类
  16. functionBall(x,y,radius,speed){
  17. this.x=x||10;//圆球的x坐标,默认为10
  18. this.y=y||10;//圆球的y坐标,默认为10
  19. this.radius=radius||10;//圆球的半径,默认为10
  20. this.speed=speed||5;//圆球的移动速度,默认为5
  21. //向上移动
  22. this.moveUp=function(){
  23. this.y-=this.speed;
  24. if(this.y<this.radius){
  25. //防止超出上边界
  26. this.y=this.radius;
  27. }
  28. };
  29. //向右移动
  30. this.moveRight=function(){
  31. this.x+=this.speed;
  32. varmaxX=canvas.width-this.radius;
  33. if(this.x>maxX){
  34. //防止超出右边界
  35. this.x=maxX;
  36. }
  37. };
  38. //向左移动
  39. this.moveLeft=function(){
  40. this.x-=this.speed;
  41. if(this.x<this.radius){
  42. //防止超出左边界
  43. this.x=this.radius;
  44. }
  45. };
  46. //向下移动
  47. this.moveDown=function(){
  48. this.y+=this.speed;
  49. varmaxY=canvas.height-this.radius;
  50. if(this.y>maxY){
  51. //防止超出下边界
  52. this.y=maxY;
  53. }
  54. };
  55. }
  56. //绘制小球
  57. functiondrawBall(ball){
  58. if(typeofctx!="undefined"){
  59. ctx.beginPath();
  60. ctx.arc(ball.x,ball.y,ball.radius,0,Math.PI*2,false);
  61. ctx.fill();
  62. }
  63. }
  64. //清空canvas画布
  65. functionclearCanvas(){
  66. if(typeofctx!="undefined"){
  67. ctx.clearRect(0,0,400,300);
  68. }
  69. }
  70. varball=newBall();
  71. //简单地检测当前浏览器是否支持Canvas对象,以免在一些不支持html5的浏览器中提示语法错误
  72. if(canvas.getContext){
  73. //获取对应的CanvasRenderingContext2D对象(画笔)
  74. varctx=canvas.getContext("2d");
  75. drawBall(ball);
  76. }
  77. //onkeydown事件的回调处理函数
  78. //根据用户的按键来控制小球的移动
  79. functionmoveBall(event){
  80. switch(event.keyCode){
  81. case37://左方向键
  82. ball.moveLeft();
  83. break;
  84. case38://上方向键
  85. ball.moveUp();
  86. break;
  87. case39://右方向键
  88. ball.moveRight();
  89. break;
  90. case40://下方向键
  91. ball.moveDown();
  92. break;
  93. default://其他按键操作不响应
  94. return;
  95. }
  96. clearCanvas();//先清空画布
  97. drawBall(ball);//再绘制最新的小球
  98. }
  99. </script>
  100. </body>
  101. </html>

请使用支持html5的浏览器打开以下网页以查看实际效果(使用方向键进行移动):
使用canvas绘制可移动的小球。


小丑笑脸
只需要了解很少的几个API,然后使用需要的动画参数,就能制作出这个有趣又能响应你的动作的Web动画。
第一步,画五官

这个小丑没有耳朵和眉毛,所以只剩下三官,但它的两个眼睛我们要分别绘制,所以一共是四个部分。下面先看看代码。

绘制左眼的代码

JavaScript Code复制内容到剪贴板
  1. varleftEye=newKinetic.Line({
  2. x:150,
  3. points:[0,200,50,190,100,200,50,210],
  4. tension:0.5,
  5. closed:true,
  6. stroke:'white',
  7. strokeWidth:10
  8. });

绘制右眼的代码

JavaScript Code复制内容到剪贴板
  1. varrightEye=newKinetic.Line({
  2. x:sw-250,
  3. points:[0,200,50,190,100,200,50,210],
  4. tension:0.5,
  5. closed:true,
  6. stroke:'white',
  7. strokeWidth:10
  8. });

绘制鼻子的代码

JavaScript Code复制内容到剪贴板
  1. varnose=newKinetic.Line({
  2. points:[240,280,sw/2,300,sw-240,280],
  3. tension:0.5,
  4. closed:true,
  5. stroke:'white',
  6. strokeWidth:10
  7. });

绘制嘴巴的代码

JavaScript Code复制内容到剪贴板
  1. varmouth=newKinetic.Line({
  2. points:[150,340,sw/2,380,sw-150,340,sw/2,sh],
  3. tension:0.5,
  4. closed:true,
  5. stroke:'red',
  6. strokeWidth:10
  7. });

你会不会觉得很失望,原来就这么简单几行代码。没错,就是这么简单,相信你对自己能成为一名Web游戏动画程序员开始有信心了!

简单讲解一下上面的代码。Kinetic就是我们使用的js工具包。在页面的头部,我们需要这样引用它:

JavaScript Code复制内容到剪贴板
  1. varmouth=newKinetic.Line({
  2. points:[150,340,sw/2,380,sw-150,340,sw/2,sh],
  3. tension:0.5,
  4. closed:true,
  5. stroke:'red',
  6. strokeWidth:10
  7. });

其它几个分别是几个关键点,线条弹性,颜色,宽度等。这些都很容易理解。

第二步,让图动起来

这个动画之所以能吸引人,是因为它能响应你的鼠标动作,和用户有互动,这是一个成功的动画最关键的地方。如果你仔细观察,这个小丑五官的变化只是形状的变化,眼睛变大,嘴巴变大,鼻子变大,但特别的是这个变化不是瞬间变化,而是有过渡性的,这里面有一些算法,这就是最让人发愁的地方。幸运的是,这算法技术都非常的成熟,不需要我们来思考,在这些动画引擎库里都把这些技术封装成了非常简单方便的接口。下面我们来看看如何让动起来。

左眼的动画

JavaScript Code复制内容到剪贴板
  1. varleftEyeTween=newKinetic.Tween({
  2. node:leftEye,
  3. duration:1,
  4. easing:Kinetic.Easings.ElasticEaseOut,
  5. y:-100,
  6. points:[0,200,50,150,100,200,50,200]
  7. });

右眼的动画

JavaScript Code复制内容到剪贴板
  1. varrightEyeTween=newKinetic.Tween({
  2. node:rightEye,
  3. duration:1,
  4. easing:Kinetic.Easings.ElasticEaseOut,
  5. y:-100,
  6. points:[0,200,50,150,100,200,50,200]
  7. });

鼻子的动画

JavaScript Code复制内容到剪贴板
  1. varnoseTween=newKinetic.Tween({
  2. node:nose,
  3. duration:1,
  4. easing:Kinetic.Easings.ElasticEaseOut,
  5. y:-100,
  6. points:[220,280,sw/2,200,sw-220,280]
  7. });

嘴巴的动画

JavaScript Code复制内容到剪贴板
  1. varmouthTween=newKinetic.Tween({
  2. node:mouth,
  3. duration:1,
  4. easing:Kinetic.Easings.ElasticEaseOut,
  5. points:[100,250,sw/2,250,sw-100,250,sw/2,sh-20]
  6. });

这些代码非常的简单,而且变量名能自释其意。稍微有点经验的程序员想看懂这些代码应该不难。基本每段代码都是让你提供一些点,指定动画动作的衰退模式和持续时间。

完整的动画代码

JavaScript Code复制内容到剪贴板
  1. <!DOCTYPEHTML>
  2. <html>
  3. <head>
  4. <style>
  5. body{
  6. margin:0px;
  7. padding:0px;
  8. }
  9. #container{
  10. background-color:black;
  11. }
  12. </style>
  13. </head>
  14. <body>
  15. <divid="container"></div>
  16. <scriptsrc="/js/lib/kinetic-v5.0.1.min.js"></script>
  17. <scriptdefer="defer">
  18. varsw=578;
  19. varsh=400;
  20. varstage=newKinetic.Stage({
  21. container:'container',
  22. width:578,
  23. height:400
  24. });
  25. varlayer=newKinetic.Layer({
  26. y:-30
  27. });
  28. varleftEye=newKinetic.Line({
  29. x:150,
  30. points:[0,200,50,190,100,200,50,210],
  31. tension:0.5,
  32. closed:true,
  33. stroke:'white',
  34. strokeWidth:10
  35. });
  36. varrightEye=newKinetic.Line({
  37. x:sw-250,
  38. points:[0,200,50,190,100,200,50,210],
  39. tension:0.5,
  40. closed:true,
  41. stroke:'white',
  42. strokeWidth:10
  43. });
  44. varnose=newKinetic.Line({
  45. points:[240,280,sw/2,300,sw-240,280],
  46. tension:0.5,
  47. closed:true,
  48. stroke:'white',
  49. strokeWidth:10
  50. });
  51. varmouth=newKinetic.Line({
  52. points:[150,340,sw/2,380,sw-150,340,sw/2,sh],
  53. tension:0.5,
  54. closed:true,
  55. stroke:'red',
  56. strokeWidth:10
  57. });
  58. layer.add(leftEye)
  59. .add(rightEye)
  60. .add(nose)
  61. .add(mouth);
  62. stage.add(layer);
  63. //tweens
  64. varleftEyeTween=newKinetic.Tween({
  65. node:leftEye,
  66. duration:1,
  67. easing:Kinetic.Easings.ElasticEaseOut,
  68. y:-100,
  69. points:[0,200,50,150,100,200,50,200]
  70. });
  71. varrightEyeTween=newKinetic.Tween({
  72. node:rightEye,
  73. duration:1,
  74. easing:Kinetic.Easings.ElasticEaseOut,
  75. y:-100,
  76. points:[0,200,50,150,100,200,50,200]
  77. });
  78. varnoseTween=newKinetic.Tween({
  79. node:nose,
  80. duration:1,
  81. easing:Kinetic.Easings.ElasticEaseOut,
  82. y:-100,
  83. points:[220,280,sw/2,200,sw-220,280]
  84. });
  85. varmouthTween=newKinetic.Tween({
  86. node:mouth,
  87. duration:1,
  88. easing:Kinetic.Easings.ElasticEaseOut,
  89. points:[100,250,sw/2,250,sw-100,250,sw/2,sh-20]
  90. });
  91. stage.getContainer().addEventListener('mouseover',function(){
  92. leftEyeTween.play();
  93. rightEyeTween.play();
  94. noseTween.play();
  95. mouthTween.play();
  96. });
  97. stage.getContainer().addEventListener('mouseout',function(){
  98. leftEyeTween.reverse();
  99. rightEyeTween.reverse();
  100. noseTween.reverse();
  101. mouthTween.reverse();
  102. });
  103. </script>
  104. </body>
  105. </html>

观看演示

以上就是如何利用HTML5 Canvas制作键盘及鼠标动画的实例分享。生命苦于无常。生活困于如常。更多关于如何利用HTML5 Canvas制作键盘及鼠标动画的实例分享请关注haodaima.com其它相关文章!

您可能有感兴趣的文章
5分钟如何实现Canvas鼠标跟随动画背景

解析html5 canvas如何实现背景鼠标连线动态效果代码

canvas如何实现按住鼠标移动绘制出轨迹的示例代码

用HTML5如何实现鼠标滚轮事件放大缩小图片的功能

HTML5添加鼠标悬浮音响效果不如何使用FLASH