我一直在研究一个问题,其中涉及针对与鼠标的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)));
}
}
}
提前致谢
答案 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);
}
}
}