| 用FLASH 5制作实时控制计数器 |
 |
 |
|
2001-12-28 17:26
|
| |
DEMON.S
FLASH5的ACTIONSCRIPT对于动画爱好者+编程爱好者是一个福音,它可以允许我们通过编程的形式来实现对影片的控制,下面将要介绍的是一个FLASH5制作的控制计数器。
预览:
首先,新建一个FLASH5文件,我们需要做的事情很简单,只是按“CTRL+F8”新建一个
名称为“LINE”的“MOVIE CLIP”标号,然后用“TOOLS”工具箱内的“LINE TOOL”在“LINE”场景中间画一个短直线,这样就可以了,它就是我们要使用的全部材料。
同样的方法,新建一个空的“MOVIECLIP”,名城是“NUM”,我们打开用户库(“CTRL+L”)会发现里面有两个“MOVIECLIP”标号。(如图1)
(图1)
有击库中的“LINE”,选择“LINKAGE”,IDENTIFIER名称我们命名它为“SEED_LINE”,当然首先你要选定EXPORT THIS SYMBOL方式,这么做的目的就是要使得这根线出现在共享连接库当中以便于使用。(如图2)
(图2)
双击库中的“NUM”进入标号编辑状态(注意,是标号编辑状态)
在“NUM”的第1帧输入要执行的ACTIONSCRIPT:
for (i=1; i<=7; i++) {
this.attachMovie("seed_line", "line"+i, i);
this["line"+i]._alpha = 10;
}
this.line2._x = this.line3._x=this.line1._x+20;
this.line5._x = this.line6._x=this.line1._x-20;
this.line2._y = this.line6._y=this.line1._y+20;
this.line3._y = this.line5._y=this.line1._y+60;
this.line7._y = this.line1._y+40;
this.line4._y = this.line1._y+80;
this.line2._rotation = this.line3._rotation=this.line5._rotation=this.line6._rotation=90;
当然,上面的程序对于初学者还是比较复杂的,为了简化问题,我们需要一个抽象的思维,例如我们把刚才的“LINE”标号想象成积木块,我们要用这个积木块搭成一个“8”字形的“二级管”;这个过程现在看起来有些容易了,我们用FOR循环绑定共享连接库中的“SEED_LINE”(ATTACHMOVIE),赋予绑定的每一个“SEED_LINE”新的名称LINE I(1~7)7说明了二极管表达10个0~9数字只需要7根就够了。
绑定了线以后还要给于它位置,这里我们使用了相对位置(相对于LINE1),FOR循环下面所有的赋值指令就是排列了一个8字的过程。这就是一个8字的初始化,不过,它是一个隐隐约约的8,因为它的ALPHA属性是10。
好了,做好了8字形的集合材料“NUM”,同样也要使用LINKAGE存放到共享连接库中,IDENTIFIER名称是“NUM”。
按“CTRL+E”回到主场景当中,修改第一层的名称为“ACTION”,并且输入主场景初始化ACTIONSCRIPT:
// INIT
for (i=1; i<=6; i++) {
_root.attachMovie("num", "num"+i, i);
_root["num"+i]._x = 450-i*50;
_root["num"+i]._y = 100;
}
_root.num1._x = 400;
for (i=1; i<=6; i++) {
_root["seed"+i] = 0;
_root["lvl"+i] = i;
}
_root.seed1 = 1;
// 0
function n0 (which) {
for (i=1; i<=6; i++) {
_root["num"+which]["line"+i]._alpha = 70;
}
_root["num"+which].line7._alpha = 10;
}
// 1
function n1 (which) {
for (i=4; i<=7; i++) {
_root["num"+which]["line"+i]._alpha = 10;
}
_root["num"+which].line1._alpha = 10;
_root["num"+which].line2._alpha = 70;
_root["num"+which].line3._alpha = 70;
}
// 2
function n2 (which) {
_root["num"+which].line1._alpha = 70;
_root["num"+which].line2._alpha = 70;
_root["num"+which].line3._alpha = 10;
_root["num"+which].line4._alpha = 70;
_root["num"+which].line5._alpha = 70;
_root["num"+which].line6._alpha = 10;
_root["num"+which].line7._alpha = 70;
}
// 3
function n3 (which) {
for (i=1; i<=4; i++) {
_root["num"+which]["line"+i]._alpha = 70;
}
_root["num"+which].line5._alpha = 10;
_root["num"+which].line6._alpha = 10;
_root["num"+which].line7._alpha = 70;
}
// 4
function n4 (which) {
_root["num"+which].line1._alpha = 10;
_root["num"+which].line2._alpha = 70;
_root["num"+which].line3._alpha = 70;
_root["num"+which].line4._alpha = 10;
_root["num"+which].line5._alpha = 10;
_root["num"+which].line6._alpha = 70;
_root["num"+which].line7._alpha = 70;
}
// 5
function n5 (which) {
_root["num"+which].line1._alpha = 70;
_root["num"+which].line2._alpha = 10;
_root["num"+which].line3._alpha = 70;
_root["num"+which].line4._alpha = 70;
_root["num"+which].line5._alpha = 10;
_root["num"+which].line6._alpha = 70;
_root["num"+which].line7._alpha = 70;
}
// 6
function n6 (which) {
for (i=4; i<=7; i++) {
_root["num"+which]["line"+i]._alpha = 70;
}
_root["num"+which].line1._alpha = 70;
_root["num"+which].line2._alpha = 10;
_root["num"+which].line3._alpha = 70;
}
// 7
function n7 (which) {
for (i=1; i<=3; i++) {
_root["num"+which]["line"+i]._alpha = 70;
}
for (i=4; i<=7; i++) {
_root["num"+which]["line"+i]._alpha = 10;
}
}
// 8
function n8 (which) {
for (i=1; i<=7; i++) {
_root["num"+which]["line"+i]._alpha = 70;
}
}
// 9
function n9 (which) {
for (i=1; i<=3; i++) {
_root["num"+which]["line"+i]._alpha = 70;
}
_root["num"+which].line4._alpha = 10;
_root["num"+which].line5._alpha = 10;
_root["num"+which].line6._alpha = 70;
_root["num"+which].line7._alpha = 70;
}
// 0
function n0 (which) {
for (i=1; i<=6; i++) {
_root["num"+which]["line"+i]._alpha = 70;
}
_root["num"+which].line7._alpha = 10;
}
不要害怕上面的ACTION数量,慢慢的看,它不过是两部分组成:
1,初始化。从共享连接库中绑定6个“NUM”出来放到主场景中(确定了位置_X_Y),并赋予了新的名称NUM I,在程序运行中,我们需要两组变量“SEED I”和“LVL I”分别代表6位的值和6位的层次。由于SEED1的值我们需要后增加,所以它的初始值是1。
2,显示函数0~9。分别是我们自定义的0~9的显示函数,其原理是用WHICH(第几位)的引入方法增加ALPHA的明度值来显示。
在主场景中新建一个层,名称是“ACTION-MAIN”,这里是主控值程序。
在第2帧插入ACTIONSCRIPT:
// CTRL
_root["n"+_root.seed1](_root.lvl1);
for (i=2; i<=6; i++) {
this.tempi = i-1;
if (_root["seed"+this.tempi] == 10) {
for (j=1; j<=tempi; j++) {
_root["seed"+j] = 0;
_root.n0(_root["lvl"+j]);
}
_root["seed"+j]++;
_root["n"+_root["seed"+j]](_root["lvl"+j]);
}
}
_root.seed1++;
这个过程已经简化的让人一下子看不懂了(我也快了),首先,为了马上输出反应最快的SEED1(第1位),要马上的使用_ROOT.N x(_ROOT.LVL1),这样会适当加快下面的进程,因为下面的进程很耗系统资源。一个FOR循环,从第2位开始判断是否进位,共判断到第6位,临时变量TEMPI用来存放当前的位数的前一位位数,内部过程是这样的:判断后一位是否等于10,如果是就执行另一个FOR循环来设定包括该位(TEMPI)开始的所有后位全部输出0,最后循环完的J恰好是最高位,所以我们用这个J来增加SEED J的存放数值,并输出,中间进位判定全部结束以后,SEED1自加一,等待下次进入帧以便于输出。
在“ACTION-MAIN”层的第3帧,只要输入这个ACTION,全部程序就会正常运行:
// RETURN
gotoAndPlay (2);
最后,“CTRL+ENTER”测试一下效果,是不是跟二极管的数字控制非常的相像?
注意的问题:1,“ACTION”层和“ACTION-MAIN”层不要合并成一个层,否则会出错误;2,适当拉长“ACTION-MAIN”层上的2-3帧距离可以实现延迟效果。
|
| |
|
 |
|