如何使用Tween.js各类原生动画运动缓动算法

JavaScript036

如何使用Tween.js各类原生动画运动缓动算法,第1张

使用缓动功能,您可以加快或放慢动画的开头或结尾速度,以获得更加逼真或更加令人愉悦的效果。该技术用于修改 Flash 计算补间中的属性关键帧之间的属性值的方式。如果不使用缓动,Flash 在计算这些值时,会使对值的更改在每一帧中都一样。如果使用缓动,则可以调整对每个值的更改程度,从而实现更自然、更复杂的动画。缓动是应用于补间属性值的数学曲线。补间的最终效果是补间和缓动曲线中属性值范围组合的结果。例如,在制作汽车经过舞台的动画时,如果让汽车从停止开始缓慢加速,然后在舞台的另一端缓慢停止,则动画会显得更逼真。如果不使用缓动,汽车将从停止立刻到全速,然后在舞台的另一端立刻停止。如果使用缓动,则可以对汽车应用一个补间动画,然后使该补间缓慢开始和停止。一个未应用缓动的运动路径。请注意帧沿路径的均匀分布。已应用“停止并启动(中)”缓动的同一运动路径。请注意路径末尾附近帧的浓度,产生更逼真的汽车加速和减速。可以在属性检查器或动画编辑器中应用缓动。在属性检查器中应用的缓动将影响补间中包括的所有属性。在动画编辑器中应用的缓动可以影响补间的单个属性、一组属性或所有属性。缓动可以简单,也可以复杂。Flash 包含一系列的预设缓动,适用于简单或复杂的效果。在动画编辑器中,还可以创建自己的自定义缓动曲线。缓动的常见用法之一是在舞台上编辑运动路径并启用浮动关键帧以使每段路径中的运行速度保持一致。然后可以使用缓动在路径的两端添加更为逼真的加速或减速。在向属性曲线应用缓动曲线时,属性曲线图形区域中将显示缓动曲线的可视叠加。通过将属性曲线和缓动曲线显示在同一图形区域中,叠加使得在测试动画时了解舞台上所显示的最终补间效果更为方便。因为动画编辑器中的缓动曲线可以很复杂,所以可以使用它们在舞台上创建复杂的动画而无需在舞台上创建复杂的运动路径。除空间属性 X、Y 和 Z 外,还可以使用缓动曲线创建其他任何属性的复杂补间。

createJs的由来,基础什么的就不说了,就直接说createJs的用法吧。

首先到createJs官网下载,createJs分成easelJs(图形动画)、preloadJs(文件加载)、soundJs(音频控制)以及tweenJs(补间动画)四部分,大家下载的时候,建议下载两个文件,一个是压缩版文件,用于项目中的引用,再下载个源码文件,用于查看用法、API、demo等。因为楼主目前只用了easelJs和preloadJs,所以暂时就只说这两个,其实就这两个已经非常够用了。

接下来开始分析代码:

首先引入js文件

<script src="easeljs-0.7.1.min.js"></script>

<script src="preloadjs-0.4.1.min.js"></script>

然后进行舞台初始化操作:

function init(){

stage = new createjs.Stage("cas")

C_W = stage.canvas.width

C_H = stage.canvas.height

var manifest = [

{src:"image/man.png" , id:"man"},

{src:"image/ground.png" , id:"ground"},

{src:"image/bg.png" , id:"bg"},

{src:"image/high.jpg" , id:"high"},

{src:"image/coins.png" , id:"coin"}

]

loader = new createjs.LoadQueue(false)

loader.addEventListener("complete" , handleComplete)

loader.loadManifest(manifest)

drawLoading()

}

上面就用到了preloadJs中的方法,实例化一个loader,把需要加载的图片文件放在manifest里面,进行加载,加载完成后调用回调handleCompelete函数:

function handleComplete(){//当图片素材load完后执行该方法

var manImage = loader.getResult("man"),

lowground = loader.getResult("ground"),

highground = loader.getResult("high"),

bgImage = loader.getResult("bg"),

coins = loader.getResult("coin")

sky = new createjs.Shape()

sky.graphics.bf(bgImage).drawRect(0,0,C_W,C_H)

sky.setTransform(0, 0, 1 , C_H/bgImage.height)

stage.addChild(sky)

man = createMan(200,326,manImage)

//该框为判定角色的判定区域

kuang = new createjs.Shape()

kuang.graphics.beginStroke("rgba(255,0,0,0.5)").drawRect(0 , 0 , man.size().w , man.picsize().h*1.5)

// stage.addChild(kuang)

mapHandle(lowground , highground , coins)

createjs.Ticker.timingMode = createjs.Ticker.RAF//设置循环方法,可以是requestAnimationFrame或者是setTimeout

createjs.Ticker.setFPS(30)//舞台帧率控制

createjs.Ticker.addEventListener("tick", tick)//绑定舞台每一帧的逻辑发生函数

window.addEventListener("keydown" , function(event){

event = event||window.event

if(event.keyCode===32&&man.jumpNum<man.jumpMax){

man.jump()

}

})

}

获得加载完成后端的图片数据就直接用loader.getResult就可以获取了,跑酷游戏需要一个背景,所以,我们实例化一个sky,然后进行位图绘制,bf方法是beginBitmapFill的缩写,该方法就是开始绘制位图,后面的drawRect是位图的绘制区域,区域当然是整个画布啦,所以就是drawRect(0,0,C_W,C_H)。实例化出来sky后就直接添加到舞台stage里面就行了。接下来是实例化一个角色,createMan方法后面有说,是自己封装的。

然后进行舞台循环设置,上面有注释了,就不说了。