我們已經(jīng)了解到了在flash 9中如可在時間線上編寫代碼,如何將現(xiàn)有的時間線上的代碼轉(zhuǎn)換為外部類.以及flash9的Document Class形式,接下來我們要更細(xì)一步的來研究編寫類及外部as文件的方式.
include
如果你之前了解As1.0,As2.0編程,那么對include一定不陌生,在Actionscript 3.0中我們?nèi)钥梢允褂胕nclude 來導(dǎo)入代碼.
如下的例子:
1.打開flash新建一個文檔,保存為drag_inclue.fla在場景中創(chuàng)建一個movieclip,本例中使用的圓球,將其轉(zhuǎn)換為影片剪輯,并在場景中將其命名為circle_mc. 不需要在庫中設(shè)置鏈接屬性.
2.新增一層,按下F9打開Actionscript面板,在其中輸入代碼如下:
代碼:
//設(shè)置當(dāng)光標(biāo)移到circle_mc上時顯示手形
circle_mc.buttonMode = true;
// 偵聽事件
circle_mc.addEventListener(MouseEvent.CLICK,onClick);
circle_mc.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
circle_mc.addEventListener(MouseEvent.MOUSE_UP,onUp);
//定義onClick事件
function onClick(event:MouseEvent):void{
trace("circle clicked");
}
//定義onDown事件
function onDown(event:MouseEvent):void{
circle_mc.startDrag();
}
function onUp(event:MouseEvent):void{
circle_mc.stopDrag();
}
3.將此幀上的代碼全部選中,按下ctrl x剪切掉,選擇flash的new菜單,新建一個Actionscript文件,在剛剪切掉的代碼貼上.保存名為drag_include.as.與drag_include.fla在同一路徑下.
4.回到drag_include.fla中,在第一幀上輸入如下代碼:
include "drag_include.as"
測試影片即可以看到與時間線上測試時相同的結(jié)果了.此種方式,在As1.0時經(jīng)常使用.如果你仍習(xí)慣這種方式,在Actionscript 3.0中仍可以使用.
元件類(symbol class)
這里所說的元件件類,實際是指為flash影片中的元件指定一個鏈接類名.它與上面的include 的不同之處于,它使用的是嚴(yán)格的類結(jié)構(gòu).而不是我們習(xí)慣上的時間線編寫方式.我們要將小圓球的拖動功能封裝起來,這樣不論你創(chuàng)建多少可以拖動的小球,都會變得很輕松,只需要創(chuàng)建它的實例并顯示出來即可。
我們?nèi)允褂蒙侠齺碚f明問題.打開drag_include.fla文件,將其另存為Symbol_class.fla文件,新建一個Actionscript文件,將其保存為Symbol_class.as文件,與Symbol_class.fla文件在相同目錄下?,F(xiàn)在我們將上面的例子中的代碼抽象成類如下:
代碼:
package {
import flash.display.MovieClip;
import flash.events.MouseEvent;
public class Symbol_class extends MovieClip {
public function Symbol_class(){
this.buttonMode = true;
this.addEventListener(MouseEvent.CLICK,onClick);
this.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
this.addEventListener(MouseEvent.MOUSE_UP,onUp);
}
private function onClick(event:MouseEvent):void{
trace("circle clicked");
}
private function onDown(event:MouseEvent):void{
this.startDrag();
}
private function onUp(event:MouseEvent):void{
this.stopDrag();
}
}
}
因為我們將類的名稱設(shè)置為Symbol_class,所以此類文件一定要保存為Symbol_class.as文件.我們還要做一步工作,在源文件中打開庫面板,右擊circle_mc選擇鏈接,復(fù)選Export for Actionscript.在class處輸入Symbol_class.as即讓我們類與元件相關(guān)連..此時測試影片,你會看到與上例中相同的結(jié)果.這里注意一點,場景中仍要保證circle_mc的存在.因為在代碼中我們并沒有動態(tài)的貼加circle_mc. 同時這個例子中,與上例一樣,我們并沒有使用As3.0的Document Class特性.
動態(tài)類(dynamic class)
此種編寫的類的方式與探索Actionscript3.0 flash9 Preview教程中的例子是一樣的,此種方式是最最常用的.對于一些稍復(fù)雜的程序來說,是由主類和多個輔助類組成的.輔助類封裝分割開的功能,主類用來顯示和集成各部分功能。如上例我們已經(jīng)封裝了小球的拖動功能?,F(xiàn)在我們想要創(chuàng)建100個這樣可以拖動的小球。
如下演示:
思路是我們已經(jīng)創(chuàng)建了封裝了拖動功能的類,我們在創(chuàng)建一個主類,用來顯示這100個具有拖動功能的小球,我們將使用As3.0的DocumnetClass 新特性.
如下:我們將主類命名為DocumentClass.as, 封裝后的拖動球功能我們命名為Drag_class.as.
DocumentClass.as
代碼:
package {
import flash.display.MovieClip;
public class DocumentClass extends MovieClip {
// 屬性
private var _circle:Drag_circle;
private var _wslink:wslink;
private const maxBalls:int = 100;
// 構(gòu)造函數(shù)
public function DocumentClass(){
var i:int;
// 循環(huán)創(chuàng)建小球
for(i=0;i<=maxBalls; i ){
// 創(chuàng)建可拖動小球的實例
_circle = new Drag_circle();
// 設(shè)置小球?qū)嵗囊恍傩?
_circle.scaleY = _circle.scaleX = Math.random();
// 場景中的x,y位置
_circle.x= Math.round(Math.random()*(stage.stageWidth - _circle.width));
_circle.y= Math.round(Math.random()*(stage.stageHeight - _circle.height));
// 在場景上顯示
addChild(_circle);
}
}
}
}
Drag_circle.as類
代碼:
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
public class Drag_circle extends Sprite {
public function Drag_circle(){
this.buttonMode = true;
this.addEventListener(MouseEvent.CLICK,onClick);
this.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
this.addEventListener(MouseEvent.MOUSE_UP,onUp);
}
private function onClick(event:MouseEvent):void{
trace("circle clicked");
}
private function onDown(event:MouseEvent):void{
this.startDrag();
}
private function onUp(event:MouseEvent):void{
this.stopDrag();
}
}
}
打開我們之前所用過的fla文件,將其另存為drag_class.fla文件,與Document.as和Drag_class.as類所在目錄相同。打開庫面板,選中庫面板中的小球,右擊選擇鏈接在class名稱處輸入Drag_class.注意與上面的元件類不同在于,我們不需要讓場景中有任何內(nèi)容,因為我們已在主類DocumentClass.as中動態(tài)的貼加和顯示了circle_mc.。在DocumentClass.fla中的主場景中,在屬性面板中的Document Class輸入框中輸入我們的主類名DocumentClass.然后你就可以測試了。
不使用庫元件的動態(tài)類(dynamic class with no library)
在上例中我們使用的是已創(chuàng)建好的影片剪輯,并在庫中做了類的鏈接,這種情況對于一些有復(fù)雜圖形的情況下是比較好的選擇,如果你能很熟練的應(yīng)用Drawing Api繪制出你想要的任意圖形,那么你也可以不使用庫元件,可以直接在類中編寫,在本教程中我們主要研究的是這種方式,接下來我們看不使用庫元件如何編寫類來實現(xiàn)上面的功能。
很顯然即然不使用庫中的元件,那么我們就需要在類中直接使用Drawing Api來直接繪制。如下,類的結(jié)構(gòu)與動態(tài)類是相同的。我們需要在上例的基礎(chǔ)上做些改動
首先刪去fla中場景中的所有內(nèi)容,包括庫中的內(nèi)容。
DocumentClass.as類如下:
代碼:
package {
import flash.display.MovieClip;
public class DocumentClass extends MovieClip {
private var _circle:Drag_circle;
private const maxBalls:int = 100;
public function DocumentClass(){
var i:int;
for(i=0;i<=maxBalls; i ){
_circle = new Drag_circle();
_circle.scaleY = _circle.scaleX = Math.random();
_circle.x= Math.round(Math.random()*(stage.stageWidth - _circle.width));
_circle.y= Math.round(Math.random()*(stage.stageHeight - _circle.height));
addChild(_circle);
}
}
}
}
Drag_circle.as類
代碼:
package {
import flash.display.Sprite;
import flash.display.Shape;
import flash.events.MouseEvent;
public class Drag_circle extends Sprite {
private var _circle:Sprite;
public function Drag_circle(){
_circle = new Sprite();
_circle.graphics.beginFill(0xff0000);
_circle.graphics.drawCircle(-5, -5, 10);
_circle.graphics.endFill();
_circle.buttonMode =true;
addChild(_circle);
_circle.addEventListener(MouseEvent.CLICK,onClick);
_circle.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
_circle.addEventListener(MouseEvent.MOUSE_UP,onUp);
}
private function onClick(event:MouseEvent):void{
trace("circle clicked");
}
private function onDown(event:MouseEvent):void{
_circle.startDrag();
}
private function onUp(event:MouseEvent):void{
_circle.stopDrag();
}
}
}
注意Drag_circle.as類,我們只是增加了一段:
代碼:
_circle = new Sprite();
_circle.graphics.beginFill(0xff0000);
_circle.graphics.drawCircle(-5, -5, 10);
_circle.graphics.endFill();
還有就是構(gòu)造函數(shù)之前的聲明:private var _circle:Sprite;
測試你的影片。當(dāng)然這里我們繪制的只是一個無漸變的紅色園形。
Package Class
一般來說,一個.as文件中就一個類,但是在AS3中,現(xiàn)在允許在一個文件中定義多個類用來輔助主類。
在.as文件中的輔助類,必須定義在類包以外,并且只針對此文件中的主類和其他輔助類可見。它的基本結(jié)構(gòu)如下:
代碼:
package {
class MyClass {
function MyClass() {
var helper:MyHelper = new MyHelper();
}
}
}
class MyHelper {
function MyHelper() {
var helper:HelpersHelper = new HelpersHelper();
}
}
class HelpersHelper {
function HelpersHelper () {
}
}
注意,在包塊中最多只能定義一個類。在同一個文件中的輔助類不是包塊的一部分,并且只能在此文件中可見和被使用。
下面我們將我們將我們的類改寫成上述的packge類形式。我們將下面的代碼都寫在一個DocumentClass.as的文件中,然后在fla文件中的屬性面板中的Document Class輸入框中輸入DocumentClass類名。
代碼:
package {
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.MouseEvent;
// Document Class
public class DocumentClass extends MovieClip {
private var _circle:Drag_circle;
private const maxBalls:int = 100;
public function DocumentClass(){
var i:int;
for(i=0;i<=maxBalls; i ){
_circle = new Drag_circle();
_circle.scaleY = _circle.scaleX = Math.random();
_circle.x= Math.round(Math.random()*(stage.stageWidth - _circle.width));
_circle.y= Math.round(Math.random()*(stage.stageHeight - _circle.height));
addChild(_circle);
}
}
}
public class Drag_circle extends Sprite {
private var _circle:Sprite;
public function Drag_circle(){
_circle = new Sprite();
_circle.graphics.beginFill(0x6D6E71);
_circle.graphics.drawCircle(-5, -5, 10);
_circle.graphics.endFill();
addChild(_circle);
this.buttonMode = true;
_circle.addEventListener(MouseEvent.CLICK,onClick);
_circle.addEventListener(MouseEvent.MOUSE_DOWN,onDown);
_circle.addEventListener(MouseEvent.MOUSE_UP,onUp);
}
private function onClick(event:MouseEvent):void{
trace("circle clicked");
}
private function onDown(event:MouseEvent):void{
_circle.startDrag();
}
private function onUp(event:MouseEvent):void{
_circle.stopDrag();
}
}
}
現(xiàn)在就可以測試你的影片了。