您的位置:首页 > 其它

Flash AS关于定点移动的解决方案分析

2008-05-25 11:55 232 查看

var mouseListener:Object=new Object();


var totalLength:Number=0;


var pileLength:Number=0;


var speed:Number=5; //匀速运动,此是定值。




mouseListener.onMouseDown=function()...{


_root.totalLength=obj._x-_root._xmouse;




_root.onEnterFrame=function()...{




if(_root.pileLength+_root.speed<=Math.abs(_root.totalLength))...{




if(_root.totalLength<0)...{


obj._x+=_root.speed;




}else...{


obj._x-=_root.speed;


}


_root.pileLength+=_root.speed;




}else...{




if(_root.totalLength<0)...{


obj._x+=Math.abs(_root.totalLength)-_root.pileLength;




}else...{


obj._x-=Math.abs(_root.totalLength)-_root.pileLength;


}


_root.pileLength=0;


_root.totalLength=0;


delete _root.onEnterFrame;


}


}


}


Mouse.addListener(mouseListener);





从上面的源码中的Mouse.addListener(mouseListener);可以看到我们注册了鼠标的按下侦听事件。每次鼠标点下去的时候,我们的侦听事件就会给触发。这侦听事件里面我们求出了obj对象离指定点的总路径totalLength。之后我们给主场景赋予了onEnterFrame事件,然obj对象移动到指定位置。从代码上来看我们可以看到变量pileLength是充当累积路径用的,每当obj移动一个步长,那么pileLength就累积起一个步长的长度。有人可能会不大清楚if(_root.pileLength+_root.speed<Math.abs(_root.totalLength))这句代码的意思,其实这是当obj接近目的点并且在下一次移动就到达目的点的时候,如果剩余的距离不够一个步长那么就走完剩余的距离即可。也就是else分支的代码,最后我们还要将pileLength复位和删除掉onEnterFrame事件,以便为下一次移动作准备。这就是累积路径法,下面我来说一下剩余路径法是如何解决这个问题的。

剩余路径法,与累积路径法相反,他是通过求出剩余的路径的长度,如果剩余路径长度为零就代表已经到达目的点。让我们先看看源码吧:


var mouseListener:Object=new Object();


var totalLength:Number=0;


var speed:Number=5; //匀速运动,此是定值。




mouseListener.onMouseDown=function()...{


_root.totalLength=obj._x-_root._xmouse;




_root.onEnterFrame=function()...{




if(_root.totalLength>=_root.speed)...{




if(_root.totalLength<0)...{


obj._x+=_root.speed;


_root.totalLength+=_root.speed;




}else...{


obj._x-=_root.speed;


_root.totalLength-=_root.speed;


}




}else...{




If(_root.totalLength<0)...{


obj._x+=_root.totalLength;




}else...{


obj._x-=_root.totalLength;


}


_root.totalLength=0;


delete _root.onEnterFrame;


}


}


}


Mouse.addListener(mouseListener);

整段代码下来我们可以清楚地看到obj对象每走一个步长,总路径长度都在减少,但由于方向的不同这里做了不同的处理。直到总路径长度为0后我们就结束onEnterFrame事件。

三、移动次数法:

前两个方法都是利用路径的长度来进行判断的,而这个方法就像我们出去旅行,计算到达目的地要多长时间一样,把总路径长度按照移动的步长计算出总共要用移动多少次,然后按照移动次数来控制影片的运动。先来看看源代码吧:


var mouseListener:Object = new Object();


var totalLength:Number = 0;


var speed:Number = 3;


var count:Number = 0;


var spare:Number = 0;


var position:Number = 0;




mouseListener.onMouseDown = function() ...{


_root.totalLength = people._x-_root._xmouse;


_root.count = Math.abs(Math.floor(_root.totalLength/_root.speed));


_root.spare = _root.totalLength%_root.speed;




_root.onEnterFrame = function() ...{




if (_root.count != 0) ...{


//判断方向




if (_root.totalLength>0) ...{


obj._x += _root.speed;




} else ...{


obj._x -= _root.speed;


}


_root.count--;




} else ...{




if(_root.totalLength<0)...{


obj._x -= _root.spare;




}else...{


obj._x+=_root.spare;


}


_root.spare = 0;


_root.totalLength = 0;


delete _root.onEnterFrame;


}


};


};


Mouse.addListener(mouseListener);

以上代码就是一个按次数移动的方法。其中的_root.spare = _root.totalLength%_root.speed;可能会不理解,其实这是求取不足一次移动的距离,也是剩余的距离不够作为一次移动步长了,最后只要加上这段距离就能到达目的地了。

那么,今天就讲到这里吧,如果哪为高手还什么更好的解决方法不妨拿出来共享一下,让大家学习学习。不懂的朋友或者认为我上面的代码有误的朋友(上面的代码都没有在Flash中运行过,只是凭空写出来的)可以联系我跟我讨论,本人先在此谢谢大家了。希望在时间充裕的时候和大家探讨更深入的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐