ActionScript 2.0 简介/属性和方法
关键概念
- 属性和方法
- 全局函数和变量
- 主时间轴作为 MovieClip
- 点访问
this
,this._parent
with
- 使用 [] 访问属性
- 基本 MovieClip 方法和属性
- 使用构造函数进行初始化
- 对象字面量
null
,undefined
属性和方法是构成类的两个组成部分。属性 是属于特定类的变量。方法 是属于特定类的函数。本章将介绍这对重要的组合。
ActionScript 提供了大量内置函数。其中一些函数是内置类的(如 MovieClip 和 Math)方法。本章以及本书的第二部分将讨论这些函数。其他内置函数不属于内置类。它们可以在您需要的时候、您文件中的任何位置使用。我们心爱的 trace()
就是其中之一。这些函数被称为顶层函数 或 全局函数。
全局变量是在任何地方都可以访问和更改的变量。_quality
变量就是一个很好的例子:它会影响整个 SWF 的质量。它们由 Flash 提供。[1]
我们在此打断本章,为您带来重大新闻!
既然您已经看到了本章,是时候告诉您这个消息了:主时间轴(您一直都在工作的时间轴)是一个 MovieClip 实例。
这意味着什么?
请记住,所有对象都有属性和方法。因此,主时间轴有各种内置属性和方法需要我们学习。我们将在本章学习其中的一些,并将剩余的部分留到下一部分。
还需要记住的是,您拖放到舞台上的任何内容以及您在主时间轴上声明的任何变量都是主时间轴的属性。之所以可以向实例添加新属性,是因为 MovieClip 是一个动态类。我们将在第三部分讨论动态类。
访问另一个对象属性最常见的方法如下
objectName.propertyName
请注意,为了使此方法有效,我们必须确保 propertytName 是我们正在处理的对象的属性。
让我们尝试一下。打开 Flash。在库中创建一个新的 MovieClip。在其中绘制一个苹果,然后将其拖放到舞台上的任何位置。将其实例名称设置为 'apple'。[2] 现在再次点击苹果。在第一帧上,输入 var juiciness:Number = 5
。(请记住:您在时间轴上声明的所有变量都是该 MovieClip 的属性。)输入以下代码
代码 | 结果 |
---|---|
trace(apple.juiciness);
|
|
在此代码中,我们使用点运算符跟踪了苹果的 juiciness 属性。
this
用于指定当前位置。例如,如果您在主时间轴上,则 this.crunchiness 将返回主时间轴的 crunchiness 属性。让我们再次使用 this
尝试一下我们的苹果示例。
代码 | 结果 |
---|---|
trace(this.apple.juiciness);
|
|
这与之前相同,只是它明确指出 apple 是当前对象(主时间轴)的属性。如您所见,this
并不总是必要的。
必须使用 this
的一种情况是参数和时间轴变量具有相同的名称。在这种情况下,必须在时间轴变量之前放置 this
,以便计算机知道您不是在谈论局部变量。以下是一个示例
代码 | 结果 |
---|---|
var someString:String = "random text";
function stringTogether(someString:String):String{
return (someString + " " + this.someString);
}
trace(stringTogether("even randomer text"));
|
|
在此示例中,return (someString + " " + this.someString);
将局部变量 someString、一个空格字符以及时间轴变量 someString 连接在一起。
到目前为止,我们只从主时间轴引用了苹果。是否可以从苹果中引用主时间轴?答案是:可以,这涉及到 _parent
。
打开包含苹果的 Flash 文件,然后输入以下代码
代码 | 结果 |
---|---|
在主时间轴的第一帧中 var crunchiness:Number = 7;
在苹果符号的第一帧中: trace(this._parent.crunchiness);
|
|
在此示例中,苹果包含在主时间轴中,因此主时间轴是苹果的“父级”。现在假设您在苹果中放了一条虫子,并希望从虫子中引用主时间轴。没问题:您可以根据需要添加任意数量的 _parent
层
代码 | 结果 |
---|---|
在主时间轴的第一帧中 var crunchiness:Number = 7;
在虫子符号的第一帧中: trace(this._parent._parent.crunchiness);
|
|
虫子的父级是苹果,苹果的父级是主时间轴。就像魔法一样有效!
现在假设这条虫子要踏上旅程,以降低主时间轴的脆度和甜度以及苹果的汁液度。我们可以这样做
代码 | 结果 |
---|---|
在主时间轴的第一帧中 var crunchiness:Number = 7;
var sweetness:Number = 4;
在苹果符号的第一帧中: var juiciness:Number = 6;
在虫子符号的第一帧中: this._parent._parent.crunchiness--;
this._parent._parent.sweetness--;
this._parent.juiciness--;
trace(this._parent._parent.crunchiness);
trace(this._parent._parent.sweetness);
trace(this._parent.juiciness);
|
|
现在假设我们懒得多次输入 'this._parent'。我们可以使用 with
来解决此问题
代码 | 结果 |
---|---|
在主时间轴的第一帧中 var crunchiness:Number = 7;
var sweetness:Number = 4;
在苹果符号的第一帧中: var juiciness:Number = 6;
在虫子符号的第一帧中: with(this._parent){
_parent.crunchiness--;
_parent.sweetness--;
juiciness--;
}
trace(this._parent._parent.crunchiness);
trace(this._parent._parent.sweetness);
trace(this._parent.juiciness);
|
|
这样就省去了三次输入 this._parent 的麻烦。计算机只需要解释您的代码,在代码块中的每个语句之前附加 this._parent 即可。
有时,我们需要将属性名视为字符串,以便我们可以连接多个字符串以形成属性名。以下是一个示例
代码 | 结果 |
---|---|
var currentAnimal:String = "cat";
var dogFood:String = "biscuits";
var catFood:String = "fish";
var fishFood:String = "smallerFish";
trace(this[currentAnimal + "Food"])
|
|
在此示例中,我们将 currentAnimal ('cat') 和 'food' 连接起来以形成属性名 catFood,返回字符串 'fish'。[3]
在第二章中,我们学习到,通过将除原始数据类型以外的任何类型分配给变量,我们实际上是在变量中放置指向该对象的链接。我们也可以使用变量访问对象的属性
代码 | 结果 |
---|---|
在主时间轴的第一帧中 var someFruit:MovieClip = apple;
trace(apple.juiciness);
trace(apple["juiciness"]);
在苹果符号的第一帧中: var juiciness:Number = 6;
|
|
以下是本部分其余部分将使用的一些 MovieClip 属性。[4]
- _x 和 _y(都是数字)表示 MovieClip 相对于其父级的定位。请记住,在 ActionScript 中,_y 的值越大,MovieClip 的位置越低。原点 (0,0) 位于左上角。如果您熟悉笛卡尔平面,这可能与直觉不符。
- _width 和 _height(都是数字)分别表示 MovieClip 的宽度(水平)和高度(垂直)尺寸。
- _visible 表示 MovieClip 是否可见。如果 _visible 为 true,则 MovieClip 可见,反之亦然。
- _currentframe 表示 MovieClip 当前所在的帧。
_x、_y、_width、_height 和 _visible 都可以通过为它们分配不同的值来更改。再次打开包含苹果的 Flash 文件,并输入以下代码
apple._x = 100;
apple._y = 200;
apple._width = 100;
apple._height = 100;
您应该会在苹果的位置和尺寸方面发现明显的变化(当然,除非您的苹果碰巧在舞台上具有完全相同的位置和尺寸!)。
与其他属性不同,_currentframe 不能用赋值语句更改。相反,使用多个函数来操作当前帧。
play()
和stop()
将分别按顺序播放和停止播放帧。默认值为播放,因此,无论何时您想在某个帧处停止,都应添加stop()
代码。例如,如果您在前五帧中没有任何内容,然后在第六帧中添加stop()
,Flash 将播放到第六帧。gotoAndPlay(frame)
和gotoAndStop(frame)
将分别转到指定的帧,然后播放和停止 Flash。如果在 gotoAndPlay 的目标帧上存在stop()
语句,Flash 将停止,如果在 gotoAndStop 的目标帧上存在play()
语句,Flash 也将停止。prevFrame()
和nextFrame()
分别转到上一帧和下一帧。除非在目标帧上存在stop()
语句,否则它们将播放。
将在第二部分中介绍更多属性和方法。
如何调用另一个对象的方法?
[edit | edit source]调用另一个函数的方法就像访问它们的变量一样容易。只需在通常的函数调用之前加上相应的变量名称或地址和一个点。假设我们有一个带有半咬苹果的第二个帧,该帧位于我们的苹果 MovieClip 上。
代码 | 结果 |
---|---|
在主时间轴的第一帧中 apple.nextFrame();
在苹果符号的第一帧中(一个完整的苹果,包括一条虫子): stop();
trace("First frame!");
在苹果符号的第二帧中(一个半咬的苹果): stop();
trace("Second frame!");
|
|
在此示例中,当虫子符号初始化时,它会跟踪“第一帧!”,但主时间轴会很快使苹果符号转到第二帧。
什么是构造函数?
[edit | edit source]构造函数是类最重要的方法。它用于初始化类的实例。还记得我们在第一章中学到的初始化语法吗?虽然它对基本数据类型来说非常有效,但它对复合数据类型(您不能直接在其中输入)来说更加复杂。
我们将在第三章学习如何制作自己的构造函数。现在,让我们坚持调用构造函数。调用构造函数的语法如下:[5]
var variableName:DataType = new DataType(parameter1, parameter2);
例如,假设有一个 Dog 类,我们想要创建一个新的 Dog 实例。如果构造函数中有两个参数,物种和颜色,我们应该编写以下代码
代码 | 结果 |
---|---|
//Assume there is a Dog class.
var spot:Dog = new Dog("chihuahua", "black");
trace(Dog.species);
trace(Dog.colour);
|
|
这会创建一个新的 Dog 类的 spot 实例,其物种为“吉娃娃”,颜色为“黑色”。
当基本数据类型初始化时,也可以将构造函数应用于它们。这将在第二部分中介绍。
可以在变量声明/赋值语句之外使用构造函数类。这将创建一个没有温暖舒适的变量家的实例。
代码 | 结果 |
---|---|
trace(new Number());
|
|
什么时候不需要构造函数?
[edit | edit source]首先,基本数据类型通常不需要构造函数,因为它们可以使用它们的文字进行初始化。例如,var someString:String = "Wikibooks" 可以,您不必编写 someString:String = new String("Wikibooks")。[6]
我们也不需要在 Object 类上使用构造函数。(还记得 Object 类吗?它是所有类的鼻祖。)相反,它可以像这样生成:[7]
var variableName:Object = {property1:value1, property2:value2, ..., method1:function1, method2:function2 ...};
function1、function2 等应替换为将函数放入变量的语法(我们在函数章节中已经见过)。看看这个例子
代码 | 结果 |
---|---|
var someObject:Object = {
crunchiness:7,
juiciness:5,
eat:function(){
trace("Mmmm! It's " + this.crunchiness + " on the crunchiness scale and "
+ this.juiciness + " on the juiciness scale.");
}
};
trace(someObject.crunchiness);
someObject.eat();
|
|
创建一个新对象,其脆度为 7,多汁度为 5。
什么是 null
和 undefined
?
[edit | edit source]在计算机科学中,如果一个值是 null 或 undefined,则其中什么都没有。例如,数据库表中的键字段必须是唯一的且非空,这意味着它不能为空。在 ActionScript 中,null
和 undefined
是两个灵活的、通用的值,可以放入任何类型的变量中。尚未定义的变量(即您尚未为其分配任何值,也尚未调用其构造函数)会自动设置为 undefined。Null 和 undefined 被认为是具有正常相等运算符的等效值(即 null == undefined
返回 true
),但不是严格相等运算符(即 null === undefined
返回 false
)。考虑以下示例
代码 | 结果 |
---|---|
var someNumber:Number;
trace(someNumber);
someNumber = null;
trace(someNumber);
var someString:String = undefined;
trace(undefined == null);
trace(undefined === null);
|
|
在此示例中,someNumber 最初为 undefined
,然后设置为 null
。接下来,someString 设置为 undefined
。(这只是为了表明 undefined 可以放入任何数据类型中。)最后,发现 undefined 等于 null,但不是严格等于 null。
在使用 null
和 undefined
时,应该更加小心地使用 ! 运算符。
代码 | 结果 |
---|---|
var someBoolean:Boolean;
trace(!someBoolean);
var someNumber:Number;
trace(!someNumber);
|
|
在第一个跟踪中,someBoolean 未定义。!someBoolean 表示“someBoolean 不为真”,这与“someBoolean 为假”不同。由于 someBoolean 未定义,它“不为真”(但也不为假),因此 !someBoolean 为真。还要注意,当一个数字未定义时,可以使用 ! 运算符,如第二个跟踪语句所示。
笔记
[edit | edit source]- ↑ 也可以像这样定义自己的全局变量:_global.variableName = value;请注意,全局变量不是强类型。定义自己的全局变量是一种不推荐的做法,应该谨慎使用。
- ↑ 您可以在属性面板中更改任何 MovieClip 的实例名称。
- ↑ 事实上,这种语法比看起来更复杂,但让我们保持悬念,直到第三部分。
- ↑ 在 ActionScript 3.0 中,所有前导下划线都被取消了。
- ↑ MovieClip 和 TextField 类的实例是用特殊方法创建的。我们将在第二部分中讨论它们。
- ↑ 这两者之间存在细微差别。“Wikibooks”只是一个基本字符串文字,而 new String("Wikibooks") 是 String 包装类的对象。我们将在第二部分中了解更多信息。
- ↑ 请注意,括号中包含的部分也被视为对象的文字。