关闭

Action 初学

601人阅读 评论(0) 收藏 举报
第 1 部分: ActionScript 基础


第 1 章: 代码格式及规范
代码格式
ActionScript 的每行语句都以分号 ";" 结束. 不同于 BASIC 语言, ActionScript 语句同 C++, Java, Pascal 一样允许分多行书写, 即允许将一条很的长语句分割成两个或更多代码行, 只要在结尾有个分号就行了. 允许语句分行书写的唯一缺点是(至少对许多熟悉 BASIC 的人而言): 语句末尾不能忘记加分号. 语句分行唯一的限制是字符串不能跨行, 即两个分号必须在同一行.

分行书写长语句也是一个很好的排版办法, 例如下面的语句段(目前你不需理解下面的语句是什么意思, 在双斜杠后面是注释):

duplicateMovieClip( "MyOldMovieClip",    //旧的 MovieClip 实例名
                    "MyNewMovieClip", 999 );   //新复制的实例名和所在层次
setProperty( "MyNewMovieClipNameIsNewMC",   //要修改其属性的 MovieClip 实例名
             _alpha, "30");   //修改其透明度为 30%
但是在 Flash MX 中似乎自动格式化功能不是很完善. 上面的代码可以运行通过, 但在使用自动格式化时会出错. 问题就在于插入其间的注释语句. 毕竟上面我写的例子并不是很好地符合 Flash MX 的语法规范(但按照 C 语言的语法来看是绝对没问题的), 所以请记住: 只有在语句很长或是很复杂的情况下才使用多行书写.
--------------------------------------------------------------------------------

一个好的程序员会懂得在程序代码中加入注释. 但也许你会说: 没关系, 我知道我写的是什么. 但是假如你是在 1 个月后再读这段代码呢? 很明显, 你记不住. 所以多打几个字又有什么麻烦的?

给 ActionScript 代码加注释使用下面格式:

statements; //这是单行注释, 由双斜杠开头,这行的后面部份都是注释内容
statements; /* 这也是注释
               只不过可以换行 */
就这么简单(却又十分有用). 注意 /* 和 */ 已经不建议使用了(因为必须配对, 所以经常会导致错误).


--------------------------------------------------------------------------------
除了注释, 增加代码可读性的另一途径是使用代码排版格式. 下面是一段具有高可读性的代码:

//计算 x 阶乘的函数
function f(x) {
   if (x<=0) {  //假如 x 小于等于 0
     return 1;  //返回 1
   } else {
      return x*f(x-1);  //否则返回阶乘结果
   }
}

Flash MX 之前版本必须由程序员自行编排代码格式, 而 Flash MX 的 Action 面板多了一个 Auto Format (自动格式化)按钮 , 可以用它来自动格式化代码(同时也会进行语法检查, 相当方便). 格式化的选项可以在 Action 面板弹出菜单的 Auto Format Options 项对应的对话框中设置.
语法着色和代码提示
语法着色(Syntax Hightlighting)是许多编程语言的 IDE (集成开发环境)所具备的功能. Flash 也具有这项功能. 语法着色的颜色可以在 Action 面板弹出菜单的 Preferences... 项对应的对话框中设置.

对此, 没什么好详细解说的. 只是希望大家能利用语法着色来发现错误和阅读代码.

Flash MX 新增加的代码提示功能(Code Hints)对于熟悉 Visual Studio 6.0+ 版本的读者而言并不陌生. 例如在输入了一个对象名后再输入".", 就会显示相关的属性和方法列表; 在输入了函数名后输入"(", 就会显示相关的函数格式. 具体的可在输入代码时自己体会.

语法规范
关键字
关键字是任何一种语言程序的基本构造单位. 它是程序语言的保留字(Reserved Words), 不能被作为其它用途(不能作为自定义的变量, 函数, 对象名).

Flash 的 ActionScript 中关键字不是很多, 下面的它们的列表:

Flash MX ActionScript 的关键字
break 跳出循环体 instanceof 返回对象所属的类(Class)
case 定义一个 switch 语句的条件选择语句块 new 使用构造函数(Constructor)创建一个新的对象
continue 跳到循环体的下一项目 return 在函数中返回值
default 定义 switch 语句的默认语句块 switch 定义一个多条件选择语句块
delete 清除指定对象占用的内存资源 this 引用当前代码所在的对象
else 定义 if 语句返回为假时的语句块 typeof 返回对象的类型
for 定义一个循环 var 声明一个本地变量(Local Variable)
function 定义一个函数语句块 void 声明返回值类型不确定
if 定义一个条件语句块 while 定义一个条件循环语句块
in 在一个对象或元素数组中创建循环 with 定义一个对指定对象进行操作的语句块  

列出这些并不是要求你像背单词一样把它们背下来(这也是为什么中国的教育质量这么差的原因), 只是希望大家记住: 在 Flash 中有一些作为关键字的单词是不能随意使用的. 这在分析错误的时候是很有用的(特别对于初学者).

大小写敏感
同 C++ 和 Java 一样, ActionScript 是区分大小写的.

这就意味着: If 并不等于 if. 假如在代码中使用了 If, 在运行和检查时都会产生错误. 避免这种情况发生其实很简单: 多注意一下输入的代码是否自动地被语法着色了(Syntax Hightlighting).

但是对于变量(Variable), 实例名(Instance Name)和帧标签(Frame Label), ActionScript 是不区分大小写的. 尽管如此, 我还是建议大家在书写代码时保持大小写一致. 这是个很好的习惯.


运算符
除了关键字, 程序语言中最重要的组成部分就是运算符. 先不要说我死板, 因为不了解这些东西, 你什么也做不成.

下面是运算符的列表, 运算符的优先级(即几个运算符出现在同一表达式中时先运算哪一个)从上到下递减:

运算符
描述

+ 一元(Unary)加
- 一元(Unary)减
~ 按位(Bitwise)逻辑非
! 逻辑非(NOT)
not 逻辑非 (Flash 4 格式)
++ 后期(Post)递加
-- 后期(Post)递减
( ) 函数调用
[ ] 数组(Array)元素
. 结构(Structure)成员
++ 先期(Pre)递加
-- 先期(Pre)递减
new 创建对象
delete 删除对象
typeof 获得对象类型
void 返回未定义值
* 乘

/ 除
% 求模(除法的余数)
+ 加
add 字符串(String)连接 (过去的&)
- 减
<< 按位左移
>> 按位右移
>>> 按位右移 (无符号 unsigned, 以 0 填充)
< 小于
<= 小于或等于
> 大于
>= 大于或等于
lt 小于 (字符串使用)
le 小于或等于 (字符串使用)
gt 大于 (字符串使用)
ge 大于或等于 (字符串使用)
== 等于
!= 不等于
eq 等于(字符串使用)
ne 不等于 (字符串使用)
& 按位(Bitwise)逻辑和(AND)
^ 按位逻辑异或(XOR)
| 按位逻辑或(OR)
&& 逻辑和(AND)
and 逻辑和 AND (Flash 4)
|| 逻辑或 OR
or 逻辑或 OR (Flash 4)
?: 条件
= 赋值
*= /= %=
+= -= &=
|= ^= <<=
>>= >>>=  
复合赋值运算
,  多重运算  


写了这么一大版(也可以说是抄了), 有什么用? 你会发现这些运算符与 C++ 和 Java 的运算符没什么很大的区别, 无论是形式上还是功能上. 作为初学者你必须记住其中比较常用的部分(不常用部分的说明文字背景较暗). 这对你今后写表达式有很大帮助.

对于运算符的使用, 也有一些要注意的地方.
例如 and 和 or, 虽然对于效率而言与 && 和 || 没什么至关重要的区别, 但如果你过去使用过 BASIC, 你肯定会选择前者的表示方式; 假如你过去是使用 C++ 或是 Java 的, 那么你就会倾向于使用后一种方法. 就我个人的观点, 为了使代码具有高可读性, 初学者还是应该使用意思明了的 and 和 or.

特别是像 ?: 这类极其简化的运算符, 初学者更难以阅读. 例如下面代码:

x = 5;
y = 10;
z = (x < 6) ? x: y;  //如果 x 小于 6, 就把 x 的值赋给 z, 否则将 y 的值赋给 z
trace (z); //返回 5
从上例开始, 本教程中的所有范例代码都可以复制粘贴到新建的 Flash 动画的第一帧的 Action 里. 然后通过 Control 菜单的 Test Movie 项或是按下组合键 CTRL+ENTER 运行它. 这样你就可以看看这些代码有什么实际效果了. 当然你也可以试着改动这些代码, 通过改动的效果来理解教学的内容.

就不如下面的代码易于理解(尽管很冗繁):

x = 5;
y = 10;
if(x < 6){  //如果 x 小于 6, 就把 x 的值赋给 z, 否则将 y 的值赋给 z
   z = x;
} else {
   z = y;
}
trace (z); //返回 5
常量
常量是在程序运行中不会改变的量.

例如数值 1,2,3..., 逻辑值 true, false 等等. 另外还有一些系统内建的常量, 具体的可以看帮助文件的内容.

表达式
在 ActionScript 中最常见的语句就是表达式, 它通常由变量名, 运算符及常量组成. 下面是一个简单的表达式:

x = 0;
左边是变量名(x), 中间是运算符(赋值运算符 "="), 右边是常量(数值 0). 这就是一个非常简单的赋值表达式. 由这个表达式我们可以声明(Declare)一个变量, 为下一步操作做准备.

表达式又分为赋值表达式, 算术表达式和逻辑表达式.

赋值表达式上面已经说明了, 就是给变量一个值. 算术表达式顾名思义就是做数学运算的表达式, 例如: 1+3 (返回值为数值 4). 逻辑表达式就是做逻辑运算的表达式, 例如: 1>3. 只不过逻辑表达式返回的是逻辑值而已. 前面的 1>3 返回值为 false, 即 1 大于 3 为假.

将多个表达式组合在一起就可以组成复合表达式, 一般我们用到的也是这种表达式. 例如:

t = 3*3+(2+3);
x = 1>3;
上面的第二行是一个逻辑-赋值复合表达式. 首先 Flash 计算逻辑表达式 1>3 的值(false), 然后将该值赋给 x (即 x = false;). 对于复合表达式的运算顺序可以参考上面的运算符表. 要改变运算顺序可以使用圆括号(例子的第一行), 这是同其它语言一致的.

这一章就到此为止. 在下一章中, 我们将详细讨论 Flash 中的数据类型及变量的使用.


第 2 章: 变量及数据类型
变量
定义变量
变量是什么? 大概说来就是存放信息的容器(更确切的说是指向内存空间中某个存贮位置的指针, 不过能够理解就行了, 何必去记这么抽象的定义). 只要能够理解它可以存放信息并可以通过各种途径改变其中的信息就可以了, 我又不是大学里面的老师, 整天就知道叫学生死记硬背定义, 实际的东西一点都没有, "一切为了考试".
还有一个概念: 什么叫初始化变量? 就是在定义时给它一个有效值以说明它的内容和数据类型. 就像下面的例子, 定义了一个字符串(String)变量:

MyString = "我不懂什么是初始化变量";
就这么简单, 但是也有要注意的问题:

变量名必须为有效的标识符(例如不能以数字和不允许使用的字符开头).
变量名不能与 ActionScript 关键字和常量相似或相同.
变量名在它的作用域(Scope)中必须是唯一的(在下面我们会提到什么是作用域).
变量作用域
也就是变量在什么范围内是可以访问的. 就好像在 C&C: Renegade 中的任务一样, 没有 Security Level 3 的 ID Card 就进不了安全级别为 3 的区域的.

作用域一般说来有三种: 时间线(Timeline), 局部(Local), 全局(Global).

于时间线范围的变量, 就像上面的例子一样用 = 赋值并声明, 当然你也可以用 set 动作(Flash 4, 不推荐使用的方法, 除非你觉得代码不够长):

set( MyString, "我不懂什么是初始化变量" );
时间线范围变量声明后, 在声明它的整个层级(Level)的时间线内它是可访问的.

局部变量就是在声明它的语句块内(例如一个函数体)是可访问的变量, 通常是为避免冲突和节省内存占用而使用.

声明它可以使用 var 关键字:

function LocalVar(){
   var MyLocalString = "这是一个局部字符串变量";
   trace( "Inside: " + MyLocalString );
}

LocalVar();
trace( "Outside: " + MyLocalString );
上面的 MyLocalString 字符串变量在函数尾就会被自动清除出内存. 所以在外面的 trace 语句返回结果为空("Outside:"), 而函数体内的 trace 返回:"Inside: 这是一个局部字符串变量".

假如你删除了 var 关键字, 那么 MyLocalString 就成时间线范围的变量了. 运行后显示 Inside 和 Outside 都为 "这是一个局部字符串变量". 在后面的函数一章我们还会提到局部变量的内容.

也许你注意到了函数中有一个 trace 动作. 它可以在测试模式(Testing Movie, CTRL+ENTER 组合键)下把指定变量的值发送到输出窗口(Output Window), 以便在运行时检查处理变量的代码是否正常. 这是一个非常方便的检查方法, 在测试代码时经常使用.

在代码中如果遇到有不清楚的函数和关键字, 可以通过 Action 面板的参考按钮(Reference)打开参考面板显示光标所在位置关键字或内建函数以及对象的详细信息, 也可以通过组合键 SHIFT+F1 打开它
--------------------------------------------------------------------------------

全局变量, 顾名思义就是在整个 Movie 中都可以访问的变量. 它的声明比较特殊:

_global.MyGlobalString = "这是一个全局字符串变量";
声明使用了一个 _global 标识符和点语法(Dot Syntax, 将在后面的章节讨论). _global 标识符是在 Flash 6 中新增加的, 用于创建全局变量, 函数, 对象和类(Class, 不清楚类是什么的话可以看看 C++ 的书).

总的来说 _global 是一个与最底层 _level0 并列的对象. 所有的全局变量, 函数, 对象其实就相当于是它的属性, 方法, 子对象. 关于它的具体内容可以查阅帮助文件, 一般我们只要懂得用就行了.

全局变量不会被同名的时间线变量和局部变量屏蔽(Obscured), 也就是说, 它在 Movie 内的任何地方都是可访问的, 并且优先于时间线变量和局部变量访问.

在代码中使用变量
使用变量很简单, 有点编程基础的读者都可以办到. 下面用一个例子来说明在 ActionScript 中变量的使用:

function vars(x){
   if(x<5){       //如果 x 小于 1
      x = x + 1;  //x 加 1
   } else {
      x = 10;  //否则赋值 10
   }
   trace("x="+x);
   return x;
}

vars(2);
vars(6);
trace("x="+x);  //测试 x 是否为局部变量
函数声明中的参数无需加 var 声明也自动作为局部变量(例如上面例子中的 x). 通过上面例子的最后一句就可以看出来(返回值为空).

我们可以看到, 上面定义的函数中对局部变量 x (在函数参数中声明)进行了 4 种操作:

赋值: 就是改变变量所存贮的内容.
运算: 使用运算符运算并返回结果. 上例中的 x = x + 1 可视为一个运算操作(x + 1)和一个赋值操作(x = ...)的复合语句. 对于逻辑运算(上面 if 语句的条件), 返回的为逻辑值 true 或 false(就像 x<5 在 x 为 4 时会返回 true).
函数及命令调用: 就如上面 trace("x="+x); 中的一样, x 是被作为参数传递给函数的, 它代表的是它所存贮的实际内容(在 return x; 中也一样).
在 ActionScript 中变量的使用具有很大的灵活性, 下面我们将会针对不同的数据类型进行讲解.

常见数据类型
字符串 | String
一个字符串就是一系列的字符, 例如 "This" 就是一个字符串.

定义一个字符串变量很简单, 只要在初始化时将一个字符串数据赋给它就行了:

chapter = "第 2 章";
section = "第 2 节";
section_name = "常见数据类型";
full_name = section + " " add section_name + 999;  //连接字符串
if(typeof(full_name) ne "string"){
   full_name = "类型错误!";
}
trace("full_name=" + full_name);

上面的第 4 行的 full_name 的值是前面两个变量(section 和 section_name)和一个常量(999)的运算结果(使用了 + 和 add 运算符, 它们的功能是相同的). 请注意, 这行代码最后面的数值常量 999 不是同一类型的数据, 如果在 Pascal 这种数据类型检查极其严格的语言中这行代码是错误的. 但是 ActionScript 可以自动将它转换为字符串格式, 而不需要专门的函数(当然, 最安全的方法是使用 Number 对象的 toString() 函数或是 String() 函数). 由此可见, ActionScript 是一种弱类型检查的语言(即不严格限制各种数据类型间的运算和传递), 这和 VB 倒是有点相似, 只不过更过分一点.

在后面我用了一个 if 语句来测试后面加上 999 的代码是否运行正常(即检查表达式返回的值是否为字符串, 尽管在实际中并没有这个必要). 注意我用的是字符串类型专用的逻辑运算符 ne, 当然这只是为了表现字符串数据类型的特殊性, 实际应用中用 != 也就可以了. 对于 typeof 操作符, 我们会在这一章的末尾详细讲解.


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:49758次
    • 积分:760
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:10篇
    • 译文:0篇
    • 评论:0条
    powerbuilder
    无线电