ActionScript 3.0动画基础-4
作者: egoldy性质: 翻译阅读次数: 13397发表时间: 2007-07-08 15:22:01声明: 此文章为未出版的keith peters的ActionScript 3.0 making things move中文版样章。为书中的第二章。webstudio会在中文版出版之际,友情提供论坛forum支持。转载请注明出处,谢谢! 接上一篇.....
var myTextfield:TextField = new TextField(); var myMovieClip:MovieClip = new MovieClip(); var mySprite:Sprite = new Sprite();
这种方式是不是更简单呢?? mySprite.graphics.beginFill(0xff0000); mySprite.graphics.drawCircle(0,40); mySprite.graphics.endFill(); 但是如果只是象上面那样做了,你可能看不到任何内容。这就是我们将要讨论的显示列表(display list)。“display list”术语是一个新增的,但是如果你使用Flash已经有一段时间了,它不应当是一个完全陌生的概念。把你影片中的所有可视对象想为一个树形。树的最 底部是舞台,它默认状态就是可视的。在舞台上,你可能还有几个影片剪辑或其它类型的可视对象(文本域,图形等等)。当你将他们加入到舞台上时,他们也会变 成可视的。在那些影片剪辑内部可能还会有其它的影片剪辑或其它的可视对象,并且在其它的内部也可能会有。这就是最基本的显示列表(display list)。? var mySprite:Sprite = new Sprite(); mySprite.graphics.beginFill(0xff0000); mySprite.graphics.drawCircle(0,40); mySprite.graphics.endFill(); addChild(mySprite); 如果你试一试这些,将这些代码放在之前类结构中的init函数中。注意它将放置在原点0,0上。你可以通过调整x,y属性来改变它的位置。还要注意的是这 里没有提到深度(depth),深度如同当我们在AS2中创建影片剪辑或使用attach贴加他们的过程。虽然深度管理大部分情况下是自动的,但仍有加入 子对象的方法可以加入到指定的深度或改变它的深度,这些在我们需要的时候我们会讲到。? 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,100); parent2.x = 170; parent2.y = 60; ball = new Sprite(); parent1.addChild(ball); ball.graphics.beginFill(0xff0000); ball.graphics.drawCircle(0,40); ball.graphics.endFill(); ball.addEventListener(MouseEvent.CLICK,onBallClick); } public function onBallClick(event:MouseEvent):void { parent2.addChild(ball); } } } 这个类创建了三个精灵(sprite):parent1,parent2,和ball。Parent精灵直接加到显示列表(display list)中,并且方块被绘制在它们的内部。Ball精灵(sprite)被加入到parent1中,因此现在它存在于显示列表(display list)中并是可视的。? var ball:Ball = new Ball(); addChild(ball); 这样库中的元件应会在舞台上被创建,就是象以前AS2中的attachMovie方法。? parent1.graphics.lineStyle(1,100); 我们接着创建了另外一个精灵(sprite),parent2,在它的内部也用同样的代码绘制了同样的盒子。尽管这是一个很简单的例子,但是它可以清晰的 显示出精灵的子类是怎样应用的。首先,我们创建一个扩展精灵(sprite)名为ParentBox 的类。在这个类中,我们编写编制盒子子代码。 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,100); } } } 然后我们将告诉类创建两个ParentBox即可,而不再是两个精灵(spirte)了。 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,onBallClick); } public function onBallClick(event:MouseEvent):void { parent2.addChild(ball); } } } 作为parentBox的实例,他们仍是精灵(Sprite),因此可以在它们中加入子对象。它们也可以使用新的绘制图形的init方法。这是一个很小的例子,但是希望你能够理解它,当你继续向下看这本书时,你会看到许多更为复杂的范例。? 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,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); } } } 注意,这个类对每一种事类型使用了同一个处理者(handler),只是简单的trace出被发送出来的事件类型。? 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); } } } 2.7.4键盘代码? 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,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创作环境中测试你的影片时,Flash IDE会侦听一些键子来操作IDE自身。如Tab键,所有的功能键,和一些指定了快捷键的菜单,这些键子不会在你的测试影片中被接收。你可以通过选择控制 菜单(control>Disable Keyboard Shortcuts)然后选择禁止快捷键来解决。测试时就象真正工作在浏览器中一样。? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |