2012-10-06 43 views
2

所以我有一個類,這是一個屏幕,當我移動光標時,我想檢測它下面的是什麼對象,我添加了一個自定義按鈕類的TalentBtn,從starling的Button類,但是當我追蹤它時,它是Image類的一個實例。我無法將它投射到talenTbtn,當我嘗試時,它指的是null。我用hitTest(point)方法檢測對象,它返回一個DisplayObject。你們認爲我能以某種方式解決這個問題嗎? 下面是檢測方法Starling檢測按鈕爲圖片

private function onOverTalent(e:TouchEvent):void { 
     var point:Point = new Point(e.getTouch(stage).globalX, e.getTouch(stage).globalY); 

     displayObject = hitTest(point); 
     if (displayObject == null) { 
      return; 
     } 

     if (displayObject is Image) { 
      talentFound = displayObject as TalentBtn; 

      trace(displayObject); 
      trace(talentFound); 
     } 

    } 

跡線的結果是:

[object Image] 
    null 

回答

1

按鈕的DisplayObjectContainer的子類,並且被創建時將其添加到自身的圖片的背景和一個TextField爲標籤(如果有的話)。這兩個都包含在Button內的Sprite中。

要重點解決你想要做什麼,試試這個:

private function onOverTalent(e:TouchEvent):void 
{ 
    var point:Point = new Point(e.getTouch(stage).globalX, e.getTouch(stage).globalY); 

    var hit:DisplayObject = hitTest(point); 
    if (!hit) 
    { 
     return; 
    } 

    // Probably not a good idea, in case the interior structure of Button ever changes. 
    var button:Button = hit.parent.parent as Button; 
    trace(button); 
    } 
} 

但是,這種方法有一個問題:如果巴頓裏面的代碼都沒有改變,它有可能打破。所以這裏有一個更通用的方法:

private function onOverTalent(e:TouchEvent):void 
{ 
    var point:Point = new Point(e.getTouch(stage).globalX, e.getTouch(stage).globalY); 

    var hit:DisplayObject = hitTest(point); 
    if (!hit) 
    { 
     return; 
    } 

    var button:Button; 
    if (hit is Image || hit is TextField) 
    { 
     // Should be the containing Sprite now 
     hit = hit.parent; 
     while (hit) 
     { 
      button = hit as Button; 

      if (button) 
      { 
       break; 
      } 

      // Go up one in the display hierarchy 
      hit = hit.parent; 
     } 

     // None of it was a button. 
     if (!button) 
     { 
      return; 
     } 

     // button will be the Button object at this point. 
     trace(button); 
    } 
} 

但是,你有不只是監聽按鈕本身的touch事件原因是什麼?

http://doc.starling-framework.org/core/starling/display/DisplayObject.html#event:touch

+0

首先,感謝您所作出的良好回答。其次,我不想爲每個按鈕添加一個新的偵聽器,我非常肯定它會不經意地浪費大量內存。現在我知道它不是,但是誰在乎;) –

+0

@FerencDajka特別是在Starling中,事件彙總起來並且不會增加很多內存使用。 –