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中运行过,只是凭空写出来的)可以联系我跟我讨论,本人先在此谢谢大家了。希望在时间充裕的时候和大家探讨更深入的问题。
相关文章推荐
- 关于定点移动的解决方案分析
- 【移动安全】Android APP逆向跟踪分析常见问题解决方案
- 关于.net网站的安全性问题以及解决方案的分析
- 关于“ORA-12545: 因目标主机或对象不存在,连接失败。”原因分析及解决方案
- [Phonegap+Sencha Touch] 移动开发25 关于sencha touch在华为、红米、HTC等部分手机下hide事件失效,msgbox无法关闭的解决方案
- 关于java出现 java.lang.InstantiationException异常的分析与解决方案
- 关于移动互联网手机搜索的特性分析(图文)
- 关于cocos2d中tilemap移动时出现黑线的解决方案
- 关于成都移动宽带访问开源中国看不到图片的问题分析
- 关于oracle 锁机制锁问题的详细分析(处理锁定)以及死锁的解决方案
- Ext.Net/ExtJs:关于TextField控件内size、maxLength控制文本框输入字符长度属性失效问题分析以及解决方案
- [Phonegap+Sencha Touch] 移动开发25 关于sencha touch在华为、红米、HTC等部分手机下hide事件失效,msgbox无法关闭的解决方案
- 谷歌是否提供最好的移动分析解决方案
- 关于Address already in use: connect问题分析及解决方案
- 关于购物车出现mysql deadlock的问题分析及解决方案
- 关于c#导出的文本或者cvs文件在excel中中文乱码的分析及解决方案
- 关于互联网流量劫持分析及可选的解决方案
- 关于web应用中跨域问题的解决方案,并特别针对移动方向提出一些解决方案
- 移动项目开发笔记(.net下关于上传文件解决方案比较和探讨)
- 关于移动App开发经济效益分析