其实我本人水平也不怎么样,今天之所以搞出个编程心得(主要是自己的一点点经验总结)的介绍,主要是想帮助有兴趣往深处研究AS的朋友,由于个人的水平有限,其中难免有谬误,欢迎大家讨论纠正。一来,帮助我进步;二者也是更重要的是,防止初学者养成不好的编程习惯! 废话说多了,下面开始:
一.FLASH有三个地方可以加代码,关键帧,MC(影片剪辑),按钮。
1.关键帧上加代码的灵活性很大,建议初学者:能写在MC或者按钮上的代码,就尽量不要写在关键帧上,关键帧上添加代码后,会出现一个a,如图一:
screen.width-333)this.width=screen.width-333" border=0
2.按钮上加代码的一般格式为:
on(mouseEvent){
statements;
} mouseEvent:触发事件关键字,表示要扑获得事件。
statements:任意行数的可以执行程序代码。 鼠标可扑获的事件如下:
press:当按钮被按下时触发该事件
release:当按钮被释放时触发该事件
releaseOutside:当按钮被按住后鼠标移动到按钮以外并释放时触发该事件
rollOut:当鼠标滑出按钮范围时触发该事件
rollOver:当鼠标滑入按钮范围时触发该事件
dragOut:当按钮被鼠标按下并拖拽出按钮范围时触发该事件
dragOver:当按钮被鼠标按下并拖拽入按钮范围时触发该事件
keyPress("key"):当参数(key)指定的键盘按键被按下时触发该事件 举个例子:
on(press){
_root.text="学习FLASH!"
}//当按下按钮时,主场景中的文本框显示文字:学习FLASH!
3.MC上加代码的一般格式:
onClipEvent(movieEvent){
statements;
}
movieEvent:触发事件关键字,表示要扑获得事件。
statements:任意行数的可以执行程序代码,表示隶属于该事件的程序代码块。
可扑获的事件如下:
load:当前 MovieClip 被装入并准备显示之前触发该事件
unload:当前 MovieClip 被卸载准备消失之前触发该事件
enterFrame:当前 MovieClip 每次计算帧上的内容时触发该事件
mouseMove:当鼠标移动时触发该事件
mouseDown:当鼠标左键按下时触发该事件
mouseUp:当鼠标左键抬起时触发该事件
keyDown:当键盘按键被按下时触发该事件
keyUp:当键盘按键被抬起时触发该事件
data:当前 MovieClip 接收到新数据时触发该事件 关于这个问题,可参看我的这个教程(其中都有详细的例子):
onClipEvent() 是影片剪辑事件管理动作。按照FLASH的编程规范,影片剪辑动作必须靠影片剪辑事件来触发,具体的触发条件条件可以在其参数区添加。其参数栏中的选项包括:Load Unload EnterFrame Mousemove Mousedown Mouseup Keydown Keyup Data (共9项)。下面依次介绍:
1.Load------影片剪辑元件在时间轴中出现时触发事件(不管影片剪辑是否完全载入,都触发),而且只触发一次!
2.Unload-------影片剪辑元件在时间轴中卸载时触发事件;
3.EnterFrame--------在播放影片剪辑元件中内容时,每播放一帧执行一次触发;
4.mouseMove--------每当鼠标移动时触发.鼠标位置的改变就会触发该事件.可以用_xmouse _ymouse属性确定当前鼠标的坐标;
5.mouseDown--------单击鼠标左键时触发;
6.mouseUp--------释放鼠标左键时触发;
7.keyDown--------按下键盘上某一键时触发;
8.keyUp--------释放键盘上某一键时触发;
9.Data------当接收到loadVariables或者loadMovie动作载入新的数据时触发;
具体应用举例参看下面的SWF:
这里再举一个简单的例子:
onClipEvent(load){
a=100;
b=0;
}//当MC被加载时给a b两个变量赋初值;
二.语法相关:
1.首当其冲的还是点语法,他是在编程时用来指明与某个对象的相关的属性和方法,还可用于标识对象的路径。
比如,要获取主场景中的Myball这个影片剪辑的x坐标值语法为_root.Myball._x。这其中还有一个必须引起注意,初学者常常以为这里的Myball是指给库里的对象命名,如图二:
screen.width-333)this.width=screen.width-333" border=0
其实这是不对的,在程序中出现的名字,我们习惯上称为实例名,其正确的命名方法是在场景中选定需要命名的对象,然后在其属性面板对其命名,如图三:
screen.width-333)this.width=screen.width-333" border=0
当然还有在加载外部的图片,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编辑区显示行号的方法,如图四:
screen.width-333)this.width=screen.width-333" border=0
点一下红色圈中的按钮,选中显示行号即可!其他按钮还可以实现很多辅助功能,自己去看一看就知道了!
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;
}
再次测试,一切正常,旋转速度随着输入数字的变化而变化 效果: