返回“Flash基础理论课 - 目录”
现在您已经来到了最后一章。我将所有想要介绍的一些小东西都放在了这一章,它们不太合适放在其它地方,或者说与前面章节的主线有些脱离。
本章,我还重组了前面每章课后列出的公式,因此可以当作这些公式的一个参考点。
由于这些课题都是比较零碎的概念,所以我没有办法将这些许许多多的内容组织起来。因此每一节都是一个独立的单元。好了,不多说了,让我们开始吧。
布朗(随机)运动
先讲讲历史。一天,一个名叫罗伯特-布朗(Robert Brown)的植物学家正在观察一滴水中的花粉颗粒,随后他发现这些花粉是在随机运动的。虽然它们不是水流或水的运动,但是这些小小的颗粒却永远不会停下来。他发现同样的事情会发生在微尘中,但它们不会像花粉那样游泳。虽然他不知道为什么会有这种现象,其实不只是他还有其他所有人在几十年内都不能给出解释,但是他却将这种现象用自己的名字命名 —— 只是为了能意识到它!
当今,我们对布朗运动的解释是大量的水分子在一滴水中不断运动,虽然水滴看上去是静止的。这些水分子与花粉和灰尘发生碰撞,将一些动量传给它们。因为即使是一颗小小的灰尘都要比一个水分子重上一百万倍,所以一次碰撞不会带来多大的影响。但是当每秒有几百万次的碰撞时,那么这些动量就会累计起来。
现在,一些水分子也许撞到了灰尘的一边,而另一些则撞在了另一边。最终,它们会达到总的平均值。但是,随着时间的变化,受到更多撞击的一边就会产生波动,假设为左边,那么这个粒子就会向右运动一点。底部所受撞击越多,则粒子向上运动得就越多。最后所有的值趋于平均,最终的结果通常不会在任何一个方向产生太多的动量。这就是随机悬浮动作。
我们可以在 Flash 中轻松地模拟出这种效果。在每一帧中,计算一个随机数加在运动物体的 x和y 速度中。随机的数值应该即可以是正数也可以是负数,并且一般来说都非常小,比如范围从-0.1到+0.1。形式如下:
vx += Math.random() * 0.2 - 0.1;
vy += Math.random() * 0.2 - 0.1;
用 0.2 乘以一个随机的小数,所得的值从0.0到0.2。再减去 0.1 则值变为 -0.1到0.1。在这里加入一些摩擦力(friction)很重要,否则速度会增大,并产生不自然的加速。在 Brownian1.as 中,我创建了 50 个粒子并让它们以布朗运动的形式悬浮。粒子就是我们熟悉的 Ball 类的实例,让它们为黑色并缩小。以下是代码:
package {
import flash.display.Sprite;
import flash.events.Event;
public class Brownian1 extends Sprite {
private var numDots:uint = 50;
private var friction:Number = 0.95;
private var dots:Array;
public function Brownian1() {
init();
}
private function init():void {
dots = new Array();
for (var i:uint = 0; i < numDots; i++) {
var dot:Ball = new Ball(1, 0);
dot.x = Math.random() * stage.stageWidth;
dot.y = Math.random() * stage.stageHeight;
dot.vx = 0;
dot.vy = 0;
addChild(dot);
dots.push(dot);
}
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(event:Event):void {
for (var i:uint = 0; i < numDots; i++) {
var dot:Ball = dots[i];
dot.vx += Math.random() * 0.2 - 0.1;
dot.vy += Math.random() * 0.2 - 0.1;
dot.x += dot.vx;
dot.y += dot.vy;
dot.vx *= friction;
dot.vy *= friction;
if (dot.x > stage.stageWidth) {
dot.x = 0;
} else if (dot.x < 0) {
dot.x = stage.stageWidth;
}
if (dot.y > stage.stageHeight) {
dot.y = 0;
} else if (dot.y < 0) {
dot.y = stage.stageHeight;
}
}
}
}
}