FLASH调用外部文件详解
Flash加载外部文件
Flash可以通过帧、按扭、影片剪辑来调用外部文件。调用的外部文件包括:外部文本文件、外部程序文件、外部*.swf文件、外部图片文件、外部音乐文件、外部脚本文件。
一.调用外部文本文件:(文本文件开头要以flash中的动态文本框的变量名开头,如
msg=".........."这样的形式,要和编辑的Flash文件放在同一目录下)
1.用工具箱中的文本工具,选择动态文本,给动态文本一个变量名,如:msg,在编辑区拖出一个文本框
2.制作两个按扭(一个调用,一个清除)拖放到场景中。
3.调用按扭上添加AS:
on(release){//松开鼠标后执行下面的代码;
loadVariables("msg.txt",msg);//调用和你编辑的Flash处于同一目录下的msg.txt文本文件到动态文本msg中;
System.useCodepage=true;//使外部文件的中文字符能够正确显示;
}
4.清除按扭上的AS:
on(release){//松开鼠标后清楚动态文本框中的内容;
msg="";
}
5.Ctrl+Enter测试.
当然代码也可以写在帧上:(调用按扭的实例名是bt1,清除按扭的实例名是bt2)
在第一帧上加如下代码:
stop();
_root.bt1.onRelease=function(){
loadVariables("msg.txt",msg);
System.useCodepage=true;
}
_root.bt2.onRelease=function(){
_root.msg="";
}
Ctrl+Enter测试.
调用的外部文本文件能够滚动:
1.用工具箱中的文本工具,选择动态文本,给动态文本一个变量名,如:msg,在编辑区拖出一个文本框
2.新建一层,制作两个按扭(一个调用,一个清除)拖放到此层中
3.新建一层,在动态文本框的右侧用矩形工具画一个竖条,高度和动态文本一样;再制作一个向上的方向"箭头"按F8转为按扭元件;复制一个"箭头"按扭,垂直镜象,使这两个按扭和竖条的两端对齐.
4.调用按扭上的AS:
on(release){//松开鼠标后执行下面的代码;
loadVariables("msg1.txt",msg);//调用msg1.txt文本文件到动态文本框msg中;
System.useCodepage=true;//使外部文件的中文字符能够正确显示;
}
清除按扭上的AS:
on(release){
_root.msg="";//清除动态文本框中的内容;
}
向上的按扭上的AS:
on(press){//在按扭的感应区上每按一次鼠标执行下面的代码;
_root.msg.scroll=_root.msg.scroll-1;//文本向下滚动一行;
}
向下的按扭上的AS:
on(press){//在按扭的感应区上每按一次鼠标执行下面的代码;
_root.msg.scroll=_root.msg.scroll+1;//文本向上滚动一行;
}
Ctrl+Enter测试.
当然代码也可以写在帧上:(调用按扭的实例名是bt1,清除按扭的实例名是bt2,向上按扭的实例名是:up,向下按扭上的实例名是down)
在第一帧上加如下代码:
_root.bt1.onRelease=function(){//松开鼠标后执行下面的代码;
loadVariables("msg1.txt",msg);//调用msg1.txt文本文件到动态文本框msg中;
System.useCodepage=true;//使外部文件的中文字符能够正确显示;
}
_root.bt2.onRelease=function(){//松开鼠标后执行
_root.msg="";//清除动态文本框中的内容;
}
_root.up.onPress=function(){//在向上按扭上每按一次鼠标执行下面的代码;
_root.msg.scroll=_root.msg.scroll-1;//文本向下滚动一行;
}
_root.down.onPress=function(){//在向下按扭上每按一次鼠标执行下面的代码;
_root.msg.scroll=_root.msg.scroll+1;//文本向上滚动一行;
}
Ctrl+Enter测试.
二.调用外部*.swf文件(加载到影片剪辑中):
外部*.swf文件要和编辑的Flash文件放在同一目录下
1.新建立一个空的影片剪辑mymc,把它放在场景中,实例名是:mymc.
2.新建一层,制作两个按扭(一个调用,一个清除)拖放到此层中
3.调用按扭上的AS:
on(release){//鼠标离开按扭后执行下面的代码;
loadMovie("flash8.swf","mymc");//加载外部的"flash8.swf"文件到"mymc"空影片剪辑中;
mymc._x=70;//加载影片的X轴坐标;
mymc._y=20;//加载影片的Y轴坐标;
mymc._xscale=70;//加载影片的宽度;
mymc._yscale=70;//加载影片的高度;
}
清除按扭上的AS:
on(release){//鼠标离开按扭后执行下面的代码
unloadMovie(mymc);//删除用loadMovie加载的*.swf文件;
}
Ctrl+Enter测试
三.调用外部*.swf文件(加载到时间轴上):
外部*.swf文件要和编辑的Flash文件放在同一目录下
1.制作两个按扭(一个调用,一个清除)拖放到场景中
2.调用按扭上的AS:
on(release){//鼠标离开按扭后执行下面的代码
loadMovie("flash8.swf",1);//加载外部的"flash8.swf"文件到场景中,层深为1;
}
清除按扭上的AS:
on(release){//鼠标离开按扭后执行下面的代码
unloadMovie(1);//删除层深为1的用loadMovie所加载的"flash8.swf"文件
}
Ctrl+Enter测试。
当然二和三的代码都可以写在帧上。
四.调用外部图片(加载到影片剪辑中)
外部图片必须和正在编辑的Flash文件放在同一目录下
1.制作两个按扭(一个调用,一个清除)拖放到场景中
2.制作一个空的影片剪辑,拖到场景中,实例名是:mymc;
3.时间轴上第一帧上的AS:
i=0;//定义一个变量i,并且赋初值为0;
调用按扭上的AS:
on(release){//鼠标离开按扭后执行下面的代码;
i++;
if(i>9){//因为外面这有9张图,当变量大于9的时候,让变量为1,这样能够使加载的图片是连续的,即,每点一次按扭,就换一张图,等到换到第9张图,再点按扭,则循环到第一张图(j1.jpg到j9.jpg,因为没有j0.jpg,如果i=0,则会提示没有找到j0.jpg);
i=1;
}
loadMovie(("j"+i)+".jgp",mymc);//从j1.jpg开始加载图片到影片剪辑mymc中;
mymc._x=110;//以下设置加载图片的属性
mymc._y=35;
mymc._xscale=130;
mymc._yscale=130;
}
清除按扭上的AS:
on(release){
unloadMovie(mymc);//删除掉用loadMovie加载到影片剪辑的图片;
}
Ctrl+Enter测试。
当然AS可以写在帧上。
五.调用外部声音文件(加载到场景中)
外部声音文件必须和正在编辑的Flash文件放在同一目录下
1.制作两个按扭(一个调用,一个清除)拖放到场景中
2.调用按扭上的AS:
on(release){//鼠标离开按扭后执行下面的代码;
mySound=new Sound();//建立一个新的声音对象mySound;
mySound.loadSound("zaihuni.mp3",true);//加载外部的*.mp3声音文件到mySound对象中,并且按流的方式播放(参数为false时,是以装载完后播放);
}
清除按扭上的AS:
on(release){
mySound.stop();//当按下清除按扭后,停止声音的播放
}
Ctrl+Enter测试。
加载外部图片
如果你的动画中有很多的图片.如果都放到一个SWF文件.可能打开或是下载会很慢.这样就影响了观看效果及速度,那么你可以利用载入外部图片的方法,只要把图片按名称放到你网上的一个目录里(和你的SWF文件同一个目录),那么就可以解决这个问题
前十祯你做一个载入LOADING.从第十一祯开始
新建一个图层.起名为AS层
在AS图层的第十一祯加入一个关键祯,然后打开动作面板,加入以下AS
i = 0;//初始化变量
loadMovie ("p040.jpg", "pic");//在播放原始 SWF 文件的同时将p040.jpg 文件
//加载到 Flash Player 中的叫PIC的这个影片剪辑中。
上面的语句是实现了加载一张.我们要它加载多张.所以要用到IF语句.在AS层的第六十祯处加入一个关键祯,打开动作面板,加入AS语句:
i++;//变量i递增
if (i >= 21) {//当变量i递增到>=21时.这里的21是因为我准备了二十一张要加载的图.如果你加载十张.那就把这里的21改为10就可以了
i = 0;//则变量为0,即重新加载
}
loadMovie (("p04" + i) + ".jpg", "pic");//如果不是.则继续加载.这里的p04+i就等p04i.也就是说i是几.这里就是p04*,比如i为12,则p04+i就等于p0412
gotoAndPlay (12);//跳转到第十二祯
所以.在这里给图片起文件名时.就要按照这个原则来起的.准备好的图片要和你的主调用SWF文件入在同一个目录下,或者你也可以加载时用绝对路径,那就要改成"http://www.XXXXX.cn/p04"' target="_blank" >http://www.XXXXX.cn/p04";+i+".jpg"
图片的大小最好是事先调整好的.在你做好的PIC这个加载用的MC里.它的位置是放在XY坐标为0的位置,加载进来图是以这个MC左上角为准的,也就是说加载进来图的左上角与加载用的MC的左上角是重合的
--------------
loadMovie("图片名",newname);
以上语法以下用法
on(release){
loadMovie("pic.jpg", "mc");
mc._x=50;
mc._y=50
mc._xscale=40;
mc._yscale=40
}
--------------------------------------------------------------------------------
加载外部文本文件的3种方法
不管那样方法,文本文件要和主文件在同一目录下,再就是在这儿的文本文件名为 b.txt
*第一种方法txt=
1、创建一个文本框,给此文本框一个变量名txt;
2、文本格式为:动态;
3、选:多行输入
4、在第一帧上增加脚本语言。(按F9)
loadVariablesNum("b.txt",0);//b.txt是文件名,0是场景中的根目录
然后打开poems.txt文件,在记事本里输入:txt=
注意:在加载之前对文本文件进行转换,另存为Unicode编码格式。
*第二种方法 在主文件帧上输入防乱码的AS
按钮实现引用外部文本文件的效果:
第一步:主场第一帧AS:
System.useCodePage = true;//防止乱码
第二步:在按钮上写AS:
on (release) {
_root.loadVariables("b.txt");//b.txt文本名
}
**第三种方法 使用构造器,将文本拆分为若干字符串来显示.从根本上防止乱码.
,也就是说直接在 txt 里面写东西就行了。代码如下:
lala = new LoadVars();//构造函数;创建 LoadVars 对象。然后可使用该 LoadVars 对象的方法来发送和加载数据
lala.onData = function(rw) {//当lala被实例化并显示在时间轴上时将触发
a_txt.text = replacePunc(rw);//
};
function replacePunc(str) {//执行将文本拆分为多个字符串
var tempArray = str.split("\r\n");//拆分为多个子字符串
var tempstr = new String();
for (var i = 0; i<tempArray.length; i++) {
tempstr += tempArray+newline;
}
return tempstr;
}
System.useCodepage = true;//通知 Flash Player使用 传统代码页来解释外部文本
lala.load("b.txt");
本人觉得第三种办法好
利用ShareObject实现Flash数据存储
记得前些天看到有人问flash怎么在本地存储信息的问题
想起在http://www.ultrashock.com/看到的一篇关于SharedObject的文章
挑了一部分翻译了一下,也做了一些补注。
第一次做翻译工作,弄得不好各位多见谅。
什么是本地ShareObject?
通过flash 6 player,开发人员已就可以在客户端存储数据了,就像cookies一样。ShareObject有两种格式:本地和远程。这篇文章只讨论
本地ShareObject.远程ShareObject一般和flash communication server一起使用。一个本地ShareObject只需要flash 6 player,仅此而已
。很多情况下,ShareObject提供了除cookies外的另一种选择,这是许多开发者没有考虑过的。
存储简单数据
在ShareObject中存储简单数据是相当简单的工作,我们先用ShareObject存储一个用户自定义的对象,然后将讨论用ShareObject存储内建
类的实例的问题。一个用户自定义对象可以这样创建:
myObj = new Object(); //or myObj = {};
在ShareObject中存储myObj是很简单的,首先你需要创建一个本地ShareObject的引用:
myLSO = SharedObject.getLocal("foo");
getLocal方法的第一个参数是ShareObject的名字,getLocal()方法也有第二个可选参数:一个字符串类型的路径。大多数情况下你用不到这个参数,除非你在多个swf文件中共用同一个ShareObject。现在为了在ShareObject中储存数据,你需要给ShareObject指定“数据特性”(data property)。现在创建一个ShareObject引用,以及你想存储的对象,最后存储这个对象到“数据特性”中。
例子:
myLSO = SharedObject.getLocal("foo");myObj = {};myObj.fname = "Jessica";myObj.lname = "Smith";myLSO.data.myObj = myObj
*****译者注*****
myLocalSharedObject.data
描述:
只读属性,用来存储被存储到“数据特性”中的对象的属性,这些属性可以共享/存储,
每一个属性可以是各种基础数据类型(数组,数字布尔值等)对象。
****************
现在myObj已经存储在SharedObject中了,今后你可以通过对SharedObject数据属性的存取来实现对myObj的存取,下面是一个例子,这个例子检测是否数据已经被存储到SharedObject中了,如果没有,它将数据存储进去,如果已经存在,则在输出窗口输出。当你将这些代码放到一个空的电影的第一祯后,你可以运行它一次,然后在运行一次,第二次运行你可以看到你存储的数据被输出。
*****译者注*****
一定要先保存动画,否则你的动画只是在windows临时文件夹中运行,不能存储数据。
****************
myLSO = SharedObject.getLocal("foo");if(myLSO.data.myObj == undefined){ trace("Storing Data, run me again"); myObj = {}; myObj.fname = "Jessica"; myObj.lname = "Smith"; myLSO.data.myObj = myObj; }else{ trace("Retrieving Data"); var firstname = myLSO.data.myObj.fname; var lastname = myLSO.data.myObj.lname; trace("First Name: "+firstname); trace("Last Name: "+lastname); }
*****译者注*****
运行一次以上后,你可以将程序改为
myLSO = SharedObject.getLocal("foo"); trace("Retrieving Data"); var firstname = myLSO.data.myObj.fname; var lastname = myLSO.data.myObj.lname; trace("First Name: "+firstname); trace("Last Name: "+lastname);
你会发现无论你重复运行多少次,甚至关闭flash后重新进入,仍然能够得到firstname和lastname的值。
另外你应该可以理解getLocal()方法的参数的作用了,它用来表示你所存储的数据的载体名称,是必不可少的。
例如本例中的数据都存储在名为foo的SharedObject中,只有getLocal("foo"),你才能得到你想要的结果。
****************
你还可以存储更多内建类型:数组,布尔值,日期,数字,对象,XML,undefined,null
下面是一个将日期实例存储在SharedObject中的例子:
myLSO = SharedObject.getLocal("DateStorage"); myDate = new Date(); myLSO.data.myDate = myDate;
*****译者注*****
存储简单数据的方法到这基本上就介绍完了,是不是很简单?
为了方便大家理解,我做了一个简单的例子:
http://2-sky.net/SharedObject/3.fla
你可以在文本框中输入任何内容,然后点击储存,
以后任何时候你打开这个swf,文本框中总是上一次储存的内容。
我现在想到的对SharedObject最有意思的应用就是游戏存档!
只要将与游戏相关的数据,如时间,分数,等级,屏幕位置等相关数据存储
再在必要的时候提取出来,基本上就算是实现存档取档功能。
希望有兴趣的朋友试试。
另外,在使用SharedObject之前,别忘了把你的Flash Player的文件存储设置为无限制,
如图:
否则,超过了Player文件存储的上限(默认好像10k),ShareObject将不起作用
存储复杂数据一般指得是存储自定义类的实例。这一部分因为时间关系(要复习考试)
没有翻译,等有时间再来跟大家讨论。
--------------------------------------------------------------------------------
加载外部图片及对加载图片的控制
许多朋友都在问如何load外部的文件,如load jpg 、load swf 、load sound等等
load进来后又该如何控制?如何进行加载的判断?今天这个小教程讲的是加载外部
图片(jpg)的问题,在这个小教程里,你可以学会一些小知识,举一反三,相信你会
有所收获。
先看看本例的效果
http://tuliping.topcities.com/loadimage.html
来看看代码及其简析:
Stage.showMenu=false;//屏蔽右键,当然这样无法完全屏蔽
Stage.scaleMode = "noBorder";//播放器无菜单
Stage.scaleMode = "noScale";//禁止缩放
//上面的代码只是个人的爱好。
this.createEmptyMovieClip("preloader", 10000);
this.createEmptyMovieClip("mc", 10001);
//动态创建一 mc,用来装载图片
mc.loadMovie("test.jpg");
//load 一名为test的图片(jpg格式)
mc._visible = false;
//先令mc不可见
/*------------------------------------------------
preloader.onEnterFrame = function() {
var l = mc.getBytesLoaded();
var t = mc.getBytesTotal();
var getPercent = l/t;
loadText = Math.round(getPercent*100)+"%completed";
//一动态文本框的var: loadTest
loadBar._width = getPercent*100;
//进度条的长度,主场景中其 instance name: loadBar
if (l>0 && l>=t) {
mc._visible = 1;
delete this.onEnterFrame;
//加载完毕后令mc可见,并stop loop (delete this.onEnterFrame;)
}
*/ ----------------------这段代码就是用来判断加载的情况
//-------------------------------------------------------------------------------
MovieClip.prototype.jump = function(scale, frequency, quotiety) {
//三个参数,scale--图片的比例 frequency---弹性的频率 quotiety---弹性系数
this.tempo += (scale - this._xscale) * frequency;
this.tempo *= quotiety;
this._xscale = this._yscale += this.tempo;
//令图片位于场景的中间(550X400)
this._x = 275-(this._width/2);
this._y = 200-(this._height/2);
};
//--------图片弹性效果的设置,这种效果你可以用在其它方面,比如按钮
//-----------判断鼠标事件,当鼠标与图片碰撞时调用自定义的函数并赋值
mc.onEnterFrame = function() {
if (this.hitTest(_root._xmouse, _root._ymouse, true)) {
this.jump(70, .9, .6);
} else {
this.jumpl(30, .6, .5);
}
}
};
以上代码都在主场景第一帧。
手动建一MC,画一条线用做进度条,把MC从库中拉到主场景,instance name: loadBar。在主场景中建一动态文本框,用来显示加载的百分比,var: loadTest
后记:加载完毕后就可以对其进行用关的操作,如果没有加载完就进行操
作那是不行的,所以要注意进行加载的判断,这在load外部文件时显得尤其重要。
二.语法相关:
1.首当其冲的还是点语法,他是在编程时用来指明与某个对象的相关的属性和方法,还可用于标识对象的路径。 比如,要获取主场景中的Myball这个影片剪辑的x坐标值语法为_root.Myball._x。这其中还有一个必须引起注意,初学者常常以为这里的Myball是指给库里的对象命名,如图二:
其实这是不对的,在程序中出现的名字,我们习惯上称为实例名,其正确的命名方法是在场景中选定需要命名的对象,然后在其属性面板对其命名,如图三:
当然还有在加载外部的图片,SWF或者直接调用库里的声音,MC,那还可以通过程序本身直接给对象添加实例名,这些技巧以后遇到的时候再给予解释!
点语法的对象名称中有两个特殊的名称:_root和_parent; 其中_root表示主场景,而_parent可以实现读取和设置包容当前物件的父物件的任何属性。我自己不知道是怎么养成的习惯,很少使用_parent,我比较喜欢采用一律从主场景来定位对象的方法。可能有时候这样定位并不如两种定位方法结合来的方便,但是我觉得这样做的最突出的优点是便于差错,因为你的路径一律是从上到下的(从主场景到某个内层的MC或按钮)哪一个层级出了问题很容易看出来,不用在MC和场景间来回切换,查谁是谁的父,谁是谁的子!另外我还有一个习惯,就是即使对象是在主场景中,我也喜欢在控制他的时候加上一个_root 。比如说主场景中的Myball这个MC是个运动的球,要用按钮控制让他停止,下面的语句可以实现:
on(release){
Myball.stop();
}
但是我一般写成:
on(release){
_root.Myball.stop();
}
当然,这只是我的个人习惯,也许大家看了觉得我在自找麻烦。但是,我之所以讲出来,是因为我觉得这是一个习惯,就是保有一种路径的观念在心里。这个应该蛮重要的。
2.关于斜杠语法:
据我所知,斜杠语法是在FLASH 4.0中广泛使用的,也用于指示对象的路径,被用于代替点的作用,当他要指出一个变量是需要在变量前面加上冒号,以表示对变量的引用。由于软件都有一种向下兼容性,所以在MX中仍然可以使用(我没怎么用过2004,估计2004也支持的),但是一般说不推荐使用,一方面,既然被取代了,肯定是因为有缺点,有好的方法了干吗还要抱者旧的不放(你要是怕被人说喜新厌旧,那你就继续用!我是不怕的,挖哈哈......)另一方面,为了和其他人保持一致,大家都用点语法,你一个人用斜杠,总觉得不大好!
3.分号:
编程时,我有在每句话结尾加分号的习惯,其实这个分号是可以省略的,那我为什么要加呢,嘿嘿........那是因为我一开始学习用FLASH编程时,没人告诉我可以不加,我就一直辛辛苦苦的加啊!!!现在改不过来了!挖哈哈..............
4.大小写
FLASH编程时,只有关键字区分大写和小写,何谓关键字,基本上就是你写对了,会变成兰色的那部分程序代码,也就是为本语言专用的一些单词!!比如:setProperty clearInterval getRGB 这些!
5.注释;
添加注释一般是为了方便别人阅读你的程序,添加注释符号//后,其后的内容为灰色;其实他还有一个最大的优点就是,方便你调试程序,比如,编译时发现程序有错,可是程序很长,你不能完全准确的确定错误发生的位置,那么你可以使用// 逐段的屏蔽掉程序段,进而帮助确定错误的位置。
**************************************************************************************************************
三.关于查错:
往往从有思路到编程实现效果不可能一次完成,也就是说,难免会出现错误,不能通过编译系统(不知道FLASH里怎么称呼,说成编译系统对不对咧,还请各位指教)。那这时候就需要我们查错。
1.充分利用输出窗口给出的提示:
例如:在按钮上加如下代码:
duplicateMovieClip("MC","MC"+j,10+j);
c=random(40);
setProperty("MC"+j,_y,(c+30));
setProperty"MC"+j,_x,random(600));
setProperty("MC"+j,_alpha,(2*c+20));
j++;
if(j>700){
j=1;
}
ctrl+enter测试影片,输出窗口提示:
场景=场景 1, 图层=AS, 帧=2: 第 4 行: Unknown error ID #1033
setProperty"MC"+j,_x,random(600));
就是说第四行有错误,回到编辑状态,一看,原来少了半边括号,就是说输出窗口会给我们提供很多必要的帮助,一定要好好利用!让AS编辑区显示行号的方法,如图四:
点一下红色圈中的按钮,选中显示行号即可!其他按钮还可以实现很多辅助功能,自己去看一看就知道了!
2.上述方法只能排除语法上的错误,也就是说,你程序本身算法或者程序中参数的传递,出现了问题,编译系统是不可能帮你检查出来的,这个只能靠你自己去检查。我这里介绍一点自己的方法,供大家参考:首先,你得自己心里想明白按照自己的这个算法思想能不能实现想要的结果,就是说先在心里把整个算法重新再理一遍,有时候想的不成熟,或者一开始的思路有疏漏,这时候应该可以更正或者修改过来!当你确定自己的程序设计思路没有问题但是依然出不了效果时,你就该考虑是程序实现时出了错误,比如参数传递有问题,路径指示不明确甚至错误等等都是比较常见的(至少我就常常犯这样的错误);
举个例子:
在主场景中有一个输入文本,其实例名为text 变量名为xx,
然后主场景的帧上加:
_root.text.onChanged = function() {
n=Number(xx);
};//当文本框内容改变时就把文本框的值赋给n这个变量;
然后在主场景中一个风车状的MC上加:
onClipEvent(enterFrame){
this._rotation=this._rotation+n;
}//意思是让风车旋转,速度为n;
但是测试影片,就是没有效果,为什么呢,想想看,先把风车上的代码改为:
onClipEvent(enterFrame){
this._rotation=this._rotation+3;
}//指定一个数值作为旋转的速度,测试发现,旋转正常;
这就提醒我们,是不是参数传递出了问题呢,哦!!!对,因为在帧上加的代码,所产生的变量n实际是主场景中的变量,把他传递到MC中时,应该确定起准确的位置。再次修改源代码,MC上的代码改为:
onClipEvent(enterFrame){
this._rotation=this._rotation+_root.n;
}
再次测试,一切正常,旋转速度随着输入数字的变化而变化
3.学会使用trace语句,检测错误!
上面的例子中变量比较少,所以很容易发现问题,如果一个程序中有多个变量,而且比较复杂,那就需要分别对他们进行跟踪查看,方法就是利用trace语句,在某个变量每次发生变化后都用trace将其输出,以便查看其运算结果是否和预期的一致!
同样举个例子:随机抽签效果!
十个MC,透明度均为30;
主场景中的关键帧上加:
a =new Array(0,1,2,3,4,5,6,7,8,9);//定义数组;
mm=0;//点击次数统计;
nn=10;//数组元素个数;
选择按钮上加:
on(press){
i = random(nn);
j = a;
a1=a.slice(0,i);
trace(a1);//输出抽取的部分数所组成的新的数组a1;
a2=a.slice(i+1,nn);
trace(a2);//输出抽取的另外一部分数所组成的新的数组a2;
a=a1.concat(a2);
trace(a);//输出组合后的数组,也就是新的数组a;
setProperty("mc"+j,_alpha,getProperty("mc"+j,_alpha)+30);
mm++;
nn--;
if(mm==10){
text="抽签结束!"
mm="10";
_root.but._visible=false;
}
}
采用以上方法后,每点击一次按钮,窗口都输出三排数字,最后一排中比上一次输出少掉的那个数字就是被抽取的数字;这样一来,每运行一次代码,程序人员都可以方便的查看各个变量的运算情况!
源文地址:
dispbbs.asp?boardID=1&ID=141361
PS:
a1=a.slice(0,i);//截取数组a中从第0个到第i个元素组成新数组返回值赋值给数组a1
a2=a.slice(i+1,nn);//截取数组a中从第i+1个到最后一个元素组成新数组返回值赋值给数组a2
a=a1.concat(a2);//连接 a1和a2
setProperty("mc"+j,_alpha,getProperty("mc"+j,_alpha)+30);//把被选中的对象透明度加30;
_root.but._visible=false;//把按钮隐藏;
FLASH隐藏类公布/使用
--------------------------------------------------------------------------------
MM未公布的Tween/Easing类原教程译文
MM未公布的Tween/Easing类原教程译文及演示
原文章如下:
http://www.actionscript.org/tutorials/advanced/Tween-Easing_Classes_Documented/index.shtml
几天前转载的就是译至此,我现译全文,并加上演示及演示源文件:
FlashMX 2004 未公布的Tween/Easing 类
作者:Devon Wolfgang
译者:xfykzz
前言
我并不打算成为一个职业AS作家.有时我甚至不明白自己到底在干什么.现在一切都结束了,对于真正懂AS的高手,请原谅
我废话太多.事实上尽管我写的教程是在FlashMX 2004下的,而例却是用AS1.0写的.
引言
当我在网上闲逛时,我发现一些论坛上有不少贴子是讨论Flash中未公布的类的.但我发现还没有关于Tween/Easing类的文章,
于是我花了很多时间研究,现在写出来希望对大家有些帮助.
正文
I. Tween类
Flash现在支持一个很特别的新类"Tween"类,利用它可以使得很多MC运动效果变得简单.它的使用方法如下:
someTweenID = new mx.transitions.Tween(object, property, function, begin, end, duration, useSeconds)
参数解释如下:
object:一个您想要增加Tween动作的MC的实例名.
property:该MC的一个属性,即为将要添加Tween动作的属性.
function:easing类的一个方法(下面会提到).
begin:属性开始时的数值.
end:属性结束时的数值.
duration:动作持续的帧数/时间.
useSeconds:一个布尔值,决定是使用帧数计时(为false)还是秒数计时(为true).默认为false.
就这些了,下面我们来看看有哪些easing类中的方法可供使用.
II. Easing类
MX 2004支持16种不同的easing类方法(应该是19种,但是有4种是相同的).泛泛而谈,Easing类中有五大类方法,每一类又
分为3种,最后还有第六类(只提供一个方法,就是什么easing也没有).
具体地说,有以下六类:
Strong
Back
Elastic
Regular
Bounce
None
每类各有四种方法:
easeIn
easeOut
easeInOut
easeNone
None和easeNone是相同的,所以我忽略掉它们. 关于该方法的完整调用应该如下:
mx.transitions.easing.Bounce.easeOut
现在您需要用以上字符串代替"function"占位符.
III.把两者结合起来
好了,现在我们掌握了所有的基本元素,接下来我们做一个完整的动画出来.设想一下我们现在制作了一个实例名为"
ball_mc"的小球,想到从x坐标为20的在方移动到x坐标为380的地方,用时0.5秒,并在最后弹两下.那么我们需要这样写:
ballTween = new mx.transitions.Tween(ball_mc, "_x", mx.transitions.easing.Bounce.easeOut, 20, 380, .5, true);
这串代码真难看! 我们最好把它写成一个函数:
function tweenBall() {
easeType = mx.transitions.easing.Bounce.easeOut;
var begin = 20;
var end = 380;
var time = .5;
var mc = ball_mc;
ballTween = new mx.transitions.Tween(mc, "_x", easeType, begin, end, time, true);
}
这下看起来好多了.当然,我们还需要调用这个函数.下面我们做一个实例名为"myButton_btn"的按钮.然后在帧上加上如下的
代码:
myButton_btn.onRelease = function() {
tweenBall();//调用Tween
};
function tweenBall() {
easeType = mx.transitions.easing.Bounce.easeOut;
var begin = 20;
var end = 380;
var time = .5;
var mc = ball_mc;
ballTween = new mx.transitions.Tween(mc, "_x", easeType, begin, end, time, true);
}
还不错,不过我们还可以改进一下,把easing类方法设为入口参数,这样我们就可以自定义所执行的运动方式了:
myButton_btn.onRelease = function() {
tweenBall(mx.transitions.easing.Bounce.easeOut);//注意入口的easing方法参数
};
function tweenBall(easeType) {//加了一个参数.
var begin = 20;
var end = 380;
var time = 20;
var mc = ball_mc;
ballTween = new mx.transitions.Tween(mc, "_x", easeType, begin, end, time);
}
注意一点,time变量为20,我们把帧率调成25,然后去掉了最后一个boolean参数"useSeconds".这样运动就以帧为标准了.好了,
现在我们的代码看起来和先前的差不多,但是我们还要加15个差不多的按钮,用来向函数传递不同的参数.
所有按钮只是调用了一个函数,这下就有用多了.
IV.进一步研究
事实上,MM还为该类提供了几个事件和方法.我所找到的最有用的事件就是"onMotionFinished"事件,方法呢?有yoyo()和
rewind().
举个例子,我们想让小球循环对称地运动,只需要这样稍微改一下:
myButton_btn.onRelease = function() {
tweenBall(mx.transitions.easing.Bounce.easeOut);
};
function tweenBall(easeType) {
var begin = 20;
var end = 380;
var time = 20;
var mc = ball_mc;
ballTween = new mx.transitions.Tween(mc, "_x", easeType, begin, end, time);
ballTween.onMotionFinished = function() {
this.yoyo();
};//多了一个事件和方法
}
rewind()方法把增加了Tween运动的MC重置到初始(未增加Tween前)状态.
结论
好了,我知道我还有一些东西没有介绍.因为有些我发现没什么用,有些我根本还不知道怎么用!当然我很清楚了解清楚以
上几点就能够正确地使用Tween/Easing类了.
一点实际例子:
在收到不少Email后,我决定再多给几个例子.毕竟没有人只会想到移动小球.下面的例子会使您看到其用处的.
下面是代码:
navText_array = new Array("Home", "About", "Work", "Play", "Contact");
setUpButtons();
stop();
function setUpButtons() {
var btnCnt = navText_array.length;
for (i=0; i<btnCnt; i++) {
var temp = this["tab"+i+"_mc"];
temp.navText.text = navText_array;
temp.begin = temp._y;
temp.end = temp._y-100;
temp.time = 8;//为temp添加了三个属性
temp.onRollOver = function() {
easeUp(this);
};
temp.onRollOut = function() {
easeDown(this);
};
}
}
function easeUp(what) {
var tabUp = new mx.transitions.Tween(what, "_y", mx.transitions.easing.Bounce.easeOut, what.begin,
what.end, what.time);/*这里的what是为类型为MC的参数,调用what.begin等属性.从这里可以看出作者用的是AS1.0语法(如
他自己所说).*/
}
function easeDown(what) {
var begin = what._y;
var tabDown = new mx.transitions.Tween(what, "_y", mx.transitions.easing.Strong.easeIn, begin, what.
begin, what.time);
}
译者按:要实现上面的效果,还要创建btnCnt个实例名为("tab"+i+"_mc")的菜单项.
Tween类写成的全代码弹性菜单
我并不打算详细说说这个菜单,全代码的,大家粘贴到主场景第一帧就可以了,这里只是说说重点.
我定义了两个函数,第一个是创建菜单选项,也就是方块和文字的,第二个创建运动的.我只是把末数量变成参数,这样在rollOver/rollOut时都可以用同一个函数.
最上面三个数组是关于菜单的定义的,包括颜色,文字和URL.
有个小小的技巧在这里面,就是用String(this._name).substr(-1,1) 来获得当前MC的序号,这样就可以把复制出来的MC定义转向到不同的URL.我的另一篇教程也有讲这个,不过说得太长了...(我是有点儿唐僧-___-#).
下面是代码:
mcColorArray = [0xF00000, 0xFF0000, 0xFFF000, 0x0FFF00, 0xFF0FF0, 0xF0FFF0];
//定义菜单方块的颜色
mcText = ["main", "news", "blog", "downloads", "about", "links"];
//定义菜单文字
urlArray=["#1","#2","#3","#4","#5","#6"];
//定义菜单跳转到URL
function createMc(mcName, mcX, mcY, mcDepths, mcColor, mcText) {
_root.createEmptyMovieClip(mcName, mcDepths);
with (eval(mcName)) {
_x = mcX;
_y = mcY;
lineStyle(1, 0x000000, 0);
beginFill(mcColor, 100);
moveTo(30, 30);
lineTo(-30, 30);
lineTo(-30, -30);
lineTo(30, -30);
lineTo(30, 30);
endFill();//定里把菜单定义为正方形
createTextField(mcText, 1, -30, -10, 60, 20);
eval(mcText).text = mcText;
eval(mcText).type = "dynamic";
var myTextFormat = new TextFormat();
myTextFormat.align = "center";
eval(mcText).setTextFormat(myTextFormat);
}
}
//创建菜单选项
function TweenMove(mcID, endData) {
TweenWidth = new mx.transitions.Tween(eval(mcID), "_width", mx.transitions.easing.Elastic.easeOut, eval(mcID)._width, endData, 2, true);
TweenHeight = new mx.transitions.Tween(eval(mcID), "_height", mx.transitions.easing.Elastic.easeOut, eval(mcID)._height, endData, 2, true);
}
//创建运动
for (var i = 0; i<mcText.length; i++) {
createMc("mcMenu"+i, 50+i*70, 50, i+1984, mcColorArray, mcText);//创建菜单
eval("mcMenu"+i).onRollOver = function() {
TweenMove(this, 80);
};
eval("mcMenu"+i).onRollOut = function() {
TweenMove(this, 60);
};
eval("mcMenu"+i).onRelease=function(){
var urlocation=String(this._name).substr(-1,1);
getURL(urlArray[urlocation],"_blank");
}//定义菜单方法.
}
JavaScript和Macromedia Flash的通信示例
原文地址: www.macromedia.com/support/flash/ts/documents/java_script_comm.htm
说明: 略作修改,主要是一些很初级的操作; 又很多相似的文章,不过这个很权威
下面是一些在Flash和使用Javascript的HTML文件直接通信的示例,每个示例都有简略的步骤
本文讨论了3种基本的Flash/Javascript通信方式:
Javascript 到 Flash的通信----使用Flash播放器的javascript方法
Flash 到 Javascript的通信----使用Flash的fscommand
Flash 到 Flash的通信----------使用本地连接对象或综合上2种技术
并不是所有的浏览器都很重视脚本.为了和Flash播放器通信,浏览器必须有内置的钩子以便Flash播放器可以'监听'.浏览器必须是下列的几种:
Netscape Navigator 3.0-4.7x, 和 Netscape 6.2或更高
(Windows 95/98/NT/2000/XP 或 MacOS; 允许Java和LiveConnect)
Internet Explorer 3.0 或更高
(仅Windows 95/98/NT/2000/XP; 允许ActiveX)
注意:Macintosh上的Internet Explorer和早期版本的Netscape6不支持这种方法.请查看本文的附加信息
Javascript到Flash的通信
这个例子演示了如何使用Flash的method把变量从HTML的input text 发送到该页面中的Flash文件中.HTML input的数据通过Flash的SetVariable方法传送到Flash文件中.
查看示例:示例
下载源文件: javascript_to_flash.zip(17k)
步骤:
Flash中
1.新建一个文件,保存为javascript_to_flash.fla
2.用文字工具在舞台上创建一个文本域
3.选择这个文本域,在属性面板中,从下拉列表中选择动态文本(Dynamic Text),在变量(variable)栏填上"myVar"
注意:最好的习惯是使用Instance,用myVar.text更改myVar的值.为了简单起见和兼容Flash4和Flash5,我们使用的是变量名的形式.
4.保存文件
5.发布HTML文件和SWF文件
Dreamweaver中
下一步的工作转移到Dreamweaver中了,当然也可以是其他的HTML编辑器
1.打开上一步发布的HTML文件
2.插入生成的SWF文件和OBJECT/EMBED标签
(1) Insert>Media>Flash,并选择这个Flash
(2) 切换到代码视图,我们需要修改被选中的<OBJECT>和<EMBED>标签
(3) 在OBJECT标签中,插入id="myFlash"
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/
flash/swflash.cab#version=5,0,0,0"
width=366 height=142 id="myFlash">
注意:如果你是粘贴复制代码的话,确保删除不必要的换行.否则可能会引起错误; id也可以在属性面板里直接输入
(4) 在EMBED标签中,插入name="myFlash"和swLiveConnect="true",确保没有使用id属性!代码应当是这样子的:
<embed src="javascript_to_flash.swf" quality=high width=366 height=142
type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?
P1_Prod_Version=ShockwaveFlash"
name="myFlash" swLiveConnect="true">
</embed>
3.创建表单域
(1) 回到设计视图
(2) 插入文本域(Insert> Form Object> Text Field),如果询问是否添加表单域,选择是
(3) 把文本域的HTML标签修改成这样:
<input type="text" name="sendText" maxlength="45" onChange="doPassVar(this)">
每当文本域内容发生变化时,onChange就被触发,doPassVar()函数就被调用
4.创建传递变量值的Javascript函数
复制下面的Javascript到<head></head>标签内
<SCRIPT LANGUAGE=JavaScript>
<!--
function doPassVar(args){
var sendText = args.value;
window.document.myFlash.SetVariable("myVar", sendText);
}
//-->
</SCRIPT>
Flash可以通过帧、按扭、影片剪辑来调用外部文件。调用的外部文件包括:外部文本文件、外部程序文件、外部*.swf文件、外部图片文件、外部音乐文件、外部脚本文件。
一.调用外部文本文件:(文本文件开头要以flash中的动态文本框的变量名开头,如
msg=".........."这样的形式,要和编辑的Flash文件放在同一目录下)
1.用工具箱中的文本工具,选择动态文本,给动态文本一个变量名,如:msg,在编辑区拖出一个文本框
2.制作两个按扭(一个调用,一个清除)拖放到场景中。
3.调用按扭上添加AS:
on(release){//松开鼠标后执行下面的代码;
loadVariables("msg.txt",msg);//调用和你编辑的Flash处于同一目录下的msg.txt文本文件到动态文本msg中;
System.useCodepage=true;//使外部文件的中文字符能够正确显示;
}
4.清除按扭上的AS:
on(release){//松开鼠标后清楚动态文本框中的内容;
msg="";
}
5.Ctrl+Enter测试.
当然代码也可以写在帧上:(调用按扭的实例名是bt1,清除按扭的实例名是bt2)
在第一帧上加如下代码:
stop();
_root.bt1.onRelease=function(){
loadVariables("msg.txt",msg);
System.useCodepage=true;
}
_root.bt2.onRelease=function(){
_root.msg="";
}
Ctrl+Enter测试.
调用的外部文本文件能够滚动:
1.用工具箱中的文本工具,选择动态文本,给动态文本一个变量名,如:msg,在编辑区拖出一个文本框
2.新建一层,制作两个按扭(一个调用,一个清除)拖放到此层中
3.新建一层,在动态文本框的右侧用矩形工具画一个竖条,高度和动态文本一样;再制作一个向上的方向"箭头"按F8转为按扭元件;复制一个"箭头"按扭,垂直镜象,使这两个按扭和竖条的两端对齐.
4.调用按扭上的AS:
on(release){//松开鼠标后执行下面的代码;
loadVariables("msg1.txt",msg);//调用msg1.txt文本文件到动态文本框msg中;
System.useCodepage=true;//使外部文件的中文字符能够正确显示;
}
清除按扭上的AS:
on(release){
_root.msg="";//清除动态文本框中的内容;
}
向上的按扭上的AS:
on(press){//在按扭的感应区上每按一次鼠标执行下面的代码;
_root.msg.scroll=_root.msg.scroll-1;//文本向下滚动一行;
}
向下的按扭上的AS:
on(press){//在按扭的感应区上每按一次鼠标执行下面的代码;
_root.msg.scroll=_root.msg.scroll+1;//文本向上滚动一行;
}
Ctrl+Enter测试.
当然代码也可以写在帧上:(调用按扭的实例名是bt1,清除按扭的实例名是bt2,向上按扭的实例名是:up,向下按扭上的实例名是down)
在第一帧上加如下代码:
_root.bt1.onRelease=function(){//松开鼠标后执行下面的代码;
loadVariables("msg1.txt",msg);//调用msg1.txt文本文件到动态文本框msg中;
System.useCodepage=true;//使外部文件的中文字符能够正确显示;
}
_root.bt2.onRelease=function(){//松开鼠标后执行
_root.msg="";//清除动态文本框中的内容;
}
_root.up.onPress=function(){//在向上按扭上每按一次鼠标执行下面的代码;
_root.msg.scroll=_root.msg.scroll-1;//文本向下滚动一行;
}
_root.down.onPress=function(){//在向下按扭上每按一次鼠标执行下面的代码;
_root.msg.scroll=_root.msg.scroll+1;//文本向上滚动一行;
}
Ctrl+Enter测试.
二.调用外部*.swf文件(加载到影片剪辑中):
外部*.swf文件要和编辑的Flash文件放在同一目录下
1.新建立一个空的影片剪辑mymc,把它放在场景中,实例名是:mymc.
2.新建一层,制作两个按扭(一个调用,一个清除)拖放到此层中
3.调用按扭上的AS:
on(release){//鼠标离开按扭后执行下面的代码;
loadMovie("flash8.swf","mymc");//加载外部的"flash8.swf"文件到"mymc"空影片剪辑中;
mymc._x=70;//加载影片的X轴坐标;
mymc._y=20;//加载影片的Y轴坐标;
mymc._xscale=70;//加载影片的宽度;
mymc._yscale=70;//加载影片的高度;
}
清除按扭上的AS:
on(release){//鼠标离开按扭后执行下面的代码
unloadMovie(mymc);//删除用loadMovie加载的*.swf文件;
}
Ctrl+Enter测试
三.调用外部*.swf文件(加载到时间轴上):
外部*.swf文件要和编辑的Flash文件放在同一目录下
1.制作两个按扭(一个调用,一个清除)拖放到场景中
2.调用按扭上的AS:
on(release){//鼠标离开按扭后执行下面的代码
loadMovie("flash8.swf",1);//加载外部的"flash8.swf"文件到场景中,层深为1;
}
清除按扭上的AS:
on(release){//鼠标离开按扭后执行下面的代码
unloadMovie(1);//删除层深为1的用loadMovie所加载的"flash8.swf"文件
}
Ctrl+Enter测试。
当然二和三的代码都可以写在帧上。
四.调用外部图片(加载到影片剪辑中)
外部图片必须和正在编辑的Flash文件放在同一目录下
1.制作两个按扭(一个调用,一个清除)拖放到场景中
2.制作一个空的影片剪辑,拖到场景中,实例名是:mymc;
3.时间轴上第一帧上的AS:
i=0;//定义一个变量i,并且赋初值为0;
调用按扭上的AS:
on(release){//鼠标离开按扭后执行下面的代码;
i++;
if(i>9){//因为外面这有9张图,当变量大于9的时候,让变量为1,这样能够使加载的图片是连续的,即,每点一次按扭,就换一张图,等到换到第9张图,再点按扭,则循环到第一张图(j1.jpg到j9.jpg,因为没有j0.jpg,如果i=0,则会提示没有找到j0.jpg);
i=1;
}
loadMovie(("j"+i)+".jgp",mymc);//从j1.jpg开始加载图片到影片剪辑mymc中;
mymc._x=110;//以下设置加载图片的属性
mymc._y=35;
mymc._xscale=130;
mymc._yscale=130;
}
清除按扭上的AS:
on(release){
unloadMovie(mymc);//删除掉用loadMovie加载到影片剪辑的图片;
}
Ctrl+Enter测试。
当然AS可以写在帧上。
五.调用外部声音文件(加载到场景中)
外部声音文件必须和正在编辑的Flash文件放在同一目录下
1.制作两个按扭(一个调用,一个清除)拖放到场景中
2.调用按扭上的AS:
on(release){//鼠标离开按扭后执行下面的代码;
mySound=new Sound();//建立一个新的声音对象mySound;
mySound.loadSound("zaihuni.mp3",true);//加载外部的*.mp3声音文件到mySound对象中,并且按流的方式播放(参数为false时,是以装载完后播放);
}
清除按扭上的AS:
on(release){
mySound.stop();//当按下清除按扭后,停止声音的播放
}
Ctrl+Enter测试。
加载外部图片
如果你的动画中有很多的图片.如果都放到一个SWF文件.可能打开或是下载会很慢.这样就影响了观看效果及速度,那么你可以利用载入外部图片的方法,只要把图片按名称放到你网上的一个目录里(和你的SWF文件同一个目录),那么就可以解决这个问题
前十祯你做一个载入LOADING.从第十一祯开始
新建一个图层.起名为AS层
在AS图层的第十一祯加入一个关键祯,然后打开动作面板,加入以下AS
i = 0;//初始化变量
loadMovie ("p040.jpg", "pic");//在播放原始 SWF 文件的同时将p040.jpg 文件
//加载到 Flash Player 中的叫PIC的这个影片剪辑中。
上面的语句是实现了加载一张.我们要它加载多张.所以要用到IF语句.在AS层的第六十祯处加入一个关键祯,打开动作面板,加入AS语句:
i++;//变量i递增
if (i >= 21) {//当变量i递增到>=21时.这里的21是因为我准备了二十一张要加载的图.如果你加载十张.那就把这里的21改为10就可以了
i = 0;//则变量为0,即重新加载
}
loadMovie (("p04" + i) + ".jpg", "pic");//如果不是.则继续加载.这里的p04+i就等p04i.也就是说i是几.这里就是p04*,比如i为12,则p04+i就等于p0412
gotoAndPlay (12);//跳转到第十二祯
所以.在这里给图片起文件名时.就要按照这个原则来起的.准备好的图片要和你的主调用SWF文件入在同一个目录下,或者你也可以加载时用绝对路径,那就要改成"http://www.XXXXX.cn/p04"' target="_blank" >http://www.XXXXX.cn/p04";+i+".jpg"
图片的大小最好是事先调整好的.在你做好的PIC这个加载用的MC里.它的位置是放在XY坐标为0的位置,加载进来图是以这个MC左上角为准的,也就是说加载进来图的左上角与加载用的MC的左上角是重合的
--------------
loadMovie("图片名",newname);
以上语法以下用法
on(release){
loadMovie("pic.jpg", "mc");
mc._x=50;
mc._y=50
mc._xscale=40;
mc._yscale=40
}
--------------------------------------------------------------------------------
加载外部文本文件的3种方法
不管那样方法,文本文件要和主文件在同一目录下,再就是在这儿的文本文件名为 b.txt
*第一种方法txt=
1、创建一个文本框,给此文本框一个变量名txt;
2、文本格式为:动态;
3、选:多行输入
4、在第一帧上增加脚本语言。(按F9)
loadVariablesNum("b.txt",0);//b.txt是文件名,0是场景中的根目录
然后打开poems.txt文件,在记事本里输入:txt=
注意:在加载之前对文本文件进行转换,另存为Unicode编码格式。
*第二种方法 在主文件帧上输入防乱码的AS
按钮实现引用外部文本文件的效果:
第一步:主场第一帧AS:
System.useCodePage = true;//防止乱码
第二步:在按钮上写AS:
on (release) {
_root.loadVariables("b.txt");//b.txt文本名
}
**第三种方法 使用构造器,将文本拆分为若干字符串来显示.从根本上防止乱码.
,也就是说直接在 txt 里面写东西就行了。代码如下:
lala = new LoadVars();//构造函数;创建 LoadVars 对象。然后可使用该 LoadVars 对象的方法来发送和加载数据
lala.onData = function(rw) {//当lala被实例化并显示在时间轴上时将触发
a_txt.text = replacePunc(rw);//
};
function replacePunc(str) {//执行将文本拆分为多个字符串
var tempArray = str.split("\r\n");//拆分为多个子字符串
var tempstr = new String();
for (var i = 0; i<tempArray.length; i++) {
tempstr += tempArray+newline;
}
return tempstr;
}
System.useCodepage = true;//通知 Flash Player使用 传统代码页来解释外部文本
lala.load("b.txt");
本人觉得第三种办法好
利用ShareObject实现Flash数据存储
记得前些天看到有人问flash怎么在本地存储信息的问题
想起在http://www.ultrashock.com/看到的一篇关于SharedObject的文章
挑了一部分翻译了一下,也做了一些补注。
第一次做翻译工作,弄得不好各位多见谅。
什么是本地ShareObject?
通过flash 6 player,开发人员已就可以在客户端存储数据了,就像cookies一样。ShareObject有两种格式:本地和远程。这篇文章只讨论
本地ShareObject.远程ShareObject一般和flash communication server一起使用。一个本地ShareObject只需要flash 6 player,仅此而已
。很多情况下,ShareObject提供了除cookies外的另一种选择,这是许多开发者没有考虑过的。
存储简单数据
在ShareObject中存储简单数据是相当简单的工作,我们先用ShareObject存储一个用户自定义的对象,然后将讨论用ShareObject存储内建
类的实例的问题。一个用户自定义对象可以这样创建:
myObj = new Object(); //or myObj = {};
在ShareObject中存储myObj是很简单的,首先你需要创建一个本地ShareObject的引用:
myLSO = SharedObject.getLocal("foo");
getLocal方法的第一个参数是ShareObject的名字,getLocal()方法也有第二个可选参数:一个字符串类型的路径。大多数情况下你用不到这个参数,除非你在多个swf文件中共用同一个ShareObject。现在为了在ShareObject中储存数据,你需要给ShareObject指定“数据特性”(data property)。现在创建一个ShareObject引用,以及你想存储的对象,最后存储这个对象到“数据特性”中。
例子:
myLSO = SharedObject.getLocal("foo");myObj = {};myObj.fname = "Jessica";myObj.lname = "Smith";myLSO.data.myObj = myObj
*****译者注*****
myLocalSharedObject.data
描述:
只读属性,用来存储被存储到“数据特性”中的对象的属性,这些属性可以共享/存储,
每一个属性可以是各种基础数据类型(数组,数字布尔值等)对象。
****************
现在myObj已经存储在SharedObject中了,今后你可以通过对SharedObject数据属性的存取来实现对myObj的存取,下面是一个例子,这个例子检测是否数据已经被存储到SharedObject中了,如果没有,它将数据存储进去,如果已经存在,则在输出窗口输出。当你将这些代码放到一个空的电影的第一祯后,你可以运行它一次,然后在运行一次,第二次运行你可以看到你存储的数据被输出。
*****译者注*****
一定要先保存动画,否则你的动画只是在windows临时文件夹中运行,不能存储数据。
****************
myLSO = SharedObject.getLocal("foo");if(myLSO.data.myObj == undefined){ trace("Storing Data, run me again"); myObj = {}; myObj.fname = "Jessica"; myObj.lname = "Smith"; myLSO.data.myObj = myObj; }else{ trace("Retrieving Data"); var firstname = myLSO.data.myObj.fname; var lastname = myLSO.data.myObj.lname; trace("First Name: "+firstname); trace("Last Name: "+lastname); }
*****译者注*****
运行一次以上后,你可以将程序改为
myLSO = SharedObject.getLocal("foo"); trace("Retrieving Data"); var firstname = myLSO.data.myObj.fname; var lastname = myLSO.data.myObj.lname; trace("First Name: "+firstname); trace("Last Name: "+lastname);
你会发现无论你重复运行多少次,甚至关闭flash后重新进入,仍然能够得到firstname和lastname的值。
另外你应该可以理解getLocal()方法的参数的作用了,它用来表示你所存储的数据的载体名称,是必不可少的。
例如本例中的数据都存储在名为foo的SharedObject中,只有getLocal("foo"),你才能得到你想要的结果。
****************
你还可以存储更多内建类型:数组,布尔值,日期,数字,对象,XML,undefined,null
下面是一个将日期实例存储在SharedObject中的例子:
myLSO = SharedObject.getLocal("DateStorage"); myDate = new Date(); myLSO.data.myDate = myDate;
*****译者注*****
存储简单数据的方法到这基本上就介绍完了,是不是很简单?
为了方便大家理解,我做了一个简单的例子:
http://2-sky.net/SharedObject/3.fla
你可以在文本框中输入任何内容,然后点击储存,
以后任何时候你打开这个swf,文本框中总是上一次储存的内容。
我现在想到的对SharedObject最有意思的应用就是游戏存档!
只要将与游戏相关的数据,如时间,分数,等级,屏幕位置等相关数据存储
再在必要的时候提取出来,基本上就算是实现存档取档功能。
希望有兴趣的朋友试试。
另外,在使用SharedObject之前,别忘了把你的Flash Player的文件存储设置为无限制,
如图:
否则,超过了Player文件存储的上限(默认好像10k),ShareObject将不起作用
存储复杂数据一般指得是存储自定义类的实例。这一部分因为时间关系(要复习考试)
没有翻译,等有时间再来跟大家讨论。
--------------------------------------------------------------------------------
加载外部图片及对加载图片的控制
许多朋友都在问如何load外部的文件,如load jpg 、load swf 、load sound等等
load进来后又该如何控制?如何进行加载的判断?今天这个小教程讲的是加载外部
图片(jpg)的问题,在这个小教程里,你可以学会一些小知识,举一反三,相信你会
有所收获。
先看看本例的效果
http://tuliping.topcities.com/loadimage.html
来看看代码及其简析:
Stage.showMenu=false;//屏蔽右键,当然这样无法完全屏蔽
Stage.scaleMode = "noBorder";//播放器无菜单
Stage.scaleMode = "noScale";//禁止缩放
//上面的代码只是个人的爱好。
this.createEmptyMovieClip("preloader", 10000);
this.createEmptyMovieClip("mc", 10001);
//动态创建一 mc,用来装载图片
mc.loadMovie("test.jpg");
//load 一名为test的图片(jpg格式)
mc._visible = false;
//先令mc不可见
/*------------------------------------------------
preloader.onEnterFrame = function() {
var l = mc.getBytesLoaded();
var t = mc.getBytesTotal();
var getPercent = l/t;
loadText = Math.round(getPercent*100)+"%completed";
//一动态文本框的var: loadTest
loadBar._width = getPercent*100;
//进度条的长度,主场景中其 instance name: loadBar
if (l>0 && l>=t) {
mc._visible = 1;
delete this.onEnterFrame;
//加载完毕后令mc可见,并stop loop (delete this.onEnterFrame;)
}
*/ ----------------------这段代码就是用来判断加载的情况
//-------------------------------------------------------------------------------
MovieClip.prototype.jump = function(scale, frequency, quotiety) {
//三个参数,scale--图片的比例 frequency---弹性的频率 quotiety---弹性系数
this.tempo += (scale - this._xscale) * frequency;
this.tempo *= quotiety;
this._xscale = this._yscale += this.tempo;
//令图片位于场景的中间(550X400)
this._x = 275-(this._width/2);
this._y = 200-(this._height/2);
};
//--------图片弹性效果的设置,这种效果你可以用在其它方面,比如按钮
//-----------判断鼠标事件,当鼠标与图片碰撞时调用自定义的函数并赋值
mc.onEnterFrame = function() {
if (this.hitTest(_root._xmouse, _root._ymouse, true)) {
this.jump(70, .9, .6);
} else {
this.jumpl(30, .6, .5);
}
}
};
以上代码都在主场景第一帧。
手动建一MC,画一条线用做进度条,把MC从库中拉到主场景,instance name: loadBar。在主场景中建一动态文本框,用来显示加载的百分比,var: loadTest
后记:加载完毕后就可以对其进行用关的操作,如果没有加载完就进行操
作那是不行的,所以要注意进行加载的判断,这在load外部文件时显得尤其重要。
二.语法相关:
1.首当其冲的还是点语法,他是在编程时用来指明与某个对象的相关的属性和方法,还可用于标识对象的路径。 比如,要获取主场景中的Myball这个影片剪辑的x坐标值语法为_root.Myball._x。这其中还有一个必须引起注意,初学者常常以为这里的Myball是指给库里的对象命名,如图二:
其实这是不对的,在程序中出现的名字,我们习惯上称为实例名,其正确的命名方法是在场景中选定需要命名的对象,然后在其属性面板对其命名,如图三:
当然还有在加载外部的图片,SWF或者直接调用库里的声音,MC,那还可以通过程序本身直接给对象添加实例名,这些技巧以后遇到的时候再给予解释!
点语法的对象名称中有两个特殊的名称:_root和_parent; 其中_root表示主场景,而_parent可以实现读取和设置包容当前物件的父物件的任何属性。我自己不知道是怎么养成的习惯,很少使用_parent,我比较喜欢采用一律从主场景来定位对象的方法。可能有时候这样定位并不如两种定位方法结合来的方便,但是我觉得这样做的最突出的优点是便于差错,因为你的路径一律是从上到下的(从主场景到某个内层的MC或按钮)哪一个层级出了问题很容易看出来,不用在MC和场景间来回切换,查谁是谁的父,谁是谁的子!另外我还有一个习惯,就是即使对象是在主场景中,我也喜欢在控制他的时候加上一个_root 。比如说主场景中的Myball这个MC是个运动的球,要用按钮控制让他停止,下面的语句可以实现:
on(release){
Myball.stop();
}
但是我一般写成:
on(release){
_root.Myball.stop();
}
当然,这只是我的个人习惯,也许大家看了觉得我在自找麻烦。但是,我之所以讲出来,是因为我觉得这是一个习惯,就是保有一种路径的观念在心里。这个应该蛮重要的。
2.关于斜杠语法:
据我所知,斜杠语法是在FLASH 4.0中广泛使用的,也用于指示对象的路径,被用于代替点的作用,当他要指出一个变量是需要在变量前面加上冒号,以表示对变量的引用。由于软件都有一种向下兼容性,所以在MX中仍然可以使用(我没怎么用过2004,估计2004也支持的),但是一般说不推荐使用,一方面,既然被取代了,肯定是因为有缺点,有好的方法了干吗还要抱者旧的不放(你要是怕被人说喜新厌旧,那你就继续用!我是不怕的,挖哈哈......)另一方面,为了和其他人保持一致,大家都用点语法,你一个人用斜杠,总觉得不大好!
3.分号:
编程时,我有在每句话结尾加分号的习惯,其实这个分号是可以省略的,那我为什么要加呢,嘿嘿........那是因为我一开始学习用FLASH编程时,没人告诉我可以不加,我就一直辛辛苦苦的加啊!!!现在改不过来了!挖哈哈..............
4.大小写
FLASH编程时,只有关键字区分大写和小写,何谓关键字,基本上就是你写对了,会变成兰色的那部分程序代码,也就是为本语言专用的一些单词!!比如:setProperty clearInterval getRGB 这些!
5.注释;
添加注释一般是为了方便别人阅读你的程序,添加注释符号//后,其后的内容为灰色;其实他还有一个最大的优点就是,方便你调试程序,比如,编译时发现程序有错,可是程序很长,你不能完全准确的确定错误发生的位置,那么你可以使用// 逐段的屏蔽掉程序段,进而帮助确定错误的位置。
**************************************************************************************************************
三.关于查错:
往往从有思路到编程实现效果不可能一次完成,也就是说,难免会出现错误,不能通过编译系统(不知道FLASH里怎么称呼,说成编译系统对不对咧,还请各位指教)。那这时候就需要我们查错。
1.充分利用输出窗口给出的提示:
例如:在按钮上加如下代码:
duplicateMovieClip("MC","MC"+j,10+j);
c=random(40);
setProperty("MC"+j,_y,(c+30));
setProperty"MC"+j,_x,random(600));
setProperty("MC"+j,_alpha,(2*c+20));
j++;
if(j>700){
j=1;
}
ctrl+enter测试影片,输出窗口提示:
场景=场景 1, 图层=AS, 帧=2: 第 4 行: Unknown error ID #1033
setProperty"MC"+j,_x,random(600));
就是说第四行有错误,回到编辑状态,一看,原来少了半边括号,就是说输出窗口会给我们提供很多必要的帮助,一定要好好利用!让AS编辑区显示行号的方法,如图四:
点一下红色圈中的按钮,选中显示行号即可!其他按钮还可以实现很多辅助功能,自己去看一看就知道了!
2.上述方法只能排除语法上的错误,也就是说,你程序本身算法或者程序中参数的传递,出现了问题,编译系统是不可能帮你检查出来的,这个只能靠你自己去检查。我这里介绍一点自己的方法,供大家参考:首先,你得自己心里想明白按照自己的这个算法思想能不能实现想要的结果,就是说先在心里把整个算法重新再理一遍,有时候想的不成熟,或者一开始的思路有疏漏,这时候应该可以更正或者修改过来!当你确定自己的程序设计思路没有问题但是依然出不了效果时,你就该考虑是程序实现时出了错误,比如参数传递有问题,路径指示不明确甚至错误等等都是比较常见的(至少我就常常犯这样的错误);
举个例子:
在主场景中有一个输入文本,其实例名为text 变量名为xx,
然后主场景的帧上加:
_root.text.onChanged = function() {
n=Number(xx);
};//当文本框内容改变时就把文本框的值赋给n这个变量;
然后在主场景中一个风车状的MC上加:
onClipEvent(enterFrame){
this._rotation=this._rotation+n;
}//意思是让风车旋转,速度为n;
但是测试影片,就是没有效果,为什么呢,想想看,先把风车上的代码改为:
onClipEvent(enterFrame){
this._rotation=this._rotation+3;
}//指定一个数值作为旋转的速度,测试发现,旋转正常;
这就提醒我们,是不是参数传递出了问题呢,哦!!!对,因为在帧上加的代码,所产生的变量n实际是主场景中的变量,把他传递到MC中时,应该确定起准确的位置。再次修改源代码,MC上的代码改为:
onClipEvent(enterFrame){
this._rotation=this._rotation+_root.n;
}
再次测试,一切正常,旋转速度随着输入数字的变化而变化
3.学会使用trace语句,检测错误!
上面的例子中变量比较少,所以很容易发现问题,如果一个程序中有多个变量,而且比较复杂,那就需要分别对他们进行跟踪查看,方法就是利用trace语句,在某个变量每次发生变化后都用trace将其输出,以便查看其运算结果是否和预期的一致!
同样举个例子:随机抽签效果!
十个MC,透明度均为30;
主场景中的关键帧上加:
a =new Array(0,1,2,3,4,5,6,7,8,9);//定义数组;
mm=0;//点击次数统计;
nn=10;//数组元素个数;
选择按钮上加:
on(press){
i = random(nn);
j = a;
a1=a.slice(0,i);
trace(a1);//输出抽取的部分数所组成的新的数组a1;
a2=a.slice(i+1,nn);
trace(a2);//输出抽取的另外一部分数所组成的新的数组a2;
a=a1.concat(a2);
trace(a);//输出组合后的数组,也就是新的数组a;
setProperty("mc"+j,_alpha,getProperty("mc"+j,_alpha)+30);
mm++;
nn--;
if(mm==10){
text="抽签结束!"
mm="10";
_root.but._visible=false;
}
}
采用以上方法后,每点击一次按钮,窗口都输出三排数字,最后一排中比上一次输出少掉的那个数字就是被抽取的数字;这样一来,每运行一次代码,程序人员都可以方便的查看各个变量的运算情况!
源文地址:
dispbbs.asp?boardID=1&ID=141361
PS:
a1=a.slice(0,i);//截取数组a中从第0个到第i个元素组成新数组返回值赋值给数组a1
a2=a.slice(i+1,nn);//截取数组a中从第i+1个到最后一个元素组成新数组返回值赋值给数组a2
a=a1.concat(a2);//连接 a1和a2
setProperty("mc"+j,_alpha,getProperty("mc"+j,_alpha)+30);//把被选中的对象透明度加30;
_root.but._visible=false;//把按钮隐藏;
FLASH隐藏类公布/使用
--------------------------------------------------------------------------------
MM未公布的Tween/Easing类原教程译文
MM未公布的Tween/Easing类原教程译文及演示
原文章如下:
http://www.actionscript.org/tutorials/advanced/Tween-Easing_Classes_Documented/index.shtml
几天前转载的就是译至此,我现译全文,并加上演示及演示源文件:
FlashMX 2004 未公布的Tween/Easing 类
作者:Devon Wolfgang
译者:xfykzz
前言
我并不打算成为一个职业AS作家.有时我甚至不明白自己到底在干什么.现在一切都结束了,对于真正懂AS的高手,请原谅
我废话太多.事实上尽管我写的教程是在FlashMX 2004下的,而例却是用AS1.0写的.
引言
当我在网上闲逛时,我发现一些论坛上有不少贴子是讨论Flash中未公布的类的.但我发现还没有关于Tween/Easing类的文章,
于是我花了很多时间研究,现在写出来希望对大家有些帮助.
正文
I. Tween类
Flash现在支持一个很特别的新类"Tween"类,利用它可以使得很多MC运动效果变得简单.它的使用方法如下:
someTweenID = new mx.transitions.Tween(object, property, function, begin, end, duration, useSeconds)
参数解释如下:
object:一个您想要增加Tween动作的MC的实例名.
property:该MC的一个属性,即为将要添加Tween动作的属性.
function:easing类的一个方法(下面会提到).
begin:属性开始时的数值.
end:属性结束时的数值.
duration:动作持续的帧数/时间.
useSeconds:一个布尔值,决定是使用帧数计时(为false)还是秒数计时(为true).默认为false.
就这些了,下面我们来看看有哪些easing类中的方法可供使用.
II. Easing类
MX 2004支持16种不同的easing类方法(应该是19种,但是有4种是相同的).泛泛而谈,Easing类中有五大类方法,每一类又
分为3种,最后还有第六类(只提供一个方法,就是什么easing也没有).
具体地说,有以下六类:
Strong
Back
Elastic
Regular
Bounce
None
每类各有四种方法:
easeIn
easeOut
easeInOut
easeNone
None和easeNone是相同的,所以我忽略掉它们. 关于该方法的完整调用应该如下:
mx.transitions.easing.Bounce.easeOut
现在您需要用以上字符串代替"function"占位符.
III.把两者结合起来
好了,现在我们掌握了所有的基本元素,接下来我们做一个完整的动画出来.设想一下我们现在制作了一个实例名为"
ball_mc"的小球,想到从x坐标为20的在方移动到x坐标为380的地方,用时0.5秒,并在最后弹两下.那么我们需要这样写:
ballTween = new mx.transitions.Tween(ball_mc, "_x", mx.transitions.easing.Bounce.easeOut, 20, 380, .5, true);
这串代码真难看! 我们最好把它写成一个函数:
function tweenBall() {
easeType = mx.transitions.easing.Bounce.easeOut;
var begin = 20;
var end = 380;
var time = .5;
var mc = ball_mc;
ballTween = new mx.transitions.Tween(mc, "_x", easeType, begin, end, time, true);
}
这下看起来好多了.当然,我们还需要调用这个函数.下面我们做一个实例名为"myButton_btn"的按钮.然后在帧上加上如下的
代码:
myButton_btn.onRelease = function() {
tweenBall();//调用Tween
};
function tweenBall() {
easeType = mx.transitions.easing.Bounce.easeOut;
var begin = 20;
var end = 380;
var time = .5;
var mc = ball_mc;
ballTween = new mx.transitions.Tween(mc, "_x", easeType, begin, end, time, true);
}
还不错,不过我们还可以改进一下,把easing类方法设为入口参数,这样我们就可以自定义所执行的运动方式了:
myButton_btn.onRelease = function() {
tweenBall(mx.transitions.easing.Bounce.easeOut);//注意入口的easing方法参数
};
function tweenBall(easeType) {//加了一个参数.
var begin = 20;
var end = 380;
var time = 20;
var mc = ball_mc;
ballTween = new mx.transitions.Tween(mc, "_x", easeType, begin, end, time);
}
注意一点,time变量为20,我们把帧率调成25,然后去掉了最后一个boolean参数"useSeconds".这样运动就以帧为标准了.好了,
现在我们的代码看起来和先前的差不多,但是我们还要加15个差不多的按钮,用来向函数传递不同的参数.
所有按钮只是调用了一个函数,这下就有用多了.
IV.进一步研究
事实上,MM还为该类提供了几个事件和方法.我所找到的最有用的事件就是"onMotionFinished"事件,方法呢?有yoyo()和
rewind().
举个例子,我们想让小球循环对称地运动,只需要这样稍微改一下:
myButton_btn.onRelease = function() {
tweenBall(mx.transitions.easing.Bounce.easeOut);
};
function tweenBall(easeType) {
var begin = 20;
var end = 380;
var time = 20;
var mc = ball_mc;
ballTween = new mx.transitions.Tween(mc, "_x", easeType, begin, end, time);
ballTween.onMotionFinished = function() {
this.yoyo();
};//多了一个事件和方法
}
rewind()方法把增加了Tween运动的MC重置到初始(未增加Tween前)状态.
结论
好了,我知道我还有一些东西没有介绍.因为有些我发现没什么用,有些我根本还不知道怎么用!当然我很清楚了解清楚以
上几点就能够正确地使用Tween/Easing类了.
一点实际例子:
在收到不少Email后,我决定再多给几个例子.毕竟没有人只会想到移动小球.下面的例子会使您看到其用处的.
下面是代码:
navText_array = new Array("Home", "About", "Work", "Play", "Contact");
setUpButtons();
stop();
function setUpButtons() {
var btnCnt = navText_array.length;
for (i=0; i<btnCnt; i++) {
var temp = this["tab"+i+"_mc"];
temp.navText.text = navText_array;
temp.begin = temp._y;
temp.end = temp._y-100;
temp.time = 8;//为temp添加了三个属性
temp.onRollOver = function() {
easeUp(this);
};
temp.onRollOut = function() {
easeDown(this);
};
}
}
function easeUp(what) {
var tabUp = new mx.transitions.Tween(what, "_y", mx.transitions.easing.Bounce.easeOut, what.begin,
what.end, what.time);/*这里的what是为类型为MC的参数,调用what.begin等属性.从这里可以看出作者用的是AS1.0语法(如
他自己所说).*/
}
function easeDown(what) {
var begin = what._y;
var tabDown = new mx.transitions.Tween(what, "_y", mx.transitions.easing.Strong.easeIn, begin, what.
begin, what.time);
}
译者按:要实现上面的效果,还要创建btnCnt个实例名为("tab"+i+"_mc")的菜单项.
Tween类写成的全代码弹性菜单
我并不打算详细说说这个菜单,全代码的,大家粘贴到主场景第一帧就可以了,这里只是说说重点.
我定义了两个函数,第一个是创建菜单选项,也就是方块和文字的,第二个创建运动的.我只是把末数量变成参数,这样在rollOver/rollOut时都可以用同一个函数.
最上面三个数组是关于菜单的定义的,包括颜色,文字和URL.
有个小小的技巧在这里面,就是用String(this._name).substr(-1,1) 来获得当前MC的序号,这样就可以把复制出来的MC定义转向到不同的URL.我的另一篇教程也有讲这个,不过说得太长了...(我是有点儿唐僧-___-#).
下面是代码:
mcColorArray = [0xF00000, 0xFF0000, 0xFFF000, 0x0FFF00, 0xFF0FF0, 0xF0FFF0];
//定义菜单方块的颜色
mcText = ["main", "news", "blog", "downloads", "about", "links"];
//定义菜单文字
urlArray=["#1","#2","#3","#4","#5","#6"];
//定义菜单跳转到URL
function createMc(mcName, mcX, mcY, mcDepths, mcColor, mcText) {
_root.createEmptyMovieClip(mcName, mcDepths);
with (eval(mcName)) {
_x = mcX;
_y = mcY;
lineStyle(1, 0x000000, 0);
beginFill(mcColor, 100);
moveTo(30, 30);
lineTo(-30, 30);
lineTo(-30, -30);
lineTo(30, -30);
lineTo(30, 30);
endFill();//定里把菜单定义为正方形
createTextField(mcText, 1, -30, -10, 60, 20);
eval(mcText).text = mcText;
eval(mcText).type = "dynamic";
var myTextFormat = new TextFormat();
myTextFormat.align = "center";
eval(mcText).setTextFormat(myTextFormat);
}
}
//创建菜单选项
function TweenMove(mcID, endData) {
TweenWidth = new mx.transitions.Tween(eval(mcID), "_width", mx.transitions.easing.Elastic.easeOut, eval(mcID)._width, endData, 2, true);
TweenHeight = new mx.transitions.Tween(eval(mcID), "_height", mx.transitions.easing.Elastic.easeOut, eval(mcID)._height, endData, 2, true);
}
//创建运动
for (var i = 0; i<mcText.length; i++) {
createMc("mcMenu"+i, 50+i*70, 50, i+1984, mcColorArray, mcText);//创建菜单
eval("mcMenu"+i).onRollOver = function() {
TweenMove(this, 80);
};
eval("mcMenu"+i).onRollOut = function() {
TweenMove(this, 60);
};
eval("mcMenu"+i).onRelease=function(){
var urlocation=String(this._name).substr(-1,1);
getURL(urlArray[urlocation],"_blank");
}//定义菜单方法.
}
JavaScript和Macromedia Flash的通信示例
原文地址: www.macromedia.com/support/flash/ts/documents/java_script_comm.htm
说明: 略作修改,主要是一些很初级的操作; 又很多相似的文章,不过这个很权威
下面是一些在Flash和使用Javascript的HTML文件直接通信的示例,每个示例都有简略的步骤
本文讨论了3种基本的Flash/Javascript通信方式:
Javascript 到 Flash的通信----使用Flash播放器的javascript方法
Flash 到 Javascript的通信----使用Flash的fscommand
Flash 到 Flash的通信----------使用本地连接对象或综合上2种技术
并不是所有的浏览器都很重视脚本.为了和Flash播放器通信,浏览器必须有内置的钩子以便Flash播放器可以'监听'.浏览器必须是下列的几种:
Netscape Navigator 3.0-4.7x, 和 Netscape 6.2或更高
(Windows 95/98/NT/2000/XP 或 MacOS; 允许Java和LiveConnect)
Internet Explorer 3.0 或更高
(仅Windows 95/98/NT/2000/XP; 允许ActiveX)
注意:Macintosh上的Internet Explorer和早期版本的Netscape6不支持这种方法.请查看本文的附加信息
Javascript到Flash的通信
这个例子演示了如何使用Flash的method把变量从HTML的input text 发送到该页面中的Flash文件中.HTML input的数据通过Flash的SetVariable方法传送到Flash文件中.
查看示例:示例
下载源文件: javascript_to_flash.zip(17k)
步骤:
Flash中
1.新建一个文件,保存为javascript_to_flash.fla
2.用文字工具在舞台上创建一个文本域
3.选择这个文本域,在属性面板中,从下拉列表中选择动态文本(Dynamic Text),在变量(variable)栏填上"myVar"
注意:最好的习惯是使用Instance,用myVar.text更改myVar的值.为了简单起见和兼容Flash4和Flash5,我们使用的是变量名的形式.
4.保存文件
5.发布HTML文件和SWF文件
Dreamweaver中
下一步的工作转移到Dreamweaver中了,当然也可以是其他的HTML编辑器
1.打开上一步发布的HTML文件
2.插入生成的SWF文件和OBJECT/EMBED标签
(1) Insert>Media>Flash,并选择这个Flash
(2) 切换到代码视图,我们需要修改被选中的<OBJECT>和<EMBED>标签
(3) 在OBJECT标签中,插入id="myFlash"
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/
flash/swflash.cab#version=5,0,0,0"
width=366 height=142 id="myFlash">
注意:如果你是粘贴复制代码的话,确保删除不必要的换行.否则可能会引起错误; id也可以在属性面板里直接输入
(4) 在EMBED标签中,插入name="myFlash"和swLiveConnect="true",确保没有使用id属性!代码应当是这样子的:
<embed src="javascript_to_flash.swf" quality=high width=366 height=142
type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?
P1_Prod_Version=ShockwaveFlash"
name="myFlash" swLiveConnect="true">
</embed>
3.创建表单域
(1) 回到设计视图
(2) 插入文本域(Insert> Form Object> Text Field),如果询问是否添加表单域,选择是
(3) 把文本域的HTML标签修改成这样:
<input type="text" name="sendText" maxlength="45" onChange="doPassVar(this)">
每当文本域内容发生变化时,onChange就被触发,doPassVar()函数就被调用
4.创建传递变量值的Javascript函数
复制下面的Javascript到<head></head>标签内
<SCRIPT LANGUAGE=JavaScript>
<!--
function doPassVar(args){
var sendText = args.value;
window.document.myFlash.SetVariable("myVar", sendText);
}
//-->
</SCRIPT>
浙公网安备 33010602011771号