無標題文檔

动画初探(实现)

说完了理论 ,我们来做点实事。这篇文章将介绍使用 Javascript 实现的动画组件。

下面记录下当时编写这个组件的考虑的些问题,对技术细节感兴趣的朋友,可以 到这里参看源代码

  1. 需要几个回调函数控制初始化、动画运行时、动画完成的情况
  2. 将动画精确到运行了几帧
  3. 使用 setInterval 还是 setTimeout,最后还是选择了 setInterval( 详细
  4. 不管元素需要更改那些属性,提供相应公式即可,但这可能带来性能问题
  5. 要可扩展、而且稳定

这个动画组件的用法简要的说明下,首先我们要确定元素从哪里移动(begin)到哪里(final),我们可以将两个信息绑定到一起,比如

var position = {from: 0, to: 100};

然后实例化个动画组件,指定动画的运行时长(duration)以及动画运行类型(tween)

var motion = new Motion(duration, tween);

另外,我们当然希望在动画初始化、开始以及进行和结束时候做额外的事情,那么加入相应 的回调:

// 初始化
motion.onInit = function() {
    // ...
};

// 开始
motion.onStart = function() {
    // ...
};

// 动画运行时
motion.onTweening = function() {
    // 需要获取某个时间点的坐标时,可以使用 this.equation 方法
    var p = this.equation(position.from, position.to);
};

// 动画完成时
motion.onComplete = function() {
    // ...
};

当一切准备就绪,那么就可以开始动画了

motion.start();

当然,任何时候我们都希望能停止动画,那么就

motion.stop();

那么我们就可以通过这个动画组件完成常见的动画效果了。 这里有个 DEMO ,看下这个动画组件的实际使用例子。按照传统,代码可以在这里 打包下载

附,参考资源: YUI 的动画组件mootools 的动画组件

-- 全文完 --

动画初探(原理)

哲学上有种说法,「运动是绝对的,静止是相对的」。我们在编写各样的效果时,时常会碰到动画。下面的章,将讨论动画的原理以及实现。

动画,简而言之就是物体在某时间段内,不断的改变自身的属性。这些属性有可能是位置、大小等。为了方便说明,在这里统一认定为位置(position)。

那么,动画就有了两个基本的变量,时间和位置。用直角坐标系来表示,将 x 轴定为时间(time),将 y 轴定为位置(position),就可以得到这样的坐标系

https://friable.rocks/_/2009_11_05/124506e8a53a.jpg

从这个坐标系可以获得更多的信息,比如动画运行的时间段(x 轴的区间)、动画开始试物体的位置(begin)以及结束时的位置(final)。

然后,动画的基本关系可初步抽象出来。时间(duration)和位置(position)存在函数关系

position = f(time)

在这里同时引入 fps (帧率)这个概念。fps 简单的说,就是一秒钟内物体变化了几帧。它抽象成坐标中的元素,就是 x 轴的粒度。

fps 是个常量(比如通常电影的 fps 为 25,即每秒 25 帧),通过 fps 以及时间段(duration),则可以计算出这个时间段内物体位移了几帧(frames),公式如下

frames = (duration/1000)*fps

上述公式中,时间段(duration)以 毫秒 计算,即一毫秒等于一千分之一秒。

综合起来,我们要获得某个时间点的位置时,就可以利用 当前时间点(time)、时间段(duration、x 轴的区间),以及开始的坐标(begin)和结束的坐标(final)等因素来完成,那么可以将第一个的公式细化成

position = f(time, begin, final, duration)

同时,根据 fps 计算出的帧数,则可以得知某动画在这个时间段内运行了几次。而此函数产生的曲线,则可以说明在指定时间段内,物体的运动情况。如曲线比较抖,则说明物体运动比较快,反之则慢。

例如上述函数图的 45 度曲线,如果不考虑区间因素则可以写成

position = time

然后加上函数区间,则用函数表示

postion = final * time / duration + begin

那么就可以说明物体随着时间的改变,位置进行匀速递增的运行。

至此,元素的动画问题,这时就可以抽象成具体的数学问题。仅通过改变函数的公式,就可以改变物体动画的运行效果。

附,相关参考资源:

维基百科: 动画中文 )、 FPS/帧率中文

--未完待续--

Javascript 小游戏,「是男人坚持 100 次」

佛爷 去了公司的年夜饭,我有点无聊就在公司 Coding 点东西玩玩,于是就有了这玩意。请允许我很猥·琐得将这个游戏称之为 「是男人坚持 100 次」 (坦白讲,我是死活玩不到这个级别了)。

https://friable.rocks/_/2009_11_05/690116db6fb0.jpg

原定两个小时搞定的脚本,结果花了我将近三个小时的时间。完事后 我在 Twitter 上记录下 心得结果被群殴(看来 Twitter 不能当作笔记本),还是记录到 Blog 里比较靠谱

  1. 设计模式和算法很重要,在前期打「腹稿」的时候就应该搞定那玩意。
  2. 按需加载,特别是在大量的 DOM 操作时,这时候就要体现算法的力量了。
  3. 命名很重要,能避免很多问题。比如遇到了不大不小的 Bug,原因是我作孽得将某个变量命名为 「class」 了。
  4. 效率优先是没有错,可怜我一开始就考虑这些而忽略了其他更重要的事情,绕了很多的弯路。
  5. 结构尽量精炼,能用 CSS 实现的效果尽量用 CSS 实现。
  6. 将「杂碎」的处理拉出来或者再细分整理下,不要写「一坨」很长的 function,自己看着都累。

对技术实现有兴趣的朋友可以 看下核心的 Javascript 代码 ,欢迎提任何建议。PS,在内测的时,虽然这小游戏是我写的,但发现谁都比我玩得好,真是没有脸活了。

顺便八卦: Javascript 做游戏并不是不可能 。从目前的情况以及效果和成本看,还是使用 Flash 比较得当。到 HTML5 以及 Canvas 普及以后,这情况可能会有所改变,不过在这之前谁又能等的了呢。

最后,游戏地址:

http://friable.rocks/dazing/写了个 Javascript 小游戏 ,我称之为「天上地下打不死」,有兴趣也可以看看。

我的照片

嗨!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,同时也欢迎您关注我的 GitHubTwitterInstagram 等。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 要知道作为码农取名是件很难的事情,所以不想在取名这事情上太费心思。

作为八零后,自认为还仅存点点可能不怎么被理解的幽默感,以及对平淡生活的追求和向往。 为了避免不必要的麻烦,声明本站所输出的内容以及观点仅代表个人,不代表自己所服务公司或组织的任何立场。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQG91dGxvb2suY29tCg== | base64 -d`

分类

搜索

文章