close

以下內容完整版參照自

AS3筆記-無中生有+古怪館藏

以下內容有修正過一些錯字..

基本上把東西寫在外面, Flash cs3 在製作案子的角色上,會變得很不重要,很多人只是在利用他 compile 而已.

要用 Flash IDE compile :

0.先要有一個 whatever.fla 檔,project size大小在這邊設定->這個檔名基本上就會是輸出swf的檔名,我不建議去改output swf的名字,這樣跟fla不一樣以後很難辨認是哪個做出來的.

1.在 property panel 上的 document class 填上你的主要 .as 檔案(不用加 “.as”),在這裡我們就用 Main.as 來說明.->建議第一個字母大寫[註]

2.main.as 一定要 extends Sprite 或是 MovieClip 這樣才會有顯示功能. -> Sprite 是 AS3 裡面的新東西,可以想成只有一格 timeline 的 MovieClip

3.其他所有用到的 class 路徑要設在
preference -> ActionScript -> ActionScript 3.0 Settings ClassPath (常設) 或是
publish setting -> flash -> ActionScript version 旁邊 Settings… (單一專案)
這些路徑在你用其他的 SDK 一定要設成一樣,才會兩邊都找的到.

基本上這樣就可以了繼續下去了,也不太會在用到 Flash IDE,只是 compile的時候拿來用而已.

 

Main.as example:
package{

import flash.display.MovieClip;

//must extends Sprite or MovieClip for the document class ( code entry point )建議使用 MovieClip, 用 Flash IDE compile的話,還可以控制 Main Timeline 上的 frame ( gotoAndStop(n); ).
public class Main extends MovieClip{
//constructor
public function Main():void{
trace("hello world");
}
}
}

 

可是身為設計師的你可能會想到, 挖靠, 那 library 呢?
雖然用這種高級的 OOP 做法,理想狀況是全部都用 Script去畫出來, 或是 load 圖形檔,不過就用 Script 畫東西這點, 我是認為畫個圓還是方式很OK的, 不過如果是畫向量的鳥? 那用 Script去寫就真的太麻煩了.
身為設計師, 很多東西是邊畫邊排版,製作過程是一再測試視覺美感, 如果一開始一切就都用 Script 寫,會失去了這個創意的過程, 或許可以先用 Photoshop / Illustrator 排版, 不過如果身兼視覺設計跟互動程式的設計師, 就必需用方便直覺的方式, 隨時去調整視覺元素的物理性質(瀏覽字體,長,寬,高,大小,形狀,位置等等), 而不是透過冰冷的數字去一一修改, 因為很多好的比例跟視覺感受, 都在用視覺方式去調整的過程發現的.

所以雖然在 AS 3.0 的架構中, Flash IDE 裡面的 Library 元件,與整個 架構是非常衝突的,配合起來也非常的卡. 我發現很少網站在討論這個問題, 因為一般 AS3 的討論 / Blog, 都是給 Programmer 看的.

個性古怪的館藏 -
“福辣” (fla) Library

library 裡面的東西,假設有一個叫 Bird (建議有 linkage 的 MC 要大寫[註]) 的 MovieClip ,

只要加上 Linkage,就可以用 var myBird : Sprite = new Bird();之後 addChild(myBird) 去加到 displayList裡面,螢幕上就會顯示出來.

在AS3的世界裡,所有的東西都是 Class, 所以當你在 Library裡面建立 Linkage 的時候,你會發現以下的視窗,

意思就是Flash找不到在Classpath裡面有 Match 的 Class, 所以會自動產生一個隱形的Class好符合AS3 的語法去操控這個MovieClip.

linkage

warning
你可以進一步寫 Class 去Match 這個 Bird 的 MovieClip,去取代Flash 裡面這個隱形的 Bird Class, 你可以寫一名字一樣的 Bird.as,

不過你會注意到 myBird 是 Extend 自 Sprite,不是 MovieClip,

與 Linkage裡面的設定不一樣,經過我的測試,只要檔名一樣,他會自動替代 Linkage 裡面的設定,

所以現在控制, myBird instance 的 code 是外面的 Bird.as(extends Sprite)

noObj

(如果你是用 Flex Builder 來編輯 .as 的話,在 Flash Library 產生的隱形 Class 將會找不到, 這種狀況非常的機車, 因為在 Flex Builder 裡面的自動偵錯會一直告訴你說找不到物件,此時你只好硬寫一個Class給該 MC ,去騙過 Flex Builder 的偵錯.或是把 Library的物件輸出成 .swc設定進去 Flex裡面的 Library Path,這樣一來就算寫在 Frame上的 Code 也可以被讀到 -> 這樣還可以用 Flex Builder compile,不過如果你有改到 library 裡面的東西,就要重新輸出).

Bird.as: there is an library movie clip “Bird” (with timeline animation) linkage to this file

01.package {
02.import flash.display.*;
03.public class Bird extends <strong>Sprite </strong>{
04.public function Bird() {
05.visible=false;
06.gotoAndStop(10); // Not working, because of extends "Sprite"
07.}
08.}
09.}

(在 Bird MC上的第一個 frame 寫 visible = true;)

詭異一: 你注意到在Bird的 .as檔案是 extends Sprite, 怪了,在 library裡面是 MovieClip,怎麼可以外面的 .as 卻是 Sprite 呢? … 我也不知道. 總之這樣也不會有錯誤, 不過你會失去控制 Bird MC裡面的 Timeline Animation (如果有的話),動畫會靜止在第一格,如果 extends MovieClip, 就可以.如果在fla裡的 Main Timeline 上有 Animation, Main.as 設定卻成 Sprite, 動畫照跑…怪吧!?

如果 Bird MC 的 frame上有 script,然後你的 Bird.as 上是 extends Sprite, 你會得到這個 1180: Call to a possibly undefined method addFrameScript. (extends MovieClip 就不會)

建議: 如果你 library 裡面的 MovieClip Frame 上面有script 或是 timeline animation的話,一定要用 extends MovieClip.

詭異二: 如果你在 Flash IDE 裡面的 Bird MC裡面的Frame上面寫Code,基本上第一次不會運作,會被 Bird.as 裡面的code會第一次被完全取代 fla 裡面 mc frame 上的script, 不過如果frame上有loop動畫,那麼第二次跑回來有code的那個 frame,會被執行(哈,亂了吧?~)

詭異三: 好樣的, 之後又在 Bird MC上你放了個 Dynamic Text Box, 並將其 instance name 設為 “myName”, 在外面的 Bird.as 要把他設成 “Big Bird” 字串. 做法如下:
1. import flash.text.TextField;
2.1. myName.text=”big bird”; <- 如果也在 Flash IDE 裡面寫 .as 的話,這樣就好了,反正也沒偵錯.
2.2. this["myName"].text=”big bird”; <- 在 Flex Builder 裡面要這樣寫,不然的話會出現 1120: Access of undefined property myName.

phpXkNENg
(圖)這樣設定可以解除 Flash IDE 自動產生隱形 class 的機制,不過取消後,所有的Lib裡面的 Linkage MC 就都要有相對外面的 .as檔

不建議: 太過複雜的 nested MovieClip 不建議用外部的 .as file 編輯, 直接全部在 Flash IDE 裡面製作就好了, 不過這樣的話會失去整個 AS3 的 OOP 優點, 東西也很難重複使用.

Component:

如果你用 component definition 去設定可以變換的 variable, 你可以用 getter / setter 去把他抓下來.

phpDRZoua

1.[Inspectable]
2.function get labelname():String {
3.return labelname;
4.}
5.function set labelname(v:String):void {
6.mylabel.text=v;
7.}

這你可以寫在frame上或是在外部class皆可, 在網上看到有人用 [Inspectable],經我測試結果好像用不用都可以抓的到…

Creating ActionScript 3.0 components in Flash


Loading the Library Assets (Classes) in other swf.

好料的來了,別說我”暗坎”: 讀取別的 swf 裡面的 Library (Class / Font):

前面用Loader讀一個 swf, 裡面有一個圓形 class 叫做 cir

1.private function loaderComplete(event:Event):void {
2.var circle:Class = event.target.applicationDomain.getDefinition("cir") as Class;
3.var myCircle:Sprite = new circle();
4.addChild(myCircle);
5.}

loadlibfromswf.zip

前面用Loader讀一個 swf, Lib裡面有一個 名叫 _Arial font Class 叫做 _Arial,

embedfonts.gif

01.private function fontLoaded(event:Event):void {
02.var A:Class = event.target.applicationDomain.getDefinition("_Arial") as Class;
03.Font.registerFont(A);
04.var fontList:Array = Font.enumerateFonts(false); // only shows the embed fonts
05.for (var i:uint=0; i <fontlist .length;i++){
06.trace("font: "+fontList[i].fontName);//check font's realname : "Arial_30pt_st"
07.}
08. 
09....
10.var tf:TextField = new TextField();
11.tf.defaultTextFormat = new TextFormat("Arial_30pt_st", 30, 0);
12.//the font size should be the same with the embeded
13.//不曉得為什麼一定要用他原來的名字,這個名字記不是檔名,也不是秀在flash IDE上面的名字.
14.tf.embedFonts = true;
15.tf.text = "This is working";

loadfontfromlib.zip

Client_System_Environment

Display_Programming

註:
Class 名稱基本上第一個字母大寫, 不過並不是硬性規定.

附:
How stage, root, and MainTimeline Fit Together

arrow
arrow
    全站熱搜

    阿酷 發表在 痞客邦 留言(0) 人氣()