2010-03-30 4 views
2

Je travaille sur un problème depuis un moment, qui consiste à cibler le MovieClip le plus proche par rapport aux coordonnées xy de la souris, j'ai joint un joli petit fichier graphique.Trouver l'objet le plus près de la souris Coordonnées

Chaque mc ajouté à la scène a sa propre sous-classe (HotSpots) qui utilise Pythag pour mesurer la distance de la souris. À ce stade, je peux déterminer la valeur la plus proche de ma classe principale, mais je n'arrive pas à comprendre comment la renvoyer au MovieClip ... J'espère que cela a du sens. Voici les deux classes.

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

Ma classe principale qui Attachs les mcs, et surveille le mouvement de la souris et des traces valeur la plus proche

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) 
     } 
    } 
} 

Mon HotSpots classe

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))); 
     } 
    } 
} 

merci à l'avance

+0

Que voulez-vous dire par «faire référence à nouveau à la MovieClip? Une fois que je sais que je pense qu'il devrait y avoir une solution facile à cela. – debu

+0

Juste édité ma réponse suite à votre dernière explication ... –

Répondre

2

Semble être direct ...

Ajouter une méthode pour dans le HotSpots afin que vous puissiez mettre à l'extérieur de son état:

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

Chaque fois que vous avez mis à jour les distances, vous pouvez désormais utiliser la méthode nouvellement créée pour faire les HotSpots « conscients » de leur position respective:

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); 
} 

EDIT: Après votre deuxième réponse, ...

rapidement à f ind le plus proche sans utiliser Array.sortOn vous pouvez procéder comme suit. Mais maintenant je pense que tout le code est un peu faux (pourquoi faudrait-il calculer la distance depuis l'intérieur de l'objet, etc.).

// 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

merci encore Theo pour vous aidez c'est une approche bien plus logique. – Cam

0

Ok, donc je l'ai travail ....

Mais je suis tout à fait fatigué et crois que je l'ai très probablement bien trop conçu la solution. J'ai pris votre avis, merci Theo, et ajouté une méthode de setter à la classe Hotspot et lancer une boucle for qui 'définit le premier hotspot à isClosest = true et les autres à false ..'

Le problème que j'avais était que le second tableau (que j'ai maintenant nommé 'sortArray') ne tenait chaque distance 'HotSpots' de la souris, donc une fois que j'ai trié le tableau dans l'ordre inverse (du plus court dist au plus long dist) et rien à référencer (comme dans un numéro d'index) contre nodeArray. Pour contrer cela, j'ai poussé un objet dans le sortArray qui contient le paramètre de distance et un paramètre d'index. Ensuite, en utilisant la méthode sortOn(), je pourrais trier le paramètre de distance, puis utiliser le paramètre corrosponding index pour localiser le mc approprié dans nodeArray.

Semble vraiment long ...

Principal.comme

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

Hé, c'est vraiment une mauvaise pratique ici de modifier vos questions en y répondant ... Il suffit de cliquer sur le lien EDIT sous votre question. –

+0

alrite ne savait pas, merci – Cam

0

oh, et est ici la HotSpots modifiée classe

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); 
     } 

    } 
} 
Questions connexes