键盘控制小球移动

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

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

JavaScript Code复制内容到剪贴板

html>

html5 canvas绘制可移动的小球入门示例

您的浏览器不支持canvas标签。

//获取Canvas对象(画布)

varcanvas = document.getElementById("myCanvas");

//表示圆球的类

functionBall(x, y ,radius, speed){

this.x = x || 10;//圆球的x坐标,默认为10

this.y = y || 10;//圆球的y坐标,默认为10

this.radius = radius || 10;//圆球的半径,默认为10

this.speed = speed || 5;//圆球的移动速度,默认为5

//向上移动

this.moveUp =function(){

this.y -=this.speed;

if(this.y

//防止超出上边界

this.y =this.radius;

}

};

//向右移动

this.moveRight =function(){

this.x +=this.speed;

varmaxX = canvas.width -this.radius;

if(this.x > maxX){

//防止超出右边界

this.x = maxX;

}

};

//向左移动

this.moveLeft =function(){

this.x -=this.speed;

if(this.x

//防止超出左边界

this.x =this.radius;

}

};

//向下移动

this.moveDown =function(){

this.y +=this.speed;

varmaxY = canvas.height -this.radius;

if(this.y > maxY){

//防止超出下边界

this.y = maxY;

}

};

}

//绘制小球

functiondrawBall(ball){

if(typeofctx !="undefined"){

ctx.beginPath();

ctx.arc(ball.x, ball.y, ball.radius, 0, Math.PI * 2,false);

ctx.fill();

}

}

//清空canvas画布

functionclearCanvas(){

if(typeofctx !="undefined"){

ctx.clearRect(0, 0, 400, 300);

}

}

varball =newBall();

//简单地检测当前浏览器是否支持Canvas对象,以免在一些不支持html5的浏览器中提示语法错误

if(canvas.getContext){

//获取对应的CanvasRenderingContext2D对象(画笔)

varctx = canvas.getContext("2d");

drawBall(ball);

}

//onkeydown事件的回调处理函数

//根据用户的按键来控制小球的移动

functionmoveBall(event){

switch(event.keyCode){

case37://左方向键

ball.moveLeft();

break;

case38://上方向键

ball.moveUp();

break;

case39://右方向键

ball.moveRight();

break;

case40://下方向键

ball.moveDown();

break;

default://其他按键操作不响应

return;

}

clearCanvas();//先清空画布

drawBall(ball);//再绘制最新的小球

}

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

使用canvas绘制可移动的小球。

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

第一步,画五官

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

绘制左眼的代码

JavaScript Code复制内容到剪贴板

varleftEye =newKinetic.Line({

x: 150,

points: [0, 200, 50, 190, 100, 200, 50, 210],

tension: 0.5,

closed:true,

stroke:'white',

strokeWidth: 10

});

绘制右眼的代码

JavaScript Code复制内容到剪贴板

varrightEye =newKinetic.Line({

x: sw - 250,

points: [0, 200, 50, 190, 100, 200, 50, 210],

tension: 0.5,

closed:true,

stroke:'white',

strokeWidth: 10

});

绘制鼻子的代码

JavaScript Code复制内容到剪贴板

varnose =newKinetic.Line({

points: [240, 280, sw/2, 300, sw-240,280],

tension: 0.5,

closed:true,

stroke:'white',

strokeWidth: 10

});

绘制嘴巴的代码

JavaScript Code复制内容到剪贴板

varmouth =newKinetic.Line({

points: [150, 340, sw/2, 380, sw - 150, 340, sw/2, sh],

tension: 0.5,

closed:true,

stroke:'red',

strokeWidth: 10

});

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

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

JavaScript Code复制内容到剪贴板

varmouth =newKinetic.Line({

points: [150, 340, sw/2, 380, sw - 150, 340, sw/2, sh],

tension: 0.5,

closed:true,

stroke:'red',

strokeWidth: 10

});

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

第二步,让图动起来

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

左眼的动画

JavaScript Code复制内容到剪贴板

varleftEyeTween =newKinetic.Tween({

node: leftEye,

duration: 1,

easing: Kinetic.Easings.ElasticEaseOut,

y: -100,

points: [0, 200, 50, 150, 100, 200, 50, 200]

});

右眼的动画

JavaScript Code复制内容到剪贴板

varrightEyeTween =newKinetic.Tween({

node: rightEye,

duration: 1,

easing: Kinetic.Easings.ElasticEaseOut,

y: -100,

points: [0, 200, 50, 150, 100, 200, 50, 200]

});

鼻子的动画

JavaScript Code复制内容到剪贴板

varnoseTween =newKinetic.Tween({

node: nose,

duration: 1,

easing: Kinetic.Easings.ElasticEaseOut,

y: -100,

points: [220, 280, sw/2, 200, sw-220,280]

});

嘴巴的动画

JavaScript Code复制内容到剪贴板

varmouthTween =newKinetic.Tween({

node: mouth,

duration: 1,

easing: Kinetic.Easings.ElasticEaseOut,

points: [100, 250, sw/2, 250, sw - 100, 250, sw/2, sh-20]

});

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

完整的动画代码

JavaScript Code复制内容到剪贴板

HTML>

body {

margin: 0px;

padding: 0px;

}

#container {

background-color: black;

}

varsw = 578;

varsh = 400;

varstage =newKinetic.Stage({

container:'container',

width: 578,

height: 400

});

varlayer =newKinetic.Layer({

y: -30

});

varleftEye =newKinetic.Line({

x: 150,

points: [0, 200, 50, 190, 100, 200, 50, 210],

tension: 0.5,

closed:true,

stroke:'white',

strokeWidth: 10

});

varrightEye =newKinetic.Line({

x: sw - 250,

points: [0, 200, 50, 190, 100, 200, 50, 210],

tension: 0.5,

closed:true,

stroke:'white',

strokeWidth: 10

});

varnose =newKinetic.Line({

points: [240, 280, sw/2, 300, sw-240,280],

tension: 0.5,

closed:true,

stroke:'white',

strokeWidth: 10

});

varmouth =newKinetic.Line({

points: [150, 340, sw/2, 380, sw - 150, 340, sw/2, sh],

tension: 0.5,

closed:true,

stroke:'red',

strokeWidth: 10

});

layer.add(leftEye)

.add(rightEye)

.add(nose)

.add(mouth);

stage.add(layer);

// tweens

varleftEyeTween =newKinetic.Tween({

node: leftEye,

duration: 1,

easing: Kinetic.Easings.ElasticEaseOut,

y: -100,

points: [0, 200, 50, 150, 100, 200, 50, 200]

});

varrightEyeTween =newKinetic.Tween({

node: rightEye,

duration: 1,

easing: Kinetic.Easings.ElasticEaseOut,

y: -100,

points: [0, 200, 50, 150, 100, 200, 50, 200]

});

varnoseTween =newKinetic.Tween({

node: nose,

duration: 1,

easing: Kinetic.Easings.ElasticEaseOut,

y: -100,

points: [220, 280, sw/2, 200, sw-220,280]

});

varmouthTween =newKinetic.Tween({

node: mouth,

duration: 1,

easing: Kinetic.Easings.ElasticEaseOut,

points: [100, 250, sw/2, 250, sw - 100, 250, sw/2, sh-20]

});

stage.getContainer().addEventListener('mouseover',function() {

leftEyeTween.play();

rightEyeTween.play();

noseTween.play();

mouthTween.play();

});

stage.getContainer().addEventListener('mouseout',function() {

leftEyeTween.reverse();

rightEyeTween.reverse();

noseTween.reverse();

mouthTween.reverse();

});

观看演示

html5教程鼠标,利用HTML5 Canvas制作键盘及鼠标动画的实例分享相关推荐

  1. 使用html制作圆弧正方形,JavaScript+html5 canvas制作的圆中圆效果实例

    本文实例讲述了JavaScript+html5 canvas制作的圆中圆效果.分享给大家供大家参考,具体如下: 运行效果截图如下: 具体代码如下: demo #canvas { background: ...

  2. 台式计算机鼠标不动,台式电脑鼠标不动了怎么办 鼠标不动了怎么用键盘修复 鼠标不亮了也动不了了怎么办...

    鼠标是我们控制电脑的主要途径,特别是对于台式电脑来说,如果鼠标动不了,就什么都不能做了.那么台式电脑鼠标不动了怎么办?今天小编就为大家排忧解难,说说鼠标不动了怎么用键盘修复,以及鼠标不亮了也动不了了怎 ...

  3. 3dmax:3dmax经典案例详细步骤图文教程之粒子阵列粒子系统制作星球爆炸特效动画效果

    3dmax:3dmax经典案例详细步骤图文教程之粒子阵列粒子系统制作星球爆炸特效动画效果 目录 3dmax经典案例详细步骤图文教程之粒子阵列粒子系统制作星球爆炸特效动画效果

  4. 刮刮乐html5效果擦除,利用HTML5的画布Canvas实现刮刮卡效果

    先给大家展示效果: 你玩过刮刮卡么?一不小心可以中奖的那种.今天我给大家分享一个基于HTML5技术实现的刮刮卡效果,在PC上只需按住鼠标,在手机上你只需按住指头,轻轻刮去图层就可以模拟真实的刮奖效果. ...

  5. html5绘制草,利用html5实现canvas海底水草动画特效

    特效描述:利用html5实现 canvas海底水草动画特效.利用html5实现canvas海底水草动画特效 代码结构 1. HTML代码 var canvas, ctx, width, height, ...

  6. html5 红包页面,利用HTML5实现手机触屏接红包代码

    特效描述:利用HTML5实现 手机触屏 接红包代码.利用HTML5实现手机触屏接红包代码 代码结构 1. 引入CSS 2. 引入JS 3. HTML代码 function set_meta() { v ...

  7. html5手电筒样式,利用HTML5实现SVG模拟手电筒照明特效

    特效描述:利用HTML5实现 SVG 模拟手电筒 照明特效.利用HTML5%20实现SVG模拟手电筒照明特效 代码结构 1. HTML代码 xmlns="http://www.w3.org/ ...

  8. 利用html5页面表白,利用HTML5实现七夕情人节表白代码

    特效描述:利用HTML5实现七夕情人节表白代码.利用HTML5实现七夕情人节表白代码 代码结构 1. 引入CSS 2. 引入JS 3. HTML代码 Th an ks for w atch ing! ...

  9. PS教程之利用像素化来制作一个乐高积木的创意海报

    我们利用像素化来制作一个乐高积木的创意海报,我们选了一张蒙娜丽莎的照片.用这个照片来完成我们的像素化讲解. 1. 打开PS,把素材拖进PS中,选择滤镜-像素化-马赛克.在弹出的对话框中设置数值为100 ...

最新文章

  1. C# C++ Java
  2. 如何发表cscd核心论文_新手如何发表论文
  3. nethogs 查看 Linux 进程的网络使用
  4. 仿LordPE获取PE结构
  5. Java 强、弱、软、虚,你属于哪一种?
  6. mysql大表myisam的导入
  7. java sunjce,无法初始化类javax.crypto.SunJCE_b
  8. Anaconda简介:它是什么,以及如何安装
  9. 高级考题_理论干货最最直观的词云分布,带你一次看清天大考题端倪!
  10. eclipse没有advanced按钮_Eclipse快捷键 + 自动提示不显示问题
  11. com.alibaba.fastjson.JSONException: can‘t create non-static inner class inst
  12. 快速排序C++方法(3种)
  13. oracle增量备份level0,Oracle备份类型level0、level1,增量、差异备份
  14. win10下如何安装.NetFrame3.5框架
  15. pip不是内部 pycharm_解决'pip' 不是内部或外部命令,也不是可运行的程序或批处理文件的问题...
  16. 【MMDetection3D】环境搭建,使用PointPillers训练测试可视化KITTI数据集
  17. 二叉树的前序遍历,中序遍历,后序遍历
  18. arp断网攻击解决办法
  19. Echarts-水球图笔记
  20. 保姆级redis6全流程学习和redis秒杀全流程

热门文章

  1. 在职读研是一条困难但正确的路——中国人民大学与加拿大女王大学金融硕士
  2. 汽车限速器单片机c语言程序,以MSP430单片机为核心的电子汽车限速器的设计方案...
  3. Android 手机控制台灯开关详细教程-智能台灯
  4. PTA 函数题 求二叉树高度(C语言)
  5. MySQL使用profile分析语句性能消耗
  6. 抖音直播画中画、绿幕抠图直播,如此简单
  7. 30万行数据,Python 分析科比二十年职业生涯 | 原力计划
  8. 好教程推荐系列:力扣LeetCode官网/labuladong的算法小抄/漫画算法小灰/刷题模板
  9. 原来报表与统计图要这么做~
  10. 欧姆龙PLC码垛程序 电机:四个雷塞闭环步进电机,四个汇川伺服电机,总共八个电机。 PLC:CP1H-EX40DT-D,八个轴就用了两个PLC,还有跟上位机通讯