Tags:ActionScript
在一个典型的使用脚本编辑的电影中,我们必须跟踪并操作每一件事情 —— 从帧的数字编号到用户的密码甚至是Flash游戏中的太空船发射出的光子鱼雷的速率。为了管理并操作所有这些信息,我们需要将它们存储在变量中,变量是ActionScript的主要信息存储容器。 一个变量就如同一个银行帐号,不同的是银行账号持有存款,而变量持有信息(数据)。创建一个新变量就如同设立一个新账号:我们建立一个场所(尽管它是虚拟的)用于存储未来需要的某些东西(钱和变量)。并且就象每个银行账号都有它的账号号码一样,每个变量也都有一个变量名。可以通过账号号码来处理(取出和存入)账号中的存款;同样地,可以通过变量名来访问变量中的数据。
一旦某个变量被创建,我们可以随时将新的数据放入其中 —— 如同向账号中存钱。或者我们可以通过使用变量名来发现该变量中存储的数据是什么 —— 如同查询账号的收支平衡表。如果我们不再需要该变量,可以象注销账号那样删除该变量。
需要注意的关键点是:变量让我们可以使用数据,这些数据在电影播放过程中既可以改变也可以用于计算。尽管银行账号的余额发生变化但是账号号码保持不变,同样地,尽管变量中包含的数据可以改变但是变量名是固定不变的;通过使用固定的变量名来访问变量中所包含的可变化的内容,我们可以完成复杂的数学计算、跟踪扑克游戏中的每个单牌、保存访客名册的输入、或者根据条件的改变派遣播放头到不同的位置,以及其他各种各样的任务。
你的眼睛兴奋地闪亮吗?很好,不过,我想那些关于银行账号的比喻可能让你迷惑,让我们通过观察如何创建变量来开始对其的探索。
2. 创建变量
创建一个变量在术语中称为声明。如果还使用银行账号的比喻,那么声明等同于“开设一个账号”,在这一步中我们正式地使变量事实存在。当一个变量被首次声明时,它是空的 —— 好像一张白纸等着你在上面写点什么,在这种状态下,该变量包含一个特殊的值,称为:undefined(未定义或无数据)。 为声明一个新变量,我们使用var语句。例如: var speed; var bookTitle; var x;
单词var告诉解释器我们正在声明一个变量,而随后的文本,如speed,bookTitle,或者x,都成为我们的新变量名。我们可以在任何能够附着代码的地方创建变量:一个关键帧、一个按钮、或一个电影剪辑。
我们也能够使用一个var语句来声明多个变量,象这样: var x, y, z;
不过,这样做削弱了我们为相邻的每个变量加注释的能力。
一旦某个变量被创建,我们可以为其赋值。但是,在我们学习如何为变量赋值之前,让我们考虑一些变量声明中的敏感细节。
1.变量自动生成 许多编程语言都要求在将数据存入变量之前必须首先声明变量;忽略声明会导致错误发生。ActionScript并不是那么严格,如果我们向一个并不存在的变量(未声明的变量)赋值,解释器会为我们创建一个新变量。银行,继续那个比喻,会自动地开设一个账号 —— 当你还没有账号但是试图做第一次存款时。
当然,这种便利需要代价。如果我们不主动声明变量,在检查代码的时候就不会有详细的程序清单作为参考;此外,用var语句显式地声明变量和由解释器隐式地声明变量(即允许自动生成变量)对比,有时会产生不同的结果。先声明然后使用(即显式声明)是最安全的方式,贯穿本书,我们将全部使用显式声明变量的方式。
2.合法变量名 在开始创建变量之前,首先要明了变量名: √ 变量名必须由且仅由字母、数字,和下划线组成。任何空格、破折号、或其他的标点符号都是不被允许的。 √ 变量名必须由且仅由字母或下划线开头。 √ 变量名必须不能超过255个字符。好吧,好吧,这是一句谎话,不过,如果你的变量名真的超过了255个字符,请重新评估一下你的变量命名策略吧。 √ ActionScript的变量名是大小写不敏感的。大写字母和小写字母被认为是完全一样的,尽管如此,你仍应该保持变量名使用的一致性。
这是一些合法的变量名: var first_name; var counter; var reallyLongVariableName; var i;
而这些是不合法的变量名,它们将导致错误的发生: var 1first_name; // starts with a number var variable name with space; // contains spaces var another-illegal-name; // contains hyphens
2.1创建动态命名变量 尽管动态地创建变量名是很罕见的情况,但是,程序化地产生变量名仍是可能发生的事情。从任何表达式中创建一个变量名都需要使用set语句。例如,我们把值“bruce”赋给变量player1name: var i = 1; set ("player" + i + "name", "bruce");
数组和对象为我们提供了跟踪动态命名数据的更有效的手段,并且它们将用于替代动态的变量名,这些将在以后的章节中讨论。
3.在程序开始处声明变量 在每个电影的主脚本区的开始处声明变量是很好的习惯。所谓的主脚本区通常是紧随在电影预载部分之后的第一个关键帧。为了以后能容易地辨识变量,请确保为每个变量加注释以解释其用途。组织良好的脚本开端应该看起来象这样: // ^^^^^^^^^^^^^^^^^^^^^^ // initialize variables // ^^^^^^^^^^^^^^^^^^^^^^ var ballSpeed; // velocity of ball, max 10 var score; // player's current score var hiScore; // high score (not saved between sessions) var player1; // name of player 1, supplied by user
我们可以在创建变量的同时给它们赋初值,象这样: var ballSpeed = 5; // velocity of ball, max 10, default 5 var score = 0; // player's current score var hiScore = 0; // high score (not saved between sessions)
3. 变量赋值
现在,进入这个有趣的部分 —— 将数据放入变量中。如果你仍在期待那个关于银行的比喻,那么这一步就是向账号中存款。为一个变量赋值,通常我们这样做: variableName = value; variableName所在处是变量名,value是我们赋予该变量的数据。下面是一个应用例子: cigaretteBrand = "555";
在等号左边,合成词cigaretteBrand是变量的名(标识符);等号右边,字符串“555”是变量的值 —— 即存入变量的数据;而等号被称为赋值运算符(或赋值操作符),它通知Flash无论等号右边是什么我们都要将其赋值给出现在等号左边的变量。如果等号左边的变量还不存在(未被声明),Flash会自动创建它(尽管依靠解释器隐式地创建变量不是我们推荐的方式)。
这里还有两个变量赋值的例子: speed = 25; output = "thank you";
第一个例子将整数25赋值给变量speed,这说明变量可以象包含文本那样包含数字。很快我们会看到变量也可以包含其他类型的数据。第二个例子将文本“thank you”赋值给变量output。注意,在ActionScript中,我们直接使用双引号("")来界定文本串。
现在让我们观察一个稍微复杂的例子,将表达式1 + 5的值赋给变量y: y = 1 + 5;
当语句y = 1 + 5;被执行时,首先,1与5相加,产生6,然后,6被赋值给变量y。等号右边的表达式先被求值(计算或判断),再将等号左边的变量设置为表达式求值的结果。下面,我们将包含变量y的表达式的求值结果赋值给另一个变量z: z = y + 4;
再说一遍,等号右边的表达式先被求值然后将结果赋值给等号左边的变量z。解释器取回y的当前值并与4相加;因为y值是6,z因此被设置为10。
将任何数据 —— 数字、文本、或其他的类型 —— 赋值给变量的语法并不考虑实际的数据类型。例如,至今我们并未学习数组,但是你仍能识别出下面的代码是变量赋值语句: myList = ["John", "Joyce", "Sharon", "Rick", "Megan"];
象以前的变量赋值语句一样,我们将变量名放置在左边,赋值运算符(等号)放置在中间,而我们希望赋给变量的值放置在右边。
将同一个值赋给多个变量,我们可以使用赋值运算符一个接一个地连接变量和值,象这样: x = y = z = 10;
变量赋值的工作总是从右到左地进行,上面的语句将10赋值给z,然后将z的值赋给y,再将y的值赋给x。
第四节.变量值的改变和取回
在我们创建一个变量之后,可以为其赋值;并且只要你愿意,就可以多次为其赋值。如下所示: var firstName; // declare the variable firstName firstName = "Graham"; // set the value of firstName firstName = "Gillian"; // change the value of firstName firstName = "Jessica"; // change firstName again firstName = "James"; // change firstName again var x = 10; // declare x and assign a numeric value x = "loading...please wait..."; // assign x a text value 注意,在上例中我们将变量x的数据类型从数字型改变为字符串型,而这只需要简单地赋给它一个我们想要的数据类型的值。有些编程语言不允许变量的数据类型直接发生变化而ActionScript则允许。
当然,如果以后我们不能取回变量的值那么创建变量并为其赋值就变得毫无意义。要取回变量的值,只要在需要使用变量值的任何地方简单地键入变量名就可以了。无论何时,只要变量名出现(除了在变量声明中以及在赋值语句左边的情况之外),就会被引用为变量的值。这是一些例子: newX = oldX + 5; // set newX to the value of oldX plus 5 ball._x = newX; // set the horizontal position of the ball movie clip to the value of newX trace (firstName); // display the value of firstName in the Output window
注意,在表达式ball._x中,ball是电影剪辑的名字,而._x指明了该电影剪辑的x轴坐标属性(即工作区中的水平位置)。以后,我们将学习更多关于属性的知识。上述例子中的末行 —— trace (firstName); —— 当脚本运行时在Output窗口中显示变量firstName的值,这对于调试你的代码来说是很便利的。
1.检查一个变量是否有值 有时候,在引用某个变量之前我们可能希望核实该变量是否已经被赋值。此前,我们学过,如果一个变量已经被声明但是从未被赋值那么它包含着特定的“非值” —— undefined。为确定某个变量是否已经被赋值,我们可以用关键字undefined与该变量的值相比较。例如: if (someVariable != undefined) { // any code placed here is executed only if someVariable has a value }
请注意不等号运算符(!=)的使用,它判断两个值是否不相等。
第五节. 变量值的类型
我们在ActionScript编程过程中所使用的数据有多种类型。迄今为止,我们已经看到过数字型和文本型,而诸如布尔、数组、函数,和对象等类型我们也将很快接触到。在我们触及每种数据类型的细节之前,先讨论一些与变量的使用密切相关的数据类型问题。 1.自动定义类型 在ActionScript中,任何变量都可以包含任何类型的数据。这看起来不值得注意,但是,某个变量中可以包含任何类型的数据的能力实际上是很不寻常的。象C++和Java这样严谨的编程语言使用既定义类型的变量;也就是说每个变量只能接受一种既定类型的数据,而此种类型必须在变量声明时明确指定。ActionScript变量是自动定义类型的变量 —— 当我们为某个变量赋值时,解释器为我们设置该变量的数据类型。
ActionScript变量不仅能包含任何数据类型,而且它们可以动态地改变数据类型。如果我们为某个变量赋一个新值,而该值与该变量原有值的类型不同,则该变量自动地被重新定义类型。综上所述,下面的代码在ActionScript中是合法的: x = 1; // x is a number x = "Micheal"; // x is now a string x = [4, 6, "hello"]; // x is now an array x = 2; // x is a number again
在C++和Java这样的编程语言中,自动地重新定义类型是不被支持的,类型不匹配的数据将被转换为变量现有的数据类型(或者会导致错误的发生 —— 如果该转换无法完成),而转换后的数据我们认为是不确定的(无法控制的)。在接下来的部分中我们将考虑自动定义类型和动态转换类型的一些重要概念。
2.自动的值转换 在某些环境中,ActionScript期待某种特定类型的数据。如果我们使用某个变量而该变量的数据值与期待的类型并不匹配,那么解释器会尝试转换该数据。例如,我们在需要数字的地方使用文本变量,为了适应当前的作业,解释器将试图转换该变量的文本值为某个数字值。在下面的例子中,z被设置为2。为什么?因为减号运算符(或称操作符,这两种说法并无明显区别,我将根据上下文关系来决定使用恰当的称呼)期待的是一个数字,所以变量y的值从字符串“4”转变为数字4,然后被6(x的值)减,产生结果2。 x = 6; // x is a number, 6 y = "4"; // y is a string, "4" z = x - y; // this sets z to the number 2
相反地,如果在某个期待字符串的地方我们使用数字变量,解释器则尝试将该数字转换为一个串。在下例中,z被设置为串“64”,而非数字10。这又是为什么呢?因为表达式x + y中的第二个操作数是个串,因此,加号运算符完成的是串连接而不是算术运算中的加法。x的值(数字6)被转变为串“6”,然后与串“4”(y的值)相连接,产生结果“64”。 x = 6; // x is a number, 6 y = "4"; // y is a string, "4" z = x + y; // this sets z to the string "64"
自动的类型转换发生在对作为表达式的组成部分的某个变量求值的时侯,转换的对象是该变量中所含数据的一个副本 —— 并不影响原始的变量类型。某个变量的类型只有在该变量被赋予某个与其现有值的类型不匹配的数据值时才发生根本转变。不好,不好,这太繁琐太复杂了,我写起来困难,你看着更是一头雾水,我们把这几句话打散,力求简洁明了。从上述两个例子开始:x + y和x - y是两个表达式,而变量x和y分别是表达式的组成部分,在语句z = x + y;和z = x - y;中,为了得到变量z的值,我们必须先对x和y求值,但是,在这两个语句中,变量x和变量y的类型分别是数字型和字符串型,也就是说两个操作数的数据类型不一致(不匹配),因此,就发生了自动的类型转换(解释器根据上下文环境决定变量所包含数据的类型),重要的是,你必须记住:此时被转换了类型的数据并不是变量所包含的原始数据,而是该原始数据的一个副本;换句话说,变量的类型并未改变,改变的只是变量中所包含的数据的一个副本的类型。既然如此,我们应该更进一步,了解变量的类型何时发生转变;举例说明,在赋值语句:x = 6;中,变量x此时的类型是数字型(一目了然),如果我们随后再次为变量x赋值:x = "abc";,现在,x的类型不再是数字型,而是字符串型(我们有时也称其为文本串型)。总结一下,变量x的原类型为数字型,再次赋值后变为字符串型,这是因为变量x最后被赋予的值("abc")的类型与此前变量所包含的值(6)的类型不一致,因此,出现了动态转换变量类型的情况,变量的类型发生了根本地转变。再回到上面两个例子中,因为并未对变量x和y重新赋值(赋不同类型的值),所以y最终仍保持为字符串型,而x也保持为数字型。
我想你一定注意到在上述两个例子中操作符的不同表现,z = x + y;和z = x - y;中的两个操作符(加号“+”和减号“-”)对这两个赋值语句有着意义深远的影响。在z = x - y;中,y的串值“4”转换成为数字值4;而在z = x + y;中,发生了相反的情况,x的数字值6变成串值“6”。这是因为对于操作符“+”和操作符“-”来说,存在着迥然而异的数据类型转换规则。我们将在以后的章节中详细讨论数据类型转换规则以及操作符。
3.手工确定类型 自动的数据类型定义和转换会带来便利,但是,正如上述例子中所描述的那样,可能会产生意外的结果。对不同类型的数据或变量进行操作的命令在开始执行之前,你或许想要首先确定某个变量的数据类型;此时可以使用typeof操作符: productName = "Macromedia Flash"; // string value trace (typeof productName); // displays: "string" on the Output window when you run the script
一旦我们知道了某个变量的类型,我们可以有选择地进行下一步处理。例如,在运行某段代码之前我们先检查该代码段中的某个变量是否是数字型: if (typeof age == "number") { // okay to carry on } else { trace ("age isn't a number"); // display an error message }
关于typeof操作符的所有细节我们将在以后专门讨论 转载请注明出处-零柒动力-07er.com |