转 第二章 ActionScript 3.0 动画基础(2)(as3.0)

用as3(actionScript3.0)实现简单的时间轴以及动画播放暂停 拖拽素材 / 将素材添加到时间轴上,并设置其默认显示时间为2秒。//// // 如果运动完成,则停止计时器。// // 如果旋转完成,则停止计时器。// 加载图片,并将其添加到播放器容器中。// 压缩图片,并将其添加到播放器容器中。// // 更新显示对象的旋转角度。// 创建素材对象,并添加到素材数组中。// // 定义一个变量,用来记录旋转的角度。//// 计算运动的进度。//// 计算旋转的角度。 阅读详情

帧循环
     帧循环的理念,存在于 Flash 最早的版本中,那时 ActionScript 还不像今天那么强
大。把代码写入关键帧,并在下一帧中写入像 gotoAndPlay 这样的语句,使播放头(playhead)
回到前一帧。这样两帧之间就形成了一个无限循环,每当播放头到了代码帧上时,就会执行
那些代码。例如,在舞台上有一个实例名为 ball 的影片剪辑。
第一帧的代码就像这样:
ball.x ++;
第二帧的代码如下:
gotoAndPlay(1);
    实际上第二帧不需要做任何事,只是让时间轴自动回到第一帧而以。另一个版本是建立
三个帧,第一帧进行初始化,写入只执行一次的代码,不进行循环。第二帧才是主要的执行
代码,第三帧只写 gotoAndPlay(2); 这个方法在早期 Flash 版本中常被使用,虽然有点过
时,但是同样可以出色地完成任务。马上我们还要学到更灵活更强大的设置方法,但今后你
会发现其实原理上是一样的。
影片事件
     影片事件在 AS 3 中彻底的消失了,这真是件好事。但还要捎带提一下,回顾 Flash 5
的时代,只有帧循环和影片剪辑事件两种选择。影片事件指代码直接写在影片剪辑上,而不
是帧上。如何实现影片事件,首先选择舞台上的影片剪辑,然后打开动作面板并将代码写在
上面,这些代码只对该影片剪辑有效。所有代码必需写在事件块中,比如:
onClipEvent(eventName){
// code goes here
}
     对于 onClipEvent(eventName),作用于 eventName(某种事件)。对于"on"类型事件则
必需指定鼠标或键盘事件,如按下(press)和释放(release)。
     事件名称(eventName)是指许多 Flash 影片事件之一,所谓事件就是在影片中发生的
事。事件分为两种:系统事件和用户事件。系统事件指发生在如计算机,Flash,或影片上
的事件,比如调取数据,调取信息,或播放帧等。用户事件是指用户所做的一些事,基本上
就是鼠标和键盘两种。 影片事件使用得最多的就是 load 和 enterFrame 这两个。 Load 事
件会在影片第一次出现在舞台上时才执行, 且只执行一次。 所以说非常适合在这里面写入初
始化代码。只要把代码写在大括号间即可:
onClipEvent(load){
// initialization code
}
我们可以把带有如下代码的影片剪辑放入时间轴上(注意:此处为 AS 1 写法):
onClipEvent (load) {
  this._x = 100;
  this._y = 100;
}
onClipEvent (enterFrame) {
  this._x += 5;
}
     本书示例中的代码不使用这种写法(因为它已经不是一种语言了),但不论使用何种方
法, 初始化(initialization),重复动作(repeating actions)和屏幕刷新(screen refresh)
都是非常重要的。
事件及事件处理
    Flash MX 的 ActionScrpt 发生了重要的改变,这些转变与革新为 Flash 成为真正的
富客户端程序(RIA)奠定了基础。其中一个就是全新的事件结构,在编写非常复杂的行为时
比之前的版本好用很多。 Flash MX 之前的版本,只能把代码放在影片和按钮的
onClipEvent(eventName) 或 on(eventName) 这两种事件处理方法中。这就意味着,在设计
的时候就要把影片剪辑放到舞台上,并把代码写入影片剪辑中。MX 的事件结构并不完美,
但与之前版本来说已经有了长足的进步,并允许我们在任何时候访问任何事件,或是停止处
理任何事件,或是动态改变某个事件的行为,可以想象这有多么的强大和灵活。
    要想了解事件,就要明白下面几条概念:侦听器(lintener)与处理函数(handler),这
两个名字很贴切,侦听器就是侦听事件的对象,处理函数是一个用于处理所要发生的事件的
函数。侦听与处理在 ActionScript 的发展过程中进行过很多次演变,在 AS 2 中就有很多
不同的实现方法。为了避免混乱,我很推崇 AS 3,因为它简化了这个过程,使事件处理变
得更方便更一致。
事件侦听器与处理函数
    前面说过,侦听器是一个用于侦听事件的对象。我们可以设计一个类,通过调用
addEventListener 函数为某事件指定一个侦听器。输入要侦听的事件名称以及要执行处理
的函数名称。看一个例子:
addEventListener("enterFrame", onEnterFrame);
    在加入事件侦听器时,可使用可选参数,本书中不会用到;对于大多数的应用程序来说,
会使用以上这种写法就够用了。请注意事件名"enterFrame"为字符串型,戏称它为“魔力字
符串”(Magic String)。为什么这么叫?如果你误输入成了"entorFrame",尽管没有这个事
件名称,编译器也会编译执行它,会发现事件处理函数没有执行。但 AS 3 仍会对其进行处
理,除了使用“魔力字符串”以外,还可以使用事件类(Event Class)的属性。例如:
addEventListener(Event.ENTER_FRAME, onEnterFrame);
    实际上 Event.ENTER_FRAME 的值就是”enterFrame”这个字符串。那么这个属性也可
能输错就像 Event.ENTOR_FRAME ,但这种方法好在,如果输入错误了,程序会拒绝编译,
并提示你在事件类中不存在该属性。编译器会提示发生错误的行及确切的字符。所以,最好
使用这种方法,除非编译器会帮我们修正错误或编写代码。
除此之外,还有其它的事件类型如:MouseEvent.MOUSE_DOWN,KeyboardEvent.KEY_DOWN,
TimerEvent.TIMER 等。这些都由 "mouseDown" , "keyDown" , "timer" 这样的简单字符串
来表示,如果你记不住这些字符串,那么最好就去使用事件类的属性。
    另一个重点是,使用 addEventListener 函数直接调用类中的函数。有时,需要侦听另
一个对象产生的事件,例如,有一个名为 mySpriteButton 的 Sprite 影片(Sprite):影片
或按钮,能完成按钮的动作。当用户点击它的时候就会产生 mouseDown(鼠标按下)事件。侦
听该 Sprite 影片的 mouseDown 事件, 就要调用该对象的 addEventListener 方法,如下:
mySpriteButton.addEventListener(MouseEvent.MOUSE_DOWN, onSpritePress);
    最后一点,必需要有事件处理函数如 onEnterFrame,在 AS 3 中,可以任意地为事件
处理函数命名,这点与以前的 ActionScript 不同。在 enterFrame 示例中,使用
onEnterFrame 做事件处理函数, 是因为我们习惯使用这个名称。 AS 3 中,
                                                          在         onEnterFrame
已不再是关键字,当然也可以为这个处理函数命名为 move,run,或是 doSomethingCool。
然而,我们已经习惯使用”on”表示事件开始,后面跟一些描述词如 onStartButtonClick,
onConfigXMLLoad 或 onRoketCrash。有些朋友喜欢在事件名后面加上 "Handler" 作为后
缀,如: enterFrameHandler,这只是个人偏好问题。
      侦听器用于侦听事件,但对于一个侦听器来说,也许会同时侦听很多事件。在系统内部,
一个事件对象拥有一个包括了所有对象及自身的侦听器的列表。  如果一个对象能够产生多种
不同类型的事件,如 mouseDown,mouseUp,mouseMove 等,那么它就拥有一个侦听器列表,
其中包括它所涉及的所有类型的事件。无论触发何种事件,都会检索一遍列表,然后使列表
中的每个对象都知道所发生的事件。
另一种对事件的描述是,  将其看作一个加入到事件行列的侦听器成员。产生事件的对象将它
所产生的事件公布给所有成员,  当你不再需要这个对象进行侦听时,可以令其停止侦听或使
用 removeEventListener 方法解除该成员;就是告诉对象从侦听器列表中删除该侦听器,
这样一来,他就不会再接收信息了。
      让我们看看这段代码,下面是一段在舞台中创建 Sprite 影片,并进行绘图,然后再为
其添加侦听器的代码:
package {
  import flash.display.Sprite;
  import flash.events.MouseEvent;
  public class EventDemo extends Sprite {
   private var eventSprite:Sprite;
   public function EventDemo() {
     init();
   }
   private function init():void {
     eventSprite = new Sprite();
     addChild(eventSprite);
     eventSprite.graphics.beginFill(0xff0000);
     eventSprite.graphics.drawCircle(0, 0, 100);
     eventSprite.graphics.endFill();
     eventSprite.x = stage.stageWidth / 2;
     eventSprite.y = stage.stageHeight / 2;
     eventSprite.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown);
     eventSprite.addEventListener(MouseEvent.MOUSE_UP,onMouseUp);
   }
   private function onMouseDown(event:MouseEvent):void {
     trace("mouse down");
   }
   private function onMouseUp(event:MouseEvent):void {
     trace("mouse up");
   }
  }
}
      在初始化函数(init)中创建一个 Sprite 影片,并在里面画圆,置于舞台中心,最后两
句是为它添加两个侦听器,侦听鼠标按下(MOUSE_DOWN)和鼠标弹起(MOUSE_UP)这两个事件。
它们是 MouseEvent 类的两个属性,而这个类必需要导入。最后定义两个处理函数
onMouseDown 和 onMouseUp。
      由事件对象调用事件处理函数,通常还会包括一些事件信息。在处理鼠标事件时,就包
括触发该事件时鼠标位置的信息如:鼠标点击在按钮上。对于键盘事件,就要包括按下键时
的信息如 Ctrl,Alt,Shift 等。把上述示例保存为 EventDemo.as 文件,并选择一种前面
讲过的编译方式。当运行 SWF 时,就会看到每次点击或图形时,都会输出 pressed 或
released。
动画事件
      我们希望能够使用代码让物体动起来,并允许屏幕反复地刷新。前面看过一个使用
enterFrame 影片事件的示例。现在把这种方法运用到 AS 3 中,只需要增加一个
enterFrame 事件的侦听器即可:
addEventListener(Event.ENTER_FRAME, onEnterFrame);
      别忘了导入 Event 类,并创建一个名为 onEnterFrame 的方法。人们常常迷惑,只有
一帧怎么能执行 enterFrame(进入帧) 事件呢?事实上,播放头并非真正地在进入下一帧,
它只停留在第一帧上,  并不是把播放头移动到下一帧才形成了 enterFrame 事件,而是用另
一种方法:Flash 告诉播放头何时进行移动,可以把 enterFrame 看成一个定时器,只是有
些不精确。
下面我们看看第一个 AS 3 动画:
package {
  import flash.display.Sprite;
  import flash.events.Event;
  public class FirstAnimation extends Sprite {
   private var ball:Sprite;
   public function FirstAnimation() {
     init();
   }
   private function init():void {
     ball = new Sprite();
     addChild(ball);
     ball.graphics.beginFill(0xff0000);
     ball.graphics.drawCircle(0, 0, 40);
     ball.graphics.endFill();
     ball.x = 20;
     ball.y = stage.stageHeight / 2;
     ball.addEventListener(Event.ENTER_FRAME, onEnterFrame);
   }
   private function onEnterFrame(event:Event):void {
     ball.x++;
   }
  }
}
      init 函数创建了一个名为 ball 的 Sprite 影片,并为其建立事件侦听。
onEnterFrame 函数负责 ball 的运动及屏幕刷新工作。这是学习本书内容的基础,也是使
用 ActionScript 创建动画的基础,所以务必要掌握。
显示列表
      在 AS 3 之前,人们可以创建多个不同类型的可视化对象,包括影片剪辑,图形,按钮,
文本框,位图,组件和基本形状。这些对象没有真正的层次结构,它们的创建、删除、操作
方法也均不相同。比如,在 IDE 中,可以使用 attachMovie ,duplicateMovieClip 或
createEmptyMovieClip 的方法将影片剪辑放置于舞台上,文本框可以在开发环境中创建也
可以用代码创建。而在使用位图(bitmap),视频(video)及组件(component)时,它们就像是
来自于别的星球,最终被强硬地放在一起。
      对于 AS 3 来说,这些对象都有了统一的归属。在舞台上所有可见的对象都继承自
DisplayObject 类。换句话讲,这些对象都是一个大家庭的成员,并以相同的形式工作,使
用同样的方式进行创建,置入,删除,操作。无论创建 Sprite 影片,影片剪辑或文本框的
方法都非常相近,我们需要使用 new 关键字来完成,创建任意类型的对象。为了证明这一
点,请看下面三条示例:
var myTextfield:TextField = new TextField();
var myMovieClip:MovieClip = new MovieClip();
var mySprite:Sprite = new Sprite();
如果我们创建的是一个影片剪辑或 Sprite 影片的话,就可以直接里面进行绘制,如:
mySprite.graphics.beginFill(0xff0000);
mySprite.graphics.drawCircle(0, 0, 40);
mySprite.graphics.endFill();
    但只有这些代码,还不能看到效果,这就引发了接下来要讨论的显示列表。“显示列表”
是个新名词,可以理解为一颗由可视对象构成的树。舞台就是树根,默认为可见的,在舞台
上,我们可以有很多影片剪辑或可视对象(文本框,图形等),把它们加入舞台后,也就成为
可见的了。
    这些影片中也许还嵌套着很多层的可视对象,这就是我们所谓的显示列表。 AS 2 与 AS
3 显示列表最大的不同在于,AS 2 中,当使用 attach 或 createEmptyMovieClip 方法创
建影片剪辑时,必须指定它位于树的哪个位置。这样一来,影片剪辑要放置在列表的指定位
置。当删除该影片时,同样也无法改变它在列表中的位置或在列表中移除它。
    在 AS 3 中,创建了一些 Sprite 影片后,不会自动被加入显示列表。在上面的示例中
我们发现,创建一个 Sprite 后,并不涉及父级影片(parent)或深度(depth)的问题,这样
就可以在它没有加入视觉列表之前就对其进行操作了。说到舞台(Stage),可以把这些显示
对象看作是幕后的演员,虽然看不到,但确实存在,并时刻准备着亮相的一刻,我们使用
addChild 方法把对象加入显示列表。将文档类作为树根,向里面加入孩子时,会自己被设
置为可见的。
现在,在前面的例子中再加入创建 Sprite 对象以及 addChild 方法,如下:
var mySprite:Sprite = new Sprite();
mySprite.graphics.beginFill(0xff0000);
mySprite.graphics.drawCircle(0, 0, 40);
mySprite.graphics.endFill();
addChild(mySprite);
     如果大家有兴趣试一下这段代码的话,请把它们写入前面所给的类框架的 init 函数
中。请注意,绘制出的圆默认位置是 0,0 点,可以改变其 x 和 y 属性。还要注意,创建新
影片时不再需要像 AS 2 那样去设置深度(depth)。虽然深度管理为自动执行,但我们还有
指定深度或改变深度的方法,这部分等将来用到时再讲。
使用 removeChild 方法,从显示列表中删除一个对象,并以该对象的名字作为参数。第一,
删除一个对象,不是去毁灭它,对象依然保持原样,只是暂时被移除,当再次被加入到显示
列表中,对象仍保持原来的状态。换句话讲,如果显示对象里面绘制了图形,或是已加载了
一些外部信息,那么将它重新加入显示列表后,就不必再去重绘或重载这些信息。第二,把
该对象重新加入显示列表后, 还可以为它指定处在显示列表中的位置,这就是我们所熟知的
重定父级。
     从一个影片剪辑中删除一个对象,再把它加载到另一个影片中剪辑中,并保持刚刚被删
除时的状态,在以前是不可能完成的。事实上,有时并不需要去删除影片,因为,一个子对
象只能有一个父级,把它加入到另一个父级中,就会自动从原来的父级中删除。请看下面示
例:
package {
  import flash.display.Sprite;
  import flash.events.MouseEvent;
  public class Reparenting extends Sprite {
 private var parent1:Sprite;
 private var parent2:Sprite;
 private var ball:Sprite;
 public function Reparenting() {
   init();
 }
 private function init():void {
   parent1 = new Sprite();
   addChild(parent1);
   parent1.graphics.lineStyle(1, 0);
   parent1.graphics.drawRect(-50, -50, 100, 100);
   parent1.x = 60;
   parent1.y = 60;
   parent2 = new Sprite();
   addChild(parent2);
   parent2.graphics.lineStyle(1, 0);
   parent2.graphics.drawRect(-50, -50, 100, 100);
   parent2.x = 170;
   parent2.y = 60;
   ball = new Sprite();
   parent1.addChild(ball);
   ball.graphics.beginFill(0xff0000);
   ball.graphics.drawCircle(0, 0, 40);
   ball.graphics.endFill();
   ball.addEventListener(MouseEvent.CLICK, onBallClick);
 }
 public function onBallClick(event:MouseEvent):void {
   parent2.addChild(ball);
 }
}
}
    该类中有三个 Sprite 对象:parent1, parent2, ball。 parent1, parent2 影片直接
加入显示列表,并在影片中绘制了正方形。 Ball 影片被加入到 parent1,就相当于加入了
显示列表并可见。当小球被点击时,它将被加入 parent2 影片中。请注意,没有改变 Ball
的 x,y 坐标的代码,之所以产生移动是因为 Ball 被加载到了不同位置的 Sprite 影片中。
Sprite 影片被删除后再被加入显示列表,Ball 仍会出现。
子类化显示对象
    前面已经讲过生成 Sprite 或 MovieClip 类的子类,对某个类进行子类化是非常有用
的。首先,大家可能对 AS 3 取消 attachMovieClip 功能感到十分惊呀,如果这样的话,
我们怎么才能在 Flash CS3 IDE 库中取出影片剪辑元件放入舞台呢?答案是,使用一个继
承自 MovieClip 或 Sprite 的类。为了能够好地解释这个问题,简单地介绍一下 IDE:
1.创建一个新的 FLA 文件,并在舞台上绘制一些图形。
2.选中图形按下 F8 键转换为元件。
3.在转换为元件窗口中输入一个名称,并设置为影片剪辑类型。
4.选择为 ActionScript 导出。
      在以前的 Flash 版本中,可以自由地给出标识符或输入一个类名。而在 Flash CS3 中,
标识符一栏不可用了,类一栏会自动地填入默认值。这里还多出了基类一栏,默认为
flash.display.MovieClip,这里也可以填入继承自 MovieClip 或 Sprite 的自定义类。
      随意输入一个类名,不必担心没有这个类,然后点击确定。这个地方很有趣,Flash 找
不到这个类,它就会自动生成一个类,并对其进行编译。并不是说 Flash 会创建一个
ActionScript 类文件,但它会在 SWF 中,生成一串字节代码表示一个继承自 Sprite 或
MovieClip 的类。除了继承了基类,它什么都不会做,但它已经与库中的元件连接上了。比
如,你的类名为 Ball。在文档类或时间轴上,可以这么写:
var ball:Ball = new Ball();
addChild(ball);
      这样就在舞台上创建了一个库中的元件,就像 AS 2 的 attachMovie 方法一样。我们
要是能给出自定义的真正的类名及路径的话,那么就可以让元件附加很多功能。现在,我们
跳出 Flash IDE 回到类的世界,看下一个示例。下面再看一个重定父级的示例,这里有一
些重复的部分可以写入另一个类中。看一下示例,假设已经创建了一个名为 parent1 的
Sprite 实例,要里面绘制正方形:
parent1.graphics.lineStyle(1, 0);
parent1.graphics.drawRect(-50, -50, 100, 100);
      下面再创建一个名为 parent2 的 Sprite 实例,同样也是绘制一个正方形。当然这个
例子毫无意义,但它可以告诉我们 Sprite 的子类是多么的有用。首先,我们建立一个名为
ParentBox 的类,并继承自 Sprite,这样一来,就拥有了绘制正方形的代码:
package {
  import flash.display.Sprite;
  public class ParentBox extends Sprite {
   public function ParentBox() {
     init();
   }
   private function init():void {
     graphics.lineStyle(1, 0);
     graphics.drawRect(-50, -50, 100, 100);
   }
  }
}
然后,使用这个类创建两个 ParentBox,这样做比创建两个 Sprite 对象要好得多
package {
  import flash.display.Sprite;
  import flash.events.MouseEvent;
  public class Reparenting2 extends Sprite {
   private var parent1:ParentBox;
   private var parent2:ParentBox;
   private var ball:Sprite;
   public function Reparenting2() {
     init();
   }
   private function init():void {
     parent1 = new ParentBox();
     addChild(parent1);
     parent1.x = 60;
     parent1.y = 60;
     parent2 = new ParentBox();
     addChild(parent2);
     parent2.x = 170;
     parent2.y = 60;
     ball = new Sprite();
     parent1.addChild(ball);
     ball.graphics.beginFill(0xff0000);
     ball.graphics.drawCircle(0, 0, 40);
     ball.graphics.endFill();
     ball.addEventListener(MouseEvent.CLICK, onBallClick);
   }
   public function onBallClick(event:MouseEvent):void {
     parent2.addChild(ball);
   }
  }
}
      作为 ParentBox 的实例,它们仍是 Sprite ,因此还可以再增加子影片, init 方法
直接进行绘图。虽然这个示例价值不大,但可以让你学会这种思想,往后,会在书中看到更
多更复杂的示例。你也许想自己动手创建一个球(Ball)类,用于绘制小球,虽然这么做不会
减少代码里,但是当你的类变得十分复杂时,把功能代码分离到不同的类中,这绝对是个好
办法,它比将所有类写在一起要好得多,同时还促进了代码的重用性。那么现在就去创建这
个 Ball 类吧,在日后的学习中还要用到呢。
交互动画
    最后介绍一下交互动画,这也许是大家读这本书的主要原因。如果不使用交互运动,那
么只使用补间动画不就行了。在前面一章简单地提到过,用户交互动画基于用户事件,总的
来说可以归结为鼠标事件和键盘事件,下面就来学习不同的用户事件及其处理函数。
鼠标事件
    AS 3 中鼠标事件发生了显著的变化。在 AS 2 中,影片剪辑会自动添加鼠标侦听器。
现在,要手动地为对象添加侦听器。 AS 3 中鼠标指针经过显示对象时才能触发鼠标事件。
                                在
在 AS 2 中,无论鼠标指针在哪里,只要执行 mouseDown 或 mouseMove 就会触发所有的影
片剪辑。而现在, mouseUp 和 mouseDown 事件与 AS 2 中的 onPress 和 onRelase 等同。
鼠标事件的名称是定义好的字符串,像我们之前所提到的,最好使用 MouseEvent 类的属性,
以避免输入错误,下面是 MouseEvent 类中所有可用的鼠标事件属性:
CLICK
DOUBLE_CLICK
MOUSE_DOWN
MOUSE_MOVE
MOUSE_OUT
MOUSE_OVER
MOUSE_UP
MOUSE_WHEEL
ROLL_OUT
ROLL_OVER
     创建下面这个类,来测试一下,这个类会输出发生在 Sprite 影片上的鼠标事件名称。
package {
 import flash.display.Sprite;
 import flash.events.MouseEvent;
 public class MouseEvents extends Sprite {
  public function MouseEvents() {
    init();
  }
  private function init():void {
    var sprite:Sprite = new Sprite();
    addChild(sprite);
    sprite.graphics.beginFill(0xff0000);
    sprite.graphics.drawCircle(0, 0, 50);
    sprite.graphics.endFill();
    sprite.x = stage.stageWidth / 2;
    sprite.y = stage.stageHeight / 2;
    sprite.addEventListener(MouseEvent.CLICK, onMouseEvent);
    sprite.addEventListener(MouseEvent.DOUBLE_CLICK,onMouseEvent);
    sprite.addEventListener(MouseEvent.MOUSE_DOWN,onMouseEvent);
    sprite.addEventListener(MouseEvent.MOUSE_MOVE,onMouseEvent);
    sprite.addEventListener(MouseEvent.MOUSE_OUT,onMouseEvent);
    sprite.addEventListener(MouseEvent.MOUSE_OVER,onMouseEvent);
    sprite.addEventListener(MouseEvent.MOUSE_UP,onMouseEvent);
    sprite.addEventListener(MouseEvent.MOUSE_WHEEL,onMouseEvent);
    sprite.addEventListener(MouseEvent.ROLL_OUT,onMouseEvent);
    sprite.addEventListener(MouseEvent.ROLL_OVER,onMouseEvent);
  }
  public function onMouseEvent(event:MouseEvent):void {
    trace(event.type);
  }
 }
}
请注意,每个事件类型都使用了同一个处理函数,输出所触发的事件类型的名称。
鼠标位置
    除了鼠标事件外,对于文档类还有两个非常重要属性用于表示鼠标当前的位置:mouseX
和 mouseY。请注意,影片剪辑的位置,返回的值是鼠标的位置与影片剪辑的注册点的相对
位置。例如,有一个名为 sprite 的 Sprite 影片,在舞台的 100,100 位置,而鼠标的位
置在 150,250,你会得到如下结果:
mouseX 为 150
mousey 为 250
sprite.mouseX 为 50
sprite.mouseY 为 150
请注意鼠标位置与影片位置的相对关系。
键盘事件
      键盘事件已被 AS 3 划分到另一个区域中。例如,在 AS 2 中,影片剪辑会自动侦听键
盘事件,但只在某种情况下才接收这些事件。所以,最好增加一个专门用来做侦听器的影片
剪辑,  有时,影片剪辑接收了多个事件但被看作是一个键盘事件,这样就不对了。 AS 2 的
                                                                          在
组成框架中,很大部一部分都是为键盘交互服务的,比如 Flash Player 体系中的:
tab(table)管理,焦点(focus)管理及在文本框中对于 Enter 键与 Table 键的处理等。现
在好了,键盘事件的名称与鼠标事件的相似,都是定义好的字符串,也可为 KeyboardEvent
类的属性。只有两种:
KEY_DOWN
KEY_UP
      我们可以在一个特殊的对象上侦听键盘事件,就像上面那个鼠标侦听的例子一样。为了
实现这个功能,我们需要设置对象的焦点,以便能够捕获这些事件,可以这样写:
stage.focus = sprite;
在很多情况下,侦听键盘事件是否有焦点很有意义,实现它只需直接对舞台进行键盘侦听。
下面看一个示例:
package {
  import flash.display.Sprite;
  import flash.events.KeyboardEvent;
  public class KeyboardEvents extends Sprite {
   public function KeyboardEvents() {
     init();
   }
   private function init():void {
     stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyboardEvent);
     stage.addEventListener(KeyboardEvent.KEY_UP,onKeyboardEvent);
   }
   public function onKeyboardEvent(event:KeyboardEvent):void {
     trace(event.type);
   }
  }
}
键码
    通常人们并不关心一个键是否被按下,  而是关心按下的是什么键。 使用键盘事件处理有
几种方法可以读取输入的信息。前面说到,一个事件处理程序可以由一个事件对象来触发,
该对象包括触发这个事件的数据。在键盘事件中有两个相关的属性,事件所涉及的键:字符
码(charCode)和键码(keyCode)。
字符码指按下的键所表示的真正字符。例如,用户按下”a”键,字符码就是”a”,如果用
户同时又按着 shift 键,这样字符码就是”A”。
键码指按键所代表的数值。如果用户按下”a”键,它所对应的键码为 65,无论是否按着其
它键。如果先按下 Shift 键后按下“a”键,那么会获得两个键盘事件,先是 Shift(键码 16)
后是 a(键码 65)。 Flash.ui.Keyboard 类同样也有一些属性是针对非字母键的,   我们不需
要把它们背下来。例如: Keyboard.SHIFT 等于 16,当 Shift 键按下后,可以测试其是否
等于 Keyboard.SHIFT。请本章的最后一段代码:
package {
import flash.display.Sprite;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class KeyCodes extends Sprite {
 private var ball:Sprite;
 public function KeyCodes() {
   init();
 }
 private function init():void {
   ball = new Sprite();
   addChild(ball);
   ball.graphics.beginFill(0xff0000);
   ball.graphics.drawCircle(0, 0, 40);
   ball.graphics.endFill();
   ball.x = stage.stageWidth / 2;
   ball.y = stage.stageHeight / 2;
   stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyboardEvent);
 }
 public function onKeyboardEvent(event:KeyboardEvent):void {
   switch (event.keyCode) {
    case Keyboard.UP :
     ball.y -= 10;
     break;
    case Keyboard.DOWN :
     ball.y += 10;
     break;
    case Keyboard.LEFT :
     ball.x -= 10;
     break;
    case Keyboard.RIGHT :
     ball.x += 10;
     break;
      default :
        break;
     }
   }
  }
}
      当我们在 Flash 编辑环境下测试影片时,IDE 会拦截用于控制 IDE 自身的键。Tab 键
和所有功能键以及作为快捷菜单项的键,在测试影片时不会接收到。不过,我们可以在菜单
中选择“控制” -> “禁用快捷键”,来解除限制。这样一来,测试的影片就像在浏览器中
工作一样了。

 

 

 

这章把常用机制的介绍的差不多了 既然常用说明很重要 大家如果不懂 尽量回头看下

ActionScript 3.0动画技术源代码详解 补间动画是一种在两个关键帧之间自动生成中间帧的技术。在传统动画制作中,补间动画需要画师手工绘制每一帧。而在计算机生成的动画中,这一过程可以由软件自动完成。ActionScript 3.0扩展了这种技术,使开发者能够通过编程控制动画的每个细节。在ActionScript 3.0中,补间动画主要依赖于时间轴(Timeline)和时间轴上的帧(Frame)。通过在关键帧之间插入补间(Tween),ActionScript可以自动计算中间帧。 阅读详情

相关推荐

Flash ActionScript 3.0动画高级编程实战教程

在ActionScript 3.0中,创建类是面向对象编程的基础。类定义了一组对象的属性和方法。属性是对象的状态,而方法则是对象的行为。下面是一个简单的类定义示例:// 属性:姓名// 属性:年龄// 构造函数:用于初始化对象属性// 方法:用于描述对象的行为接口在 ActionScript 中是一种特殊类型,它定义了一组方法但不实现它们,允许类实现这些方法。接口有助于实现抽象和模块化。

weixin_42186387的博客 996

AS鼠标事件

在FLASH中,要实现鼠标控制影片播放,有两种方法: 第一种: //第一次载入该影片,影片停止播入onClipEvent(load) {  stop(); } //当数标移到影片上时,影片播入on(rollOver){  play();} 把这段代码加到场景中的影片剪辑上,不要加在帧上,即可实现鼠标移到影片上的时候播放,离开影片的时候停止播放。 ...

weixin_34395205的博客 236

Flash ActionScript 3.0动画开发高级实战教程

函数通过function关键字声明,可带参数与返回值:// 输出: Hello, Bob函数是构建模块化代码的基础,为后续面向对象编程做好铺垫。ActionScript 3.0 使用来定义类,类文件必须与类名一致,并放在正确的包路径下。package {在实际开发中,我们经常需要根据业务需求创建自定义类。本节将通过一个完整的示例,展示如何设计并使用一个自定义类。_vy *= -1;

weixin_35370061的博客 986

actionscript3.0 资源管理问题(转)

目前我暂时在研究ActionScript3.0,它的能力让我很激动。指引入AVM2之后,ActionScript3.0在执行速度上有了很大 提高,所以使支持更复杂的组件成为可能。它引入了E4X、sockets、byte 数组对象、新的显示列表模型、正则表达式、正式化的事件和错误模型以及其它特性,它是一个令人炫目的大杂烩。 能力越大责任越大,这对ActionScript3.0来说一点没错。引入这

hili2006的专栏 876

AS3Book.zip - ActionScript 3电子书资源集合

本文还有配套的精品资源,点击获取 简介:《AS3Book.zip》提供了深入学习ActionScript 3(AS3)的电子书资源,涵盖了AS3的基础语法、面向对象编程、事件处理、显示列表管理、动画制作、媒体处理、网络通信、本地存储、错误处理以及性能优化等关键知识点。AS3是Flash和Flex的主要编程语言,适用于开发交互式网页内容和RIA。本电子书通过实例驱动的方式,帮...

weixin_36204513的博客 1482

Adobe Flash ActionScript 3.0动画制作完整教程

ActionScript 3.0是Adobe公司开发的基于ECMAScript标准的一种面向对象编程语言,它是Flash Player和Adobe AIR应用程序的主要编程语言。ActionScript 3.0以其高性能、强大功能以及面向对象的编程范式,成为了构建丰富互联网应用(RIA)的首选语言。类的定义已经通过上面的例子说明,实例化类的对象非常直接。以下是实例化的具体操作:// 创建Animal和Dog类的实例// 使用对象调用方法。

weixin_28840811的博客 1290

使用ActionScript 3控制动画播放(AN/FLASH)

在Flash和Adobe AIR开发中,ActionScript 3(AS3)是一种强大的脚本语言,它允许开发者创建交互式动画和应用程序。在本篇文章中,我们将探讨如何使用AS3为按钮添加事件监听器,以控制动画的播放和停止。

2301_79940194的博客 1019

ActionScript 3.0实用代码手册

本文还有配套的精品资源,点击获取 简介:《ActionScript 3.0 Cookbook》是一本面向Flash平台交互式内容开发者的实用指南,涵盖大量代码示例和问题解决策略。本书着重介绍ActionScript 3.0版本,强调面向对象编程概念和实际问题解决能力的提升。书中包括对事件处理、图形绘制、动画制作、网络通信、音频和视频处理等方面的深入探讨。每一节都提供实际的解...

weixin_42311427的博客 1685

flash AS3.0中有关于播放控制进度条控制声音的两种模式

自flash的新版本语言ActionScript3.0发布以来已经过了不少时间,想必大家都已经从当初2.0与3.0的变化中缓了过来,但对新手而言,想要用AS3.0来实现特定功能仍然有一定难度,在这里就简单介绍下我曾经遇到过的问题,对播放控制进度条的制作及其对声音的控制这一块作些简单介绍。为了让和我一样处于起步阶段的同胞少走弯路,高手请自动忽视。         每当看到别人制作出的flash

Tian_zhishang的博客 5073

keyCode键控代码的值

以下表列出了标准键盘上的所有键,及其相应的键控代码值和 ASCII 键控代码值,这些值用于在 ActionScript 中标识这些键

物联网开发131 - Micropython ESP32 C3连接TB6600驱动42BYGH39步进电机

如何使用合宙ESP32 C3连接TB6600驱动42BYGH39步进电机,实现控制步进电机正反转和旋转指定角度等

zhusongziye的博客 2377

《Adobe Flash CS4 ActionScript 3.0中文版经典教程》——1.3 在Flash时间轴上放置代码...

本节书摘来自异步社区《Adobe Flash CS4 ActionScript 3.0中文版经典教程》一书中的第1章,第1.3节,作者: 【美】Adobe公司 更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.3 在Flash时间轴上放置代码 在Flash影片主时间轴中的任意关键帧上,都可以编写ActionScript,也可以在影片剪辑符号内的任...

weixin_34281477的博客 448

深入解析Vivado FIFO的Standard与FWFT模式:性能对比与应用场景

本文深入解析了Vivado FIFO的Standard与FWFT两种工作模式的核心差异。通过对比数据就绪时机、读延迟、控制逻辑和有效深度等关键特性,并结合图像处理、数据包转发等典型应用场景,为FPGA设计者提供了清晰的选择依据和实战配置指南,帮助优化数据流性能与设计效率。

weixin_29219189的博客 257

ActionScript 3.0初体验,与AS 2.0的一些区别(转)

初识ActionScript 3.0     学习AS3.0已有一段时间了,想把自已对AS3的一些认识和大家分享一下。主要想说说AS3与AS2的不同之处,没有什么逻辑性,想到什么就写点什么,因此,它不适合AS高手们阅读。本文将力求用最直白的语言,尽量不用那些艰涩难懂的名词和术语。                               一 在什么地方写代码     失望,以为要说点啥,原来是这么小儿科的问题。没办法,我说过了,本文不适合AS高手阅读的。为了更好地理解,我们还是用例子来说明。现在,就让我们

4044

ANSYS Fluent热边界条件避坑指南:为什么你的自然对流计算结果总出错?

本文深入剖析了在ANSYS Fluent中进行自然对流仿真时,导致计算结果出错或发散的核心原因与解决方案。重点解析了重力项与操作密度设置、Boussinesq与不可压缩理想气体模型的抉择、以及压力离散格式(推荐Body Force Weighted)这三大关键雷区,并结合电子机箱散热等实战案例,提供了一套稳定可靠的仿真设置流程与调试技巧。

weixin_28396629的博客 742

GLM-4本地部署的实战教程

本文主要介绍了GLM-4-9B本地部署的实战教程,希望对学习和使用大模型的同学们有所帮助。 文章目录 1. 前言 2. 配置环境 2.1 安装虚拟环境 2.2 安装依赖库 2.3 下载模型文件 3. 运行glm-4-9b-chat

herosunly的博客 25万+

使用ActionScript 3.0控制Flash动画播放

Flash是一个由Adobe公司开发的动画和多媒体平台,它允许设计师和开发者创建动画、游戏和应用程序。ActionScript是Flash的编程语言,用于控制Flash内容的行为。

2301_79940194的博客 1174

SCADA|用KingSCADA实现设备台账的查询功能

以上为用KingSCADA实现设备台账的查询功能,另外还有一些细节功能,比如当点击增加按钮时弹出的信息窗口内的信息希望是在选中的某行信息,只要找到差不多的设备,修改个别参数即可,避免增加时弹出空白页,所有信息都需要填写。以上为实现设备台账查询的最简单实现,实际项目中可能会更复杂,你做过哪些设备台账或相关的功能,有比较好的创意或高难度功能方法,欢迎在留言区评论,或在交流群探讨,互通有无,共同进步。首先完成界面的组态工作,主要是通过查询按钮,查询SQLServer数据库的设备台账数据,然后填充到报表内。

做有价值的事,积累有价值的笔记! 482

探索AS3JS:将ActionScript 3.0转换为JavaScript的强大工具

探索AS3JS:将ActionScript 3.0转换为JavaScript的强大工具 项目介绍 AS3JS是一个基于Node.js的工具,旨在将ActionScript 3.0代码转换为纯JavaScript代码。这一工具不仅支持多种IDE的智能代码补全功能,如FlashDevelop和FDT,还允许开发者使用熟悉的AS3包结构编写代码,并自动转换为独立的JavaScript文件。AS3JS的核...

gitblog_00134的博客 822

小黄鸭机器人技术全解-第 07 章 关节自由度与行程参数

—鸭子歪着头转头时,转的平面是斜的,这正是它"灵动"感的来源。仿真里这是自动的(轴定义在父刚体系),复刻时不需要做任何事——

yolo模型训练找我,AI游戏合作找我 73

知识库构建革命:基于Agent的智能检索系统设计

本文聚焦“基于Agent的智能检索系统”这一前沿技术,系统讲解其设计逻辑、核心技术与落地方法。我们将覆盖从基础概念(如Agent如何“理解”知识)到实战代码(如何用Python搭建原型系统)的全链路内容,帮助技术开发者、企业知识管理负责人理解这一技术为何能颠覆传统知识库。本文将按“问题引入→核心概念→技术原理→实战落地→未来趋势”的逻辑展开:先用“老图书馆的困境”故事引出传统知识库的问题;再用“智能图书管理员”类比解释Agent如何革新检索;接着拆解NLP、对话管理、知识推理等核心技术;

AI智能探索者的博客 728

ActionScript 3.0 语法

1.        在Flash Builder 4 中的角本文件声明:                       //角本内容         ]]>2.        常量和变量在ActionScript 3.0中使用常量和变量和其他的编程开发语言一样,没什么太大的区别,作用点都是相同的。简单理解就是常量就是值不会改变的量,变量则相反。  在AS3.0中常量也可以分为两种:顶级常量和用户自定

技术记录 2708

QGis二次开发 —— 5.1、基于qgis开发雷达扫描、无人机飞行跟踪等(附:源码及工程)

基于qgis开发雷达扫描、无人机飞行跟踪等

326

探秘AS3JS:将ActionScript 3.0带入JavaScript的世界

探秘AS3JS:将ActionScript 3.0带入JavaScript的世界 更新通知:由于关注度较低,该项目已不再维护。但其思想和成果仍值得回顾与学习。 在线体验:想在浏览器中直接体验AS3JS吗?试试这个实时示例! 项目简介 AS3JS是一个基于Node.js的工具,它将ActionScript 3.0代码转换为纯JavaScript。灵感来源于ImportJS,它允许你利用AS3的...

gitblog_00099的博客 710

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

从ActionScript 2到ActionScript 3.0

I know the transition can be hard. We got used to the ease of use ActionScript 2 had, but honestly, it became problematic later on, especially if designers were involved in the pr...

cunchi8090的博客 399

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: 转 第二章 ActionScript 3.0 动画基础(1)(as3.0)
下一篇: 转 第三章 三角学应用(1)(as3.0)
coding_most
博客等级 码龄15年 13粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值