查找靠近鼠标坐标的最近对象

时间:2010-03-30 16:17:39

标签: flash actionscript-3

我一直在研究一个问题,其中涉及针对与鼠标的x y coords相关的最近的movieClip,我附上了一个很好的小图片。

每个添加到舞台上的mc都有自己的子类(HotSpots),它使用Pythag测量鼠标的距离。在这个阶段,我可以确定与我的Main类最接近的值,但无法弄清楚如何将它引用回movieclip ...希望这是有道理的。以下是两个类。

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

My HotSpots Class

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 个答案:

答案 0 :(得分:2)

似乎很直接......

将方法添加到HotSpots中,以便外部设置其状态:

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

每次更新距离后,您现在都可以使用新创建的方法让HotSpots“了解”它们各自的位置:

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

答案 1 :(得分:0)

好的,所以我让它工作了......

但是我很累,并且相信我很可能过度设计了这个解决方案。 我接受了你的建议,感谢Theo,并为Hotspot类添加了一个setter方法并运行一个for循环,'将第一个热点设置为isClosest = true,其他热点设置为false ..'

我遇到的问题是第二个数组(我现在命名为'sortArray')只保持每个'HotSpots'与鼠标的距离,所以一旦我按顺序排序数组(从最短的到最长的dist)我只有距离字符串,没有任何东西可以引用(如索引编号)nodeArray。为了解决这个问题,我将一个对象推入了包含distance参数和索引参数的sortArray。然后使用sortOn()方法我可以对distance参数进行排序,然后使用corrosponding index参数在nodeArray中找到合适的mc。

似乎真的很啰嗦......

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

答案 2 :(得分:0)

哦, 这是修改后的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);
        }

    }
}