2010-03-30 109 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); 
     } 

    } 
}