2011年6月8日 星期三

DisplayObjectContainer.getObjectsUnderPoint()方法_取得指定point座標上的物件

getObjectsUnderPoint()方法
public function getObjectsUnderPoint(point:Point):Array
傳回位於指定點底下,且屬於此 DisplayObjectContainer 實體之子系 (或孫系,以下類推) 的物件陣列。

※此例, 以DisplayObjectContainer.getObjectsUnderPoint()方法, 取得與(200,200)座標重疊的物件陣列.
※aaa、bbb、ccc三個Shape物件配置於元件庫中, 並分別與外部extends Sprite的三個類別AAA、BBB、CCC綁定

1000607_getObjectsUnderPoint.swf


※ trace出來的結果 :
[object Shape],[object Shape],[object TextField]
0 : instance3 : [object Shape]
1 : instance9 : [object Shape]
2 : instance10 : [object TextField]

package  {
 
 import flash.display.MovieClip;
 import flash.geom.Point;
 import flash.display.DisplayObjectContainer;
 import flash.display.Sprite;
 
 public class getObjectsUnderPoint_1000607 extends MovieClip {
  
  public var container:Sprite;
  public var aaa:Sprite;
  public var bbb:Sprite;
  public var ccc:Sprite;
  private var point:Point;
  
  public function getObjectsUnderPoint_1000607() {
   this.container = new Sprite();
   this.addChild(this.container);
   this.createObjects();
   this.point = new Point(200,200);
   var objectsArr:Array = this.getInfo(this.point);
   this.showInfo(objectsArr);
   return;
  }
  
  private function showInfo(_objectsArr:Array):void{
   trace(_objectsArr);
   for (var i:String in _objectsArr){
    trace(i + " : " + _objectsArr[i].name + " : " + _objectsArr[i]);
   }
   /*trace結果
    [object Shape],[object Shape],[object TextField]
    0 : instance3 : [object Shape]
    1 : instance9 : [object Shape]
    2 : instance10 : [object TextField]*/
   return;
  }
  
  private function createObjects():void{
   this.aaa = this.setObjects(aaa,AAA,264,226);
   this.bbb = this.setObjects(bbb,BBB,350,158);
   this.ccc = this.setObjects(ccc,CCC,188,154);
   return;
  }
  
  private function setObjects(_instance:*,_class:Class,_xPos:Number,_yPos:Number):Sprite{
   _instance = new _class();
   _instance.x = _xPos;
   _instance.y = _yPos;
   _instance.name = _instance.toString();
   this.container.addChild(_instance);
   /*trace(_instance);*/
   return _instance;
  }
  
  private function getInfo(_point:Point):Array{
   var objectsArr:Array = this.getObjectsUnderPoint(_point);
   return objectsArr;
  }
 }
 
}

2011年6月7日 星期二

利用遞迴函式巡訪容器中所有子物件,並過濾掉特定類型物件

1000606_recursion_1.swf


/*利用遞迴函式巡訪容器中所有子物件,並過濾掉特定類型物件*/

this.setInfoTF();
var indentSpace:String = "    ";
this.callOn(this, indentSpace);

function callOn(_doc:DisplayObjectContainer,_indentSpace:String):void {
if (_doc is DisplayObjectContainer) {
for (var i:uint; i<_doc.numChildren; i++) {
/*過濾掉Shape和TextField*/
if(_doc.getChildAt(i) is Shape != true && _doc.getChildAt(i) is TextField != true){
trace(_indentSpace + _doc.getChildAt(i).name + " : " + _doc.getChildAt(i));
this.addInfo(_indentSpace + _doc.getChildAt(i).name + " : " + _doc.getChildAt(i));
}
/*子物件中若還有容器,則調用本身函式callOn() - 遞迴*/
if (_doc.getChildAt(i) is DisplayObjectContainer) {
var tmpdoc:DisplayObjectContainer = _doc.getChildAt(i) as DisplayObjectContainer;
callOn(tmpdoc,_indentSpace + "    ");
}
}
}
return;
}

function setInfoTF():void {
var format:TextFormat = new TextFormat();
format.color = 0x222299;
this.info.selectable = false;
this.info.wordWrap = true;
this.info.autoSize = TextFieldAutoSize.LEFT;
this.info.setTextFormat(format);
this.info.defaultTextFormat = format;
return;
}

function addInfo(_obj:*):void {
this.info.appendText(_obj.toString() + "\n");
return;
}

2011年6月5日 星期日

InteractiveObject預設無法接收DOUBLE_CLICK事件__※doubleClickEnabled屬性

InteractiveObject 預設無法接收 DOUBLE_CLICK 事件,因為 InteractiveObject.doubleClickEnabled 屬性預設為false。
所以必須將 doubleClickEnabled 屬性設為 true,如此,繼承自 InteractiveObject 的實體,在其實體範圍內的 DOUBLE_CLICK 點擊事件將被接收。




this.setInfoTF();
/**/
this.square.doubleClickEnabled = true;
this.square.buttonMode = true;
this.square.addEventListener(MouseEvent.DOUBLE_CLICK,mouseEventHandler);
/**/
this.stage.addEventListener(MouseEvent.MOUSE_DOWN,mouseEventHandler);

function mouseEventHandler(event:MouseEvent):void {
/*trace("event.type : " + event.type);*/
switch (event.type) {
case "mouseDown" :
trace("event.type : " + event.type);
break;

case "mouseUp" :
break;

case "click" :
trace("event.type : " + event.type);
break;

case "doubleClick" :
trace("event.type : " + event.type);
break;

default :
break;
}

this.addInfo(event.type);
return;
}

function setInfoTF():void {
var format:TextFormat = new TextFormat();
format.color = 0xffff00;
this.info.selectable = false;
this.info.wordWrap = true;
this.info.autoSize = TextFieldAutoSize.LEFT;
this.info.setTextFormat(format);
this.info.defaultTextFormat = format;
return;
}

function addInfo(_obj:*):void {
this.info.appendText(_obj.toString() + "\n");
return;
}



移動模式測試 & 多物件跟隨目標轉向

1000605_collision_1a.swf <--- 緩進





1000605_collision_1b.swf <--- 無緩進

2011年5月31日 星期二

在AS2_如何將元件庫裡的元件與外部as檔綁定

這個主題對學AS3的人來講可能沒甚麼用處,
有時不小心做到這種CASE,上到這種班,倒是可能減少一些摸索時間。

※在AS2_如何將元件庫裡的元件與外部as檔綁定
※在AS2_沒有addChild()方法,那就attachMovie()吧!!! 


(一) 在AS3, FLA可以輕易從屬性面板綁定主要外部類別檔(文件物件類別)



(二)在AS3,從元件庫信手就將元件與外部類別檔綁定



(三) 在AS2, FLA無法透過屬性面板綁定主要外部類別檔 (下圖: 編輯圖示是灰色的,表示無法使用


(四) 幸好,在AS2,仍可透點選元件右鍵選單/屬性, 在[元件屬性面板]裡設定所欲綁定的外部類別


(五) 雖然[類別]欄位右側的編輯圖示也是灰色的,代表無法使用它指向外部類別或新建類別.
但,類別欄位的確可以填寫外部類別名稱



(六) 回到元件庫畫面, 會發覺,看不到剛所設定的類別名稱,但也的確已經設定完成.
這裡的test元件,只是個色塊,已經與ScaleInstance類別綁定. 


(七) 所以,建立一個測試用as2類別檔,與上述設定同名:ScaleInstance類別
ScaleInstance類別的內容是將與其綁定test元件,縮放及設定位置.


(八) 在FLA第一影格,填入以下這行CODE,將元件庫裡的test元件attachMovie到舞台
並將這這新建實體指定給ScaleInstance資料類型的aaa變數
var aaa:ScaleInstance = this.attachMovie("test","aaa",this.getNextHighestDepth());


(九) 如此將發現,aaa實體依照類別規劃,已經縮放並在指定座標上出現