Нахождение ближайшего объекта в непосредственной близости от мыши Координаты - PullRequest
2 голосов
/ 30 марта 2010

Я уже некоторое время работаю над проблемой, которая включает в себя нацеливание на ближайший мувиклип относительно координат x y мыши, я прикрепил симпатичный небольшой сопутствующий рисунок.

Каждый mc, добавленный к сцене, имеет свой собственный подкласс (HotSpots), который использует Pythag для измерения расстояния от мыши. На этом этапе я могу определить ближайшее значение из моего основного класса, но не могу понять, как вернуть его обратно в мувиклип ... надеюсь, это имеет смысл. Ниже приведены два класса.

альтернативный текст http://design.camoconnell.com/images/example.jpg

Мой основной класс, который прикрепляет 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)
        }
    }
}

Мой класс HotSpots

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

заранее спасибо

Ответы [ 3 ]

2 голосов
/ 30 марта 2010

Кажется, прямо вперед ...

Добавьте метод в 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);
}

РЕДАКТИРОВАТЬ: После вашего второго ответа, ...

Чтобы быстро найти ближайший без использования 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 голосов
/ 30 марта 2010

о, и вот исправленный класс HotSpots

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

    }
}
0 голосов
/ 30 марта 2010

Хорошо, у меня все работает ...

Но я очень устала и полагаю, что, скорее всего, я переоценила решение. Я воспользовался вашим советом, спасибо Тео, и добавил метод set в класс Hotspot и запустил цикл for, который 'устанавливает первую точку доступа в isClosest = true, а остальные в false ..'

Проблема, с которой я столкнулся, заключалась в том, что второй массив (который я теперь назвал «sortArray») удерживал только расстояние «горячих точек» от мыши, поэтому, как только я отсортировал массив в порядке возрастания (от кратчайшего до длинного dist) у меня была только строка расстояния и ничего для ссылки (как в индексе) на nodeArray. Чтобы противостоять этому, я поместил объект в sortArray, который содержит параметр расстояния и параметр индекса. затем с помощью метода sortOn () я мог бы отсортировать параметр расстояния, а затем использовать соответствующий параметр индекса, чтобы найти подходящий mc в nodeArray.

Кажется, очень долго ...

Main.as

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);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...