html5 游戏 动画设计,HTML5 Canvas 动画实例

原标题:HTML5 Canvas 动画实例

在开发在线游戏时,绘制动画是非常重要的。本节介绍一个使用 Canvas API 实现的动画实例——游戏人物的跑步动画。

动画的概念及原理

1.动画

动画是通过一幅幅静止的,内容不同的画面(即帧)快速播放使人们在视觉上产生运动的感觉。这是利用了人类眼睛的视觉暂留原理。利用人的这种生理特性可制作出具有高度想象力和表现力的动画影片。

2.原理

人们在看画面时,画面会在大脑视觉神经中停留大约 1/24 秒,如果每秒更替 24 个画面或更多,那么前一个画面还没在人脑中消失之前,下一个画面进入人脑,人们就会觉得画面动起来了,它的基本原理与电影、电视一样,都是视觉原理。

在计算机上要实现动画效果,除了绘图外,还需要解决下面两个问题:

(1)定期绘图,也就是每隔一段时间就调用绘图函数进行绘图。动画是通过多次绘图实现的,一次绘图只能实现静态图像。

可以使用 setInterval()方法设置一个定时器,语法如下:

setInterval(函数名,时间间隔)

时间间隔的单位是毫秒(ms),每经过指定的时间间隔系统都会自动调用指定的函数完成绘画。

(2)清除先前绘制的所有图形。物体已经移动开来,可原来的位置上还保留先前绘制的图形,这样当然不行。解决这个问题最简单的方法是使用 clearRect(x, y, width, height)方法清除画布中指定区域的内容。

图 5-13 是一个方向(一般都是 4 个方向)的跑步动作序列图。假如想获取一个姿态的位图,可利用 Canvas 的上下文 2D 对象的 drawImage(image, sourceX, sourceY, sourceWidth,sourceHeight,destX, destY, destWidth, destHeight)将源位图上某个区域(sourceX, sourceY,sourceWidth, sourceHeight)拷贝到目标区域的(destX, destY)坐标点处,显示大小为(宽destWidth, 高 destHeight)。

5c89a21a956fc6b903e7aeb207ad8b90.png

【例 5-14】 实现从跑步动作序列 Snap1.jpg 文件中截取的第 3 个动作(帧)。 分析:在 Snap1.jpg 文件中,每个人物动作的大小为 60 像素×80 像素,所以截取源位 图的 sourceX=120,sourceY=0,sourceWidth=60, sourceHeight=80 就是第 3 个动作(帧)。

您的浏览器不支持 canvas。

< type="text/java">

function draw()

{

var canvas=document.getElementById("myCanvas"); //获取网页中的 canvas 对象

var context = canvas.getContext("2d"); //获取 canvas 对象的上下文

var imageObj = new Image(); //创建图像对象

imageObj.src = "Snap1.jpg";

imageObj. = function(){

//从原图(120, 0)位置开始截取中间一块宽 60*高 80 的区域,原大小显示在屏幕(0,0)处

ctx.drawImage(imageObj, 120, 0, 60, 80, 0, 0, 60, 80);

};

}

window.addEventListener("load", draw, true);

>

浏览例 5-14 的结果如图 5-14 所示,在页面上仅仅显示第 3 个动作。

190d859e17d9734a79412b48b1278f9c.png

游戏人物的跑步动画

【例 5-15】 实现游戏人物的跑步动画。 首先定义一个 Canvas 元素,画布的长和宽都是 300,代码如下:

HTML5 Canvas 实现游戏人物的跑步动画

在 Java 代码中定义一个 Image 对象,用于显示 Snap1.jpg。然后定义一个 init() 函数,初始化 Image 对象,并设置定时器,代码如下:

< type="text/java">

var imageObj = new Image();

var x =300;

var n =0; //计数器

108 HTML5 网页游戏设计从基础到开发

function init(){

imageObj.src = 'Snap1.jpg';

imageObj. = function(){ //图片加载成功

setInterval(draw,100); //定时器,每 0.1 秒执行一次 draw()函数

};

//此处省略 draw()函数的代码

window.addEventListener("load", init, true);

>

使用了定时器,每隔 100 毫秒就会在 Snap1.jpg 图片截取一张 60 像素×80 像素大小的 小图并绘制出来,且每次向左移 15 像素,直到最左端时重新从右侧开始,不停循环,就可 见游戏人物在屏幕上不停地奔跑。 下面分析 draw()函数的实现。例 5-14 中仅仅显示人物的第三个动作,而为了实现动画 需要 clearRect(x, y, width, height)不断清除先前绘制的动作图形,再绘制后续的动作。所以 需要一个计数器 n,记录当前绘制到第几动作(帧)了。

function draw()

{

var canvas=document.getElementById("myCanvas"); //获取网页中的 canvas

对象

var ctx = canvas.getContext("2d"); //获取 canvas 对象的上下文

ctx.clearRect(0,0,300,300); //清除 canvas 画布

//从原图(60*n)位置开始截取中间一块宽 60*高 80 的区域,显示在屏幕(x,0)处

ctx.drawImage(imageObj, 60*n, 0, 60, 80, x, 0, 60, 80);

if(n>=8){

n=0;

}else{

n++;

}

if(x>=0){

x=x-30; //前移 30 像素

}else{

x=300; //回到右侧

}

}

浏览例 5-15 的结果是一个游戏人物不停重复地从右侧跑到左侧的动画。返回搜狐,查看更多

扫码,全网低折扣购书

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值