2010-03-30 111 views
2

我一直在研究一個問題一段時間,其中涉及到針對與鼠標的xy座標相關的最接近的影片剪輯,我附加了一個很好的小小的acompanying圖形。尋找距離鼠標最近的對象座標

添加到舞臺上的每個mc都有它自己的子類(HotSpots),它使用Pythag來測量與鼠標的距離。在這個階段,我可以確定從我的Main類最接近的值,但不知道如何將其引回到動畫片段中......希望這是有道理的。以下是兩個類。

alt text http://design.camoconnell.com/images/example.jpg

我的主類,其attachs的MCS,並監視鼠標移動和跡線最接近的值預先

package { 
    import flash.display.*; 
    import flash.text.*; 
    import flash.events.*; 

    public class Main extends MovieClip 
    { 
     var pos:Number = 50; 
     var nodeArray:Array; 

     public function Main(){ 

      nodeArray = []; 

      for(var i:int = 0; i < 4; i++) 
      { 

       var hotSpot_mc:HotSpots = new HotSpots; 
       hotSpot_mc.x += pos; 
       hotSpot_mc.y += pos; 
       addChild(hotSpot_mc); 

       nodeArray.push(hotSpot_mc); 

       // set some pos 
       pos += 70; 
      } 

      stage.addEventListener(MouseEvent.MOUSE_MOVE,updateProxmity) 
     } 

     public function updateProxmity(e:MouseEvent):void 
     { 
      var tempArray:Array = new Array(); 

      for(var i:int = 0; i < 4; i++) 
      { 
       this['tf'+[i]].text = String(nodeArray[i].dist); 


       tempArray.push(nodeArray[i].dist); 

      } 

      tempArray.sort(Array.NUMERIC); 
      var minValue:int = tempArray[0]; 
      trace(minValue) 
     } 
    } 
} 

我的熱點類

package { 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.text.TextField; 

    public class HotSpots extends MovieClip 
    { 
     public var XSide:Number; 
     public var YSide:Number; 
     public var dist:Number = 0; 

     public function HotSpots() 
     { 
      addEventListener(Event.ENTER_FRAME, textUp); 
     } 

     public function textUp(event:Event):void 
     { 
      XSide = this.x - MovieClip(root).mouseX; 
      YSide = this.y - MovieClip(root).mouseY; 
      dist = Math.round((Math.sqrt(XSide*XSide + YSide*YSide))); 
     } 
    } 
} 

感謝

+0

究竟你通過「引用它回到了MovieClip」是什麼意思?一旦我知道我認爲應該有一個簡單的解決方案。 – debu 2010-03-30 16:28:12

+0

剛剛編輯我的回答後,你最後的解釋... – 2010-03-30 19:30:44

回答

2

似乎直線前進......

的方法加入到HotSpots這樣你就可以在外部設置它的狀態:

public function set isClosest(value:Boolean):void 
{ 
    // do something here, example : 
    alpha = (value) ? 1 : .5; 
} 

每次你已經更新了距離現在可以使用新創建的方法,使熱點「識別」的它們各自的位置:

for(var i:int = 0; i < 4; i++) 
{ 
    // sets the first hotspot to isClosest = true and the others to false ... 
    (nodeArray[i] as HotSpots).isClosest = (i == 0); 
} 

編輯:按照你的第二個答案,...

趕緊到f在沒有使用Array.sortOn的情況下最接近您可以繼續如下。但是現在我認爲整個代碼有點錯了(爲什麼你需要計算物體內的距離等等)。

// For iteration only 
var hotSpot:HotSpots; 

// Keeps track of the so far closest hotSpot 
var closestHotSpot:HotSpots; 

// Stores the so far closest distance (to avoid recalculating each time) 
var closestDistance:Number; 

// Finds out the closest 
for each(hotSpot in nodeArray) 
{ 
    if(closestHotSpot == null || nodeArray[i].dist < closestDistance) 
    { 
     closestHotSpot = hotSpot; 
     closestDistance = hotSpot.dist; 
    } 
} 

// Applies the right state to each of the hotSpots 
for each(hotSpot in nodeArray) 
{ 
    hotSpot.isClosest = (hotSpot == closestHotSpot); 
} 
+0

再次感謝泰奧你幫助這是一個更合乎邏輯的方法。 – Cam 2010-03-30 19:46:17

0

好了,我已經得到了它的工作....

但我相當累了,認爲我很有可能大大超過設計的解決方案。 我接受了你的建議,謝謝Theo,並在Hotspot Class中添加了一個setter方法,並運行了一個for循環,它將第一個熱點設置爲isClosest = true,其他設置爲false ..'

我遇到的問題是第二個數組(我現在命名爲'sortArray')只有鼠標每個'HotSpots'的距離,所以一旦我按照按順序排列數組(從最短距離到最遠距離),我只有距離字符串並沒有什麼可以引用(如在索引號中)針對nodeArray。爲了解決這個問題,我將一個對象推入了包含距離參數和索引參數的sortArray。然後使用sortOn()方法我可以對距離參數進行排序,然後使用corrosponding索引參數來定位nodeArray中的相應mc。

似乎真的很長囉...

主要。作爲

package { 
    import flash.display.*; 
    import flash.text.*; 
    import flash.events.*; 

    public class Main extends MovieClip 
    { 
     var pos:Number = 50; 
     var nodeArray:Array; 

     public function Main(){ 

      nodeArray = []; 

      for(var i:int = 0; i < 4; i++) 
      { 

       var hotSpot_mc:HotSpots = new HotSpots; 
       hotSpot_mc.x += pos; 
       hotSpot_mc.y += pos; 
       addChild(hotSpot_mc); 

       nodeArray.push(hotSpot_mc); 

       // set some pos 
       pos += 70; 
      } 

      stage.addEventListener(MouseEvent.MOUSE_MOVE,updateProxmity) 
     } 

     public function updateProxmity(e:MouseEvent):void 
     { 
      var sortArray:Array = []; 

      for(var i:int = 0; i < 4; i++) 
      { 
       this['tf'+[i]].text = String(nodeArray[i].dist); 

       var ob:Object = {} 
       ob.dist = String(nodeArray[i].dist); 
       ob.arrayPos = i; 

       sortArray.push(ob); 

      } 

      sortArray.sortOn("dist",Array.NUMERIC); 
      var minValue:int = sortArray[0]; 

      for(var j:int = 0; j < 4; j++){ 
       (nodeArray[j] as HotSpots).isClosest = (j == sortArray[0].arrayPos); 
      } 
     } 
    } 
} 
+0

嘿,這是一個非常糟糕的做法,通過回答他們編輯您的問題...只需點擊您的問題下面的編輯鏈接。 – 2010-03-30 19:30:04

+0

alrite不知道,謝謝 – Cam 2010-03-30 19:35:59

0

哦, 和這裏的修改後的熱點類

package { 
    import flash.display.MovieClip; 

    public class HotSpots extends MovieClip 
    { 
     public var XSide:Number; 
     public var YSide:Number; 
     public var dist:Number = 0; 

     public function HotSpots() 
     { 
     } 

     public function textUp():void 
     { 
      XSide = this.x - MovieClip(root).mouseX; 
      YSide = this.y - MovieClip(root).mouseY; 
      dist = Math.round((Math.sqrt(XSide*XSide + YSide*YSide))); 
     } 

     public function set isClosest(value:Boolean):void 
     { 
      var stopPos = (value) ? 2 : 1; 
      this.gotoAndStop(stopPos); 
     } 

    } 
}