主题:  从不同角度靠近一个目标的效果怎么做?

暗黑菜鸟

职务:普通成员
等级:1
金币:10.0
发贴:225
注册:2001/11/1 21:51:24
#12001/11/6 15:34:06
我想做多个mc靠近一个目标的效果,该怎么做??? 还有就是用到的数学公式是什么???



janlay

职务:管理员
等级:7
金币:28.0
发贴:7244
注册:2003/11/27 18:07:11
#22001/11/6 15:47:21
在我写的一个名为“有限距离内拖动节点”的教程中有这样的应用,希望能对你有所帮助。

SWF:

页面:点这儿参观

FLA:
janlay.top263.net/myfile/dragnode/dragnode.fla

编辑历史:[这消息被janlay编辑过(编辑时间2001-11-06 15:49:01)]


暗黑菜鸟

职务:普通成员
等级:1
金币:10.0
发贴:225
注册:2001/11/1 21:51:24
#32001/11/6 16:21:10
你这个例子是连动效果,我说的是多个mc的随机运动~~~ 关键是不知道如何使mc从各个不同的角度靠近一个目标啊~



janlay

职务:管理员
等级:7
金币:28.0
发贴:7244
注册:2003/11/27 18:07:11
#42001/11/6 16:38:05
原理是一样的,只是要修改的mc数量不一样罢了。

另外,要想实现随机靠近,可以把每次靠近的步长值设为随机数。



暗黑菜鸟

职务:普通成员
等级:1
金币:10.0
发贴:225
注册:2001/11/1 21:51:24
#52001/11/6 19:37:43
janlay在上个帖子中说
引用:
原理是一样的,只是要修改的mc数量不一样罢了。

另外,要想实现随机靠近,可以把每次靠近的步长值设为随机数。


你说的这个和我要的刚好是相反的,我是想要mc靠近固定的目标,而且不用鼠标控制的那种~



janlay

职务:管理员
等级:7
金币:28.0
发贴:7244
注册:2003/11/27 18:07:11
#62001/11/6 20:53:17
可能是我表述不对,我当然不是说要用鼠标控制了,我想说的是,万变不离其宗,原理上是一样的。

不就是群狼逼近的效果吗



暗黑菜鸟

职务:普通成员
等级:1
金币:10.0
发贴:225
注册:2001/11/1 21:51:24
#72001/11/7 14:45:26
janlay在上个帖子中说
引用:
可能是我表述不对,我当然不是说要用鼠标控制了,我想说的是,万变不离其宗,原理上是一样的。

不就是群狼逼近的效果吗


我想要的逼近效果中狼是从四面八方都有的,而且狼头都要向着人的方向,怎么做呢??



janlay

职务:管理员
等级:7
金币:28.0
发贴:7244
注册:2003/11/27 18:07:11
#82001/11/7 15:08:10
这里跟你说说狼站立的方向问题:

假设有n只狼:wolf0,wolf1,wolf2...wolf(n-1):
var ang=2*Math.PI/n;
//每只狼所分配的弧度
var cx=cy=100;
//圆心(人)的位置
var r=50;
//半径
for(var i=0;i eval("wolf"+i)._x = cx+r*Math.cos(ang*i);
eval("wolf"+i)._y = cy+r*Math.sin(ang*i);
eval("wolf"+i)._rotation = ang*i;
}

编辑历史:[这消息被janlay编辑过(编辑时间2001-11-08 16:59:30)]


暗黑菜鸟

职务:普通成员
等级:1
金币:10.0
发贴:225
注册:2001/11/1 21:51:24
#92001/11/7 15:41:47
janlay在上个帖子中说
引用:
这里跟你说说狼站立的方向问题:

假设有n只狼:wolf0,wolf1,wolf2...wolf(n-1):
var ang=2*Math.PI/n;
//每只狼所分配的弧度
var cx=cy=100;
//圆心(人)的位置
for(var i=0;i eval("wolf"+i)._x = cx+r*Math.cos(ang*i);
eval("wolf"+i)._y = cy+r*Math.sin(ang*i);
eval("wolf"+i)._rotation = ang*i;
}



拜~~~ 拜托,能不能再详细些??? 俺的数学实在是太差~~~~~



janlay

职务:管理员
等级:7
金币:28.0
发贴:7244
注册:2003/11/27 18:07:11
#102001/11/8 18:09:31
现在画图不方便。
你自己画这样一个图:
圆O的圆心在坐标原点上,过圆上一点P连接圆心,形成半径,长度为r,并作x轴的垂线(也就是和圆相切)。
这时,半径/切线/x轴会形成一个Rt三角形。
现在,已知半径r和圆心位置(当它为0时能简化计算),设半径和x轴夹角为ang(弧度),求点P的位置实际就是求两直角边,很容易了:
px=r*cos(ang)
py=r*sin(ang)

转化成狼的问题,解释如下:
for(var i=0;i eval("wolf"+i)._x = cx+r*Math.cos(ang*i);
//设置第i只狼(从0开始数)在x轴上的位置
eval("wolf"+i)._y = cy+r*Math.sin(ang*i);
//设置在y轴上的位置
eval("wolf"+i)._rotation = ang*i;
//狼的方向



vital

职务:普通成员
等级:1
金币:10.0
发贴:194
注册:2001/5/15 12:10:20
#112001/11/9 11:26:07
onClipEvent (enterFrame) {
newAngle = Math.atan2(_root.men._y-_y, _root.men._x-_x)*180/(Math.PI);
_rotation = newAngle;
}
狼头就都会朝人的方向



vital

职务:普通成员
等级:1
金币:10.0
发贴:194
注册:2001/5/15 12:10:20
#122001/11/9 11:41:42
onClipEvent (enterFrame) {
newAngle = Math.atan2(_root.man._y-_y, _root.man._x-_x)*180/(Math.PI);
newx = (_root.man._x-_x)/100+_x;
newy = (_root.man._y-_y)/100+_y;
_rotation = newAngle;
_x = newx;
_y = newy;
}

移动

topstamp.com.cn/temp/wolf.swf

topstamp.com.cn/temp/wolf.fla



暗黑菜鸟

职务:普通成员
等级:1
金币:10.0
发贴:225
注册:2001/11/1 21:51:24
#132001/11/9 22:47:17
vital在上个帖子中说
引用:
onClipEvent (enterFrame) {
newAngle = Math.atan2(_root.man._y-_y, _root.man._x-_x)*180/(Math.PI);
newx = (_root.man._x-_x)/100+_x;
newy = (_root.man._y-_y)/100+_y;
_rotation = newAngle;
_x = newx;
_y = newy;
}

topstamp.com.cn/temp/wolf.swf

topstamp.com.cn/temp/wolf.fla


多谢了~~~

不过这一句newx = (_root.man._x-_x)/100+_x;里的_x为什么到了句尾才定义呢?



vital

职务:普通成员
等级:1
金币:10.0
发贴:194
注册:2001/5/15 12:10:20
#142001/11/9 23:23:54
呵呵,我写的不好,也许应该写成这种形式

_x+=(_root.man._x-_x)/100



暗黑菜鸟

职务:普通成员
等级:1
金币:10.0
发贴:225
注册:2001/11/1 21:51:24
#152001/11/10 0:21:35
vital在上个帖子中说
引用:
呵呵,我写的不好,也许应该写成这种形式

_x+=(_root.man._x-_x)/100


是一回事是吧? 谢谢了~ 我要回去研究一下~