收集與備用:

  監聽函數帶有變數(addEventListener with variable)

  文章連結:http://stackoverflow.com/questions/13486230/to-pass-a-parameter-to-event-listener-in-as3-the-simple-way-does-it-exist

  函數:  

stage.addEventListener(MouseEvent.CLICK, onClick(true, 123, 4.56, "string"));
function onClick(b:Boolean, i:int, n:Number, s:String):Function {
  return function(e:MouseEvent):void {
    trace("Received " + b + ", " + i + ", " + n + " and " + s + ".");
  };
}

  若要可以移除此事件監聽,寫法須改為:

var functionOnClick:Function = onClick(true, 123, 4.56, "string");
stage.addEventListener(MouseEvent.CLICK, functionOnClick);
function onClick(b:Boolean, i:int, n:Number, s:String):Function {
  return function(e:MouseEvent):void {
    trace("Received " + b + ", " + i + ", " + n + " and " + s + ".");
  };
}

  如此即可用下述來移除監聽:

stage.removeEventListener(MouseEvent.CLICK, functionOnClick);

 

   -----

 

  創造object時用動態字串(例如:AS連結的名稱)指定class(create Object with knowing its Class's string name)

  連結:

  http://stackoverflow.com/questions/7597343/can-i-create-an-instance-of-a-class-from-as3-just-knowing-his-name

  http://stackoverflow.com/questions/7929943/dynamically-creating-and-assigning-names-to-movieclips-as3

import flash.utils.getDefinitionByName;
var className:String = "text";
var myClass:Class = getDefinitionByName(className) as Class;
var instance:Object = new myClass();

  效果如同:

var instance:Object = new text();

 

  String可寫變數:

var i: Number = 5;

var className:String = "text"+i;

  效果同如:

var className:String = "text5";

 

  -----

 

  在程式碼中呼叫函數時使用變數名稱(已知函數的名稱String/用字串呼叫函數)

  連結:http://asgamer.com/2009/using-string-variables-to-call-functions-in-as3

  程式碼,例如在你名為obj的物件下有一個function叫myFunc,則呼叫該函數的寫法為:

  var myFuncName:String = "myFunc";

  obj[myfuncName](); //等同於輸入obj.myFunc();

  要注意到[ ]之間放入的是字串,並且obj與[ ]之間並沒有「.」(點),還有函數後面的()及裡面可能有的變數是輸入在[ ]之後。

 

  -----

 

  如何用程式碼方式創造圖形(圓形),及DisplayObject(顯示物件)的常用屬性。

  連結:https://flzen.wordpress.com/2010/08/19/flex-as3-draw-shape/

 

  -----

 

   graph類別下可使用的方法(畫圓、畫方形、畫三角形)。

  連結:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/Graphics.html

 

  -----

 

  程式碼的方式創造遮色片。

  連結:http://help.adobe.com/zh_TW/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7e0b.html

  將要做為遮色片的物件,設為要遮蓋物件的mask屬性。

// Make the object maskSprite be a mask for the object mySprite. 
mySprite.mask = maskSprite;

  要注意的是,程式碼中設置的遮色片與在影格圖層上建構遮色片是不同的,即使他們表現起來的效果一樣。

  用程式碼設置的話,一個物件不能做為兩個物件的遮色片,如果在程式碼的過程中輸入以下:

  a.mask = maskSprite;

  此時maskSprite會遮住a,但接著再輸入:

  b.mask = maskSprite;

  則maskSprite僅會遮住b,將不再遮住a,這與影格圖層中設置遮色片的情況不同(在影格中一個遮色片可以遮住多個圖層中的物件)。

 

  如果非得要做到一個遮色片遮蓋複數物件的效果,那有以下方式:

  1。在影格圖層中建構這個遮色片與遮蓋的物件。

  2。創造複數個同樣圖形的物件在同個位置,分別設為不同物件的遮色片。

  3。將複數物件群組化(新增為元件/放到同一個元件裡面),設置遮色片為群組後物件的mask。

 

 

  -----

 

  用程式碼的方式畫虛線。(似乎沒有內建的程式碼,連結為土法煉鋼(?))

  連結:http://reader.roodo.com/esabear/archives/13596663.html

 

  -----

 

  同時拖曳drag複數物件。

  連結:http://stackoverflow.com/questions/104448/flash-drag-two-movieclips-at-once

  Flash中同個時間只能有一個物件被滑鼠拖曳。

  拖曳物件為a,輸入:

  a.startDrag();

  a即隨著滑鼠移動,輸入:

  a.stopDrag();

  a即不再隨著滑鼠移動。

  若在a被拖曳的狀態下輸入b.startDrag();,印象中會無效。

 

  要拖曳複數物件,有以下方式:

  1。將複數物件群組化(新增為元件/放到同一個元件裡面),設置群組後物件startDrag();

  2。在概念上拖曳複數物件:

    var mouseOldX:Number;

    var mouseOldY:Number;

    在要拖曳物件a的DOWN監聽中加入:

    mouseOldX = mouseX; //mouseX為滑鼠此刻位置的x座標

    mouseOldY = mouseY; //mouseY為滑鼠此刻位置的y座標

    stage.addEventListener(Event:MouseEvent.MOUSE_MOVE, mouseMoveDragA);

    並新增函數:

    function mouseMoveDragA(e:MouseEvent):void {

    b.x += mouseX - mouseOldX; //設b物件的x座標為原座標加上(新的滑鼠x座標-舊的滑鼠x座標)

    b.y += mouseY - mouseOldY; //設b物件的y座標為原座標加上(新的滑鼠y座標-舊的滑鼠y座標)

    mouseOldX = mouseX; //mouseX為滑鼠此刻位置的x座標

    mouseOldY = mouseY; //mouseY為滑鼠此刻位置的y座標

    }

    要記得在stage的UP監聽中加入以下這行移除剛才的監聽函數:

    stage.removeEventListener(Event:MouseEvent.MOUSE_MOVE, mouseMoveDragA);

      如此在拖曳a時b即會跟著一同移動(但可能顯示上的效果會有些延遲,顯得不夠漂亮)。

 

 

  -----

 

 

  「鋼筆工具」(路徑貝茲曲線)詳細教學。

  連結:http://www.flycan.com.tw/board/modules/newbb/viewtopic.php?topic_id=671

  連結文章講解的非常清楚,要注意的是無法繪製圓形(只能近似),至於graph類別下繪製的圓形是不是根據定義我就不曉得了。

  貝茲曲線的公式見Wiki:https://zh.wikipedia.org/wiki/%E8%B2%9D%E8%8C%B2%E6%9B%B2%E7%B7%9A

 

  -----

 

  如何用程式碼繪製圓弧線(圓規畫弧線的效果)。

  由於Graph類別下似乎沒有這樣的方法,貝茲曲線也不能做到這個效果,故我想了一種方法(尚未實踐過):

  已知:圓心與弧線的兩端點(劣弧(角度小於180度)),以及圓半徑。

  1。用drawCricle繪製一個圓。

  2。再繪製一個矩形,底邊為弧線兩端點的連線(弧線夾角限定小於180度),高往遠離圓心的方向為半徑長度。

  3。此時此矩形應該完全覆蓋住該圓中我們要的弧線部分,將此矩形設置為該圓物件的遮罩(遮色片(mask)屬性)。

  4。完成,效果應該就會是弧線。

  可能需要想一下的部份是該矩形要怎麼繪製,先計算好長寬以後,將(0,0)(左上角)定在弧線的一個端點,之後設置其angle屬性(旋轉),要思考看看轉的角度要怎麼計算。

 

  -----

 

  用程式碼改變物件層疊(圖層/誰壓在上面/順序)。

  連結:http://snotyboy.blogspot.tw/2012/07/as30.html

  設置物件到最前面:

  容器名稱.setChildIndex(物件實體名稱, 容器名稱.numChildren-1);

  numChildren是該容器底下Children的數量,Index是從0~n-1(類似多數程式語言),故numChildren-1是最上層。

  取得物件的Index:

  容器名稱.getChildIndex(物件實體名稱);//此方法會回傳該物件在該容器下的Index數字。

  設置Index時亦可輸入負值,很像是說負值是原本就放在影格中物件的層疊放置的位置(意思是不是在操作檔案時才new出來的物件)。

 

  -----

 

  如何建造與使用組件。

  連結:http://blog.yam.com/jjkiddie/article/23373107

  在其副檔名.as的文件中對應位置輸入(位置在哪裡可以點進連結的文章看):

  [Inspectable(name = "屬性名稱", type = Number、Boolean或int , defaultValue = 預設值)]

  public function set 屬性名稱(t:對應type):void

  {

   隱變數 = t ;

  }  

  public function get 屬性名稱():對應type

  {

   return 隱變數;

  }

  這種寫法可以把實際的變數隱藏(隱變數),外部要修改這些屬性輸入的方式如同一般,但如果這裡不設置get或set,這個屬性對於使用者而言就會變成不能修改(唯讀)或不能讀取(唯修改)。

  舉實例來說,我要設置一個人物的速度屬性,稱之為speed:

  private _speed:Number = 0; //private表示不能從外部呼叫到這個屬性

  //加底線作為隱變數的記號,實際上什麼名子都可以,在這裡「_speed」是此物件中實際的變數名稱

  [Inspectable(name = "速度speed", type = Number , defaultValue = 0)]

  public function set speed(t:Number):void

  {

   _speed = t ;

  }  

  public function get speed():Number

  {

   return _speed;

  }

  如此一來,在使用這個組件時,使用者可以在屬性位置看到「速度speed」,而如果使用者想在程式碼中修改這個屬性,他只需要輸入:

  此物件實體名稱.speed = 3;//將此物件的速度屬性數值改為3

  或:

  var objectSpeed:Number = 此物件實體名稱.speed; //objectSpeed會得到此物件的速度屬性數值

  程式碼寫起來好像是使用者讀到了speed這個屬性,但實際上他只是呼叫了function get speed這個函數。

  這樣的寫法也有助於在修改數字時同時執行其他事件,只要在函數裡增加其他程式碼即可,例如將set改寫成:

  public function set speed(t:Number):void

  {

   _speed = t ;

   trace("速度改變!");

  }  

  這樣當程式碼執行到:

  此物件實體名稱.speed = 3;

  就會額外在輸出欄位顯示「速度改變!」的文字,而一般修改變數時是不能直接得到這樣的效果的,還要再額外寫一個監聽事件監聽該數值是否改變。(或是用同樣的隱變數寫法)

 

  -----

 

  Timer跟ENTER_FRAME的差別。

  連結:http://stackoverflow.com/questions/9649187/actionscript-3-0-what-is-the-difference-between-using-the-enter-frame-event-and

  大綱就是,timer以經過多少時間(1是千分之一秒)來觸發,而ENTER_FRAME是以播放影格(每次畫面刷新?)來觸發。

  timer特別適合用在模擬物理時的情況,例如要偵測物體掉落時著地(碰撞到地面),如果判斷的時間不夠短的話,有可能就會錯過相碰的時間。

 

  -----

 

  橫向遊戲的物理模擬。
  連結:https://www.ptt.cc/bbs/GameDesign/M.1459049686.A.EA5.html

  對我而言很有收穫的文章,裡面提出了一種判定物體落地的方法,能夠保持人物緊貼地面,又不需要太大量的運算。

 

  -----

 

  用程式碼的方式移除對文字方塊的聚焦(remove focus from TextField)。

  這個問題主要是當你點擊文字框(例如TextInput或TextArea組件中都有TextField),此時就會聚焦(FOCUS_IN)到該文字框上,有游標出現讓使用者可以輸入文字。

  而在使用者點擊其他可觸發事件的元件後,該文字框自然會失焦(FOCUS_OUT)。但是,如果使用者只是點擊沒有元件的空白處,則一般情況下不會失焦。而有些情況下會希望只要使用者點擊空白處,就會自動失焦,例如我做了一個只有在聚焦文字時才會出現的虛擬鍵盤,這樣它就能隨著使用者點擊空白處時,文字框失焦而消失。

  實際上的做法是,在stage上增加監聽FocusEvent.MOUSE_FOCUS_CHANGE事件來移除焦點,MOUSE_FOCUS_CHANGE的說明是當滑鼠"想要"改變焦點(我是這麼理解啦)時觸發,意思就是當使用者用滑鼠點擊任何非該文字框處的地方(這件事情不一定會改變焦點,但是"想要",有這個意圖在)。

  寫法如下:

  stage.addEventListener(FocusEvent.FOCUS_IN, whenFocusIn); //在stage中增加監聽聚焦

       function whenFocusIn(e:FocusEvent):void
        {
        if (e.target is TextField)//如果聚焦的物件是TextField物件
        {

   //先移除監聽再增加回來,避免重複點擊時監聽很多次
            stage.removeEventListener(FocusEvent.MOUSE_FOCUS_CHANGE , whenFocusChange);        
            stage.addEventListener(FocusEvent.MOUSE_FOCUS_CHANGE ,whenFocusChange);
        }
        }


      function whenFocusChange(e:FocusEvent):void
       {
            stage.focus = null;
            stage.removeEventListener(FocusEvent.MOUSE_FOCUS_CHANGE ,whenFocusChange);
       }

  stage.focus即為當前聚焦的物件,設為null即可移除聚焦。

  要注意到不能一開始就在stage中監聽執行whenFocusChange這個函數,如果那樣寫,每次用滑鼠點擊想要聚焦時,都會改變焦點,就會送出MOUSE_FOCUS_CHANGE事件,結果這段程式碼又會把聚焦給移除。結果會變成使用者永遠無法聚焦。

  故前面先監聽使用者何時在stage中FOCUS_IN(聚焦),如果聚焦了的話,判斷聚焦的物件(此處的事件目標e.target)是否是文字框(TextField),如果是的話才再stage中加上改變焦點(MOUSE_FOCUS_CHANGE)的監聽,如此只要當使用者再次點擊任何不是該文字框的地方,就會移除該文字框的聚焦。

  

  -----

 

  當聚焦在文字框(TextField)時(第一次點擊文字框時),自動讓文字內容全選(反白)。

  連結:http://stackoverflow.com/questions/1109220/as3-textfield-focus

  程式碼:

e.target.setSelection(0, e.target.getLineLength(0));

  這裡的e.target是指到該類別為TextField的實體元件,而TextField中有方法setSelection,此方法可以讓TextField中局部的文字變為被選取(select)的狀態。既然是局部,就要指定開頭與結尾,0就是文字串的開頭,結尾的數字就要看文字串的長度,這樣指定的結果就會是全選了。

  而裡面有提到希望在已聚焦(focus)的情況下,點擊不會造成全選(因為使用者可能想要編輯局部的文字內容),這就要自己在監聽上額外加上判斷式了,連結中的方式是,監聽點擊的函數內部會移除自身的監聽,如此一來在點擊此TextField後再點擊,就不會再次觸發全選;而後在此TextField失焦時(FocusEvent.FOCUS_OUT),再把監聽點擊的函數加回去。

 

  -----

 

  關於講解事件的與處理的文章。(中文)

  連結:http://webchain.oreilly.tw/boohover/curriculum/flash/as/Events.htm

 

  -----

 

  關於event-bubbling(事件冒泡)的介紹文章,用比較比喻的方式寫成的。(英文)

  連結:http://blog.iqandreas.com/actionscript/understanding-the-as3-event-system/part-3-easy-event-bubbling/

 

 

  -----

  如何設置TextInput、Button組件的輸入框、標籤字體大小(或顏色)

  連結:http://stackoverflow.com/questions/19476132/how-to-change-the-font-size-for-text-input-in-flash-cs6

  連結裡講得滿詳細的,提到了三種方式,而不管哪一種,都必須先宣告一個TextFormat物件來儲存你想要的「文字模樣」。

import fl.managers.StyleManager; //後面會用到這個物件,所以先匯入

  var tf:TextFormat = new TextFormat();

  接著就可以設置這個文字模樣的屬性,例如:

  tf.size = 20; //字體大小,預設值是12

  tf.color = 0xFF0000; //字體顏色,開頭的0x在此可以當作其他軟體中寫色碼的「#」,結果會是#FF0000紅色。至於0x的實際意思大概是告訴電腦接下來的數字是16進位寫成的。

  等設定完以後,接著就根據需要有不同的寫法。

  1。想要一次設定全部的Button的文字模樣(或TextInput等等的其他組件)

  StyleManager.setComponentStyle(Button, "textFormat", tf); //將Button組件的"textFormat"屬性設為tf

  如果這樣寫,這個設定會套用到所有的Button上,應該也包含在執行中才產生出的Button。

  2。想要一次設定全部的組件都套用這個文字模樣

  StyleManager.setStyle("textFormat",tf); //結果應該是所有組件,Label、TextArea等等的也都會被設定。

  3。只想設定單一物件的文字模樣

  假設你的Button元件實體名稱為myBtn,則輸入:

  myBtn.setStyle("textFormat", tf); //將myBtn的文字模樣設定為tf

  

  還有一種我自己在想需要的功能,設定「某個物件下某個類別的所有子物件的文字模樣」,但似乎沒查到相關的資料,可能只能自己寫這樣的函數,寫出來的話大概是長這樣:

  setStyleIn(obj:Object, cla:Class, tf:TextFormat); //請不要直接套用,我是指可以自己寫像是這樣的函數

 

  -----

 

  textFormat在button組件被設為disabled時失效了(textFormat不見了、無效了),怎麼辦?

  連結:http://stackoverflow.com/questions/16205210/disabled-button-loses-textformat

  裡面提的是組件除了"textFormat"這個屬性以外,還有另一個"disableTextFormat"屬性,想當然地,這個屬性是關於當該組件處於disabled狀態下時的文字模樣。

 

  -----

 

  詳細講解如何製作讓使用者可以用滑鼠繪圖遊戲的文章,裡面繪圖、以及人物的速度、如何判定落地都有提及。總共有五篇。

  連結:http://www.emanueleferonato.com/2007/01/08/create-a-flash-draw-game-like-line-rider-or-others-part-1/

 

  -----

 

  講解如何用flash製作手機程式app的文章。

  連結:http://www.flycan.com/article/actionscript/adobe-air-for-android-838.html

 

  -----

 

  講解如何製作/使用外部的AS檔,同樣有很多篇,以及後面幾篇有提及如何使用FlashDevelop軟體,用這個軟體就可以在沒有安裝/購買flash製作軟體的情況下寫actionScript檔案,以及同樣可以ctrl+Enter編譯。

  連結:http://cainmaxdesign.blogspot.tw/2010/04/as3-as-1-flaas.html

     http://cainmaxdesign.blogspot.tw/2013/10/as3-as-7-flashdevelop-4app.html

  要注意的是裡面提到的FlashDevelop的版本是以前的了,直接載新版之後,安裝準備的過程會有些差異,要再上網查一下。

 

  -----

 

  如何在使用gotoAndPlay("影格標籤");以前,先判斷該影格標籤是否存在這個MovieClip中(要是不存在的話會出現錯誤)。
  連結:http://help.adobe.com/zh_TW/as3/dev/WS5b3ccc516d4fbf351e63e3d118a9b90204-7d9d.html#WS5b3ccc516d4fbf351e63e3d118a9b8ea63-7fe9

  連結裡講解flash中gotoAndPlay可以輸入影格的標籤,以及「影格標籤」可以當作一個物件來看待。

  並且MovieClip中有數個關於影格的「方法」,其中currentLabels會傳回陣列,裡面每個元素都表示一個影格物件。

  再讀取該影格物件的name屬性,就可以得知該影格所在的影格標籤的名稱。概念上至此已經可以完成這個效果了,就是用迴圈跑遍此影片片段的每一個影格,並讀取每一個影格所在的影格標籤名稱,如果有符合的則回傳true,沒有找到則回傳false。

  連結是別人寫好的function:http://www.therealtimeweb.com/index.cfm/2011/11/23/Check-if-Frame-Label-Exists-in-FlashActionScript

  

  -----

 

  手寫辨識的一種概念。

  連結:http://blog.shanger.net/article.asp?id=260

     http://blog.xuite.net/beewoow/Jeff/25648017

  

  -----

 

  如何控制其他元件中的物件/如何在元件裡控制原本在場景裡的東西/如何有系統地在不同元件中互相呼叫事件

  連結:http://www.erinylin.com/2009/06/as3-event.html

     http://milkmidi.blogspot.tw/2009/10/blog-post.html

  文章中在講的是客製事件,概念上是Event也是一種物件,我們可以自訂一種新的事件,並將它發送給特定的實體對象。

  舉例來說,當監聽物件a時寫a.addEventListener(MouseEvent.CLICK, functionClickA);

  實際上的意思是,當有MouseEvent.CLICK這個事件送到a這個物件時,會觸發functionClickA。

  使用:dispatchEvent(new Event("yourEventName", true));可以將"yourEventName"這個事件送進事件流裡。

  但這個事件會發送給哪個實體呢?我猜如果這個函數寫在一個滑鼠點擊觸發的事件之中的話,那它發送給的物件就是這段滑鼠點擊過程中觸碰到的各個物件。(也可能我想錯了,還要再測試一下),底下是EventDispatcher的API。

  連結:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/events/EventDispatcher.html  

 

  -----

 

  最佳化程式碼寫法技巧(加快執行速率、減少lag的情形)

  連結:http://help.adobe.com/zh_TW/as3/mobile/flashplatform_optimizing_content.pdf

 

  -----

 

  如何一次性地移除特定物件上的所有監聽。

  連結:https://jadendreamer.wordpress.com/2010/10/31/as3-eventlisteners-easily-retrieve-or-remove-all-event-listeners/

  是有點技巧的想法,連結裡的做法是,創造了一個新的方法addEvtListener,用法跟addEventListener完全一樣,不同的地方在於,用addEvtListener新增事件時,會將新增的事件放入一個Array物件裡,有了這個Array就能夠簡單地移除此物件的所有監聽。

 

http://blog.meathill.com/tech/as/textfield-autosize-in-as3.html

http://www.cnblogs.com/shinings/archive/2008/10/28/1321626.html

http://www.airmn.com/blog/?p=108

http://www.keendevelopment.ch/getting-the-class-of-an-object-in-as3/

https://www.kirupa.com/forum/showthread.php?334653-Does-Class-Exist

改變textField中局部的文字(不改變全部文字):http://stackoverflow.com/questions/5312614/changing-color-of-particular-text-in-a-text-field

http://stackoverflow.com/questions/15220149/creating-shared-objects-for-mobile-device-with-air-app

http://stackoverflow.com/questions/2445377/custom-broadcast-events-in-as3

https://code.tutsplus.com/tutorials/everything-you-could-possibly-want-to-know-about-import-statements--active-8118

https://www.kirupa.com/forum/showthread.php?336748-Numeric-Comparison-in-switch-statement

http://evolve.reintroducing.com/2007/10/23/as3/as3-custom-events/

http://liaosankai.pixnet.net/blog/post/27992836-%E5%9C%A8-flashdevelop-%E4%BD%BF%E7%94%A8-flash-cs3-%E7%B5%84%E4%BB%B6

http://stackoverflow.com/questions/846476/renaming-xml-nodes-using-e4x-in-as3

http://upshots.org/actionscript/20-tips-to-optimize-your-actionscript

http://stackoverflow.com/questions/95727/how-to-convert-floats-to-human-readable-fractions

http://www.sevenson.com.au/actionscript/graph/

http://board.flashkit.com/board/showthread.php?750218-Check-if-function-exists

http://stackoverflow.com/questions/860609/embedding-latex-content-in-flash-animation

http://solomongg.iteye.com/blog/1318480

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/text/StageText.html#StageText%28%29

http://stackoverflow.com/questions/12086067/air-android-force-numeric-text-input

待續……

 

 

人會花很長的時間去研究「話要怎麼說」、「話為什麼是這樣說的」,但在研究的有一定水平的了解以後,那些深度的思想過程就不再需要了,取而代之的是「話就是這樣說的」。

 

arrow
arrow
    文章標籤
    flash actionscript
    全站熱搜

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