【问题标题】:Finding the closest object in proxmity to the mouse Coordinates寻找离鼠标坐标最近的物体
【发布时间】:2011-02-02 13:23:47
【问题描述】:

我一直在研究一个问题,其中涉及定位与鼠标 x y 坐标相关的最接近的电影剪辑,我附上了一个漂亮的小伴随图形。

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

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

我的热点课程

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

提前致谢

【问题讨论】:

  • “将其引用回 MovieClip”到底是什么意思?一旦我知道我认为应该有一个简单的解决方案。
  • 刚刚根据您的最后解释编辑了我的答案...

标签: flash actionscript-3


【解决方案1】:

似乎是直截了当...

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

【讨论】:

  • 再次感谢 Theo 的帮助,这是一种更合乎逻辑的方法。
【解决方案2】:

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

    }
}

【讨论】:

    【解决方案3】:

    好的,我已经开始工作了......

    但我很累,我相信我很可能过度设计了解决方案。 感谢 Theo,我采纳了您的建议,并在 Hotspot 类中添加了一个 setter 方法并运行一个 for 循环,“将第一个热点设置为 isClosest = true,其他热点设置为 false..”

    我遇到的问题是第二个数组(我现在将其命名为“sortArray”)仅保持每个“热点”与鼠标的距离,所以一旦我按升序对数组进行排序(从最短距离到最长dist)i 只有距离字符串,没有针对 nodeArray 的引用(如索引号)。为了解决这个问题,我将一个对象推入了包含距离参数和索引参数的 sortArray。然后使用 sortOn() 方法我可以对距离参数进行排序,然后使用对应的索引参数在 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);
                }
            }
        }
    }
    

    【讨论】:

    • 嘿,这是一个非常糟糕的做法,在这里通过回答来编辑您的问题......只需点击您问题下方的 EDIT 链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多