11RIA 闪客社区 - 最赞 Animate Flash 论坛

搜索
查看: 2451|回复: 2
上一主题 下一主题

[算法 & 公式] AS3中的圆周运动:使一个对象绕另一个对象

[复制链接] TA的其它主题
发表于 2018-12-6 14:19:21 | 显示全部楼层 |阅读模式

【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 TKCB 于 2019-1-2 16:59 编辑

让一个对象环绕另一个对象做圆周运动,这是早期游戏时代就开始使用的运动技术,直至今天,它仍然十分便利!在这个快速技巧中,我们将探讨圆周运动轨道的数学函数,查看如何修改它,以及它在实际的游戏设计中的用途。

第一步:轨道方程
要创建一个轨道,我们必须定义以下内容:
原点 – 作为轨道中心的对象或位置。
盘旋物 – 绕原点运动的对象。
角度 – 盘旋物当前的角度。
速度 - 我们对象轨道每帧的像素数目。
半径 - 从原点到盘旋物的距离。
要注意Flash的坐标系就像是一个规则的直角平面,但其Y轴是翻转的,因此向下运动时值是增加的。舞台左上角坐标是(0,0)

在此图像中,0,90,180和270指的角度,是以角度值来衡量的。
我们需要了解的另一件事是如何将角度值转换为弧度值,使用下面的公式,可以很容易地完成该转换:
弧度值=角度值*(PI / 180)   Radians = Degrees * (PI / 180)
这是实际的轨道函数:它需要两条线,一条在X轴上定位盘旋物而另一条在Y轴上定位盘旋物:
Orbiter X-Coord = Origin X-Coord + Radius * cos(Radians)

Orbiter Y-Coord = Origin Y-Coord + Radius * sin(Radians)
(在一个正常的直角平面中,sin用于X-Coord而 cos 用于Y-Coord,但由于我们的角度顺时针增加-因为Y轴是反转的-它们应用的位置也交换了)

第二步:用代码编写方程
现在,我们可以将逻辑转换成我们实际可用的代码了。首先,声明所有的变量:
  • public var orbiter:Orbiter = new Orbiter(); //盘旋物的影片剪辑
  • public var origin:Origin = new Origin();  //被环绕物的影片剪辑
  • public var angle:Number = 0; // 初始的环绕角度
  • public var speed:Number = 3; // 每帧环绕像素数
  • public var radius:Number = 75; // 轨道距原点的距离

复制代码

下一步用AS3改写使用的方程并把它放到一个ENTER_FRAME事件处理函数中:
  • var rad:Number = angle * (Math.PI / 180); // 角度转换成弧度
  • orbiter.x = origin.x + radius * Math.cos(rad); // 沿X轴定位盘旋物
  • orbiter.y = origin.y + radius * Math.sin(rad); // 沿Y轴定位盘旋物

复制代码

如果你现在测试,什么都不会发生,这是因为变量角度既没增加也没减少。因此,我们必须增加或减少该值:
  • angle += speed; / /对象顺时针圆周运动
  • angle -= speed;/ /对象逆时针圆周运动

复制代码

现在,如果我们希望我们的盘旋物要一直面向一个方向怎么办?好吧,我写了一个方程式来做到这一点!
  • orbiter.rotation = (Math.atan2(orbiter.y-origin.y, orbiter.x-origin.x) * 180 / Math.PI);

复制代码

根据你绘制你的盘旋物的方式,你可能要减去一定的角度(在括号外)使它面对正确的方向。

第三步:转化方程式
现在,这可能听起来很疯狂,但我们有些人可能希望有一个椭圆形的对象轨道。这也是容易实现的,我们要做的只是在方程式中的特定位置处乘一个值就可以了。cos或sin与一个正整数相乘,将使圆伸展。乘以0 – 1之间的小数,将使其压缩。和负数相乘将使它沿着该轴线翻转:
(2 * Math.cos(rad));/ /沿x轴的轨道伸展了2倍
(0.5 * Math.sin(rad));/ /沿y轴的轨道压缩了2倍(即减半)
(-3 * Math.cos(rad));/ /沿x轴的轨道翻转,并使其伸展3倍

我们也可以通过在方程的任一轴上添加或减去值,将我们的轨道向任何方向移动:

orbiter.x = (origin.x + radius * Math.cos(rad))-50;/ /左移轨道50像素

如果你想了解更多cos,sin,atan2的知识,请阅读Flash开发三角法则。

第四步:公式的实际用途
现在,这已经完美地实现了,但它实际上可以用来做什么呢?其实它有广泛的用途!
如果你曾经玩过马里奥赛车,你会得到“三个贝壳”的道具,这些贝壳就是使用这个技术环绕运动的。另一个例子是它被广泛应用在圆球游戏中,其中的桨叶沿外面的圆环运动。第三个例子是一个自上而下的僵尸射击游戏:有一个道具使许多枪管环绕你的游戏角色运动并粉碎任何试图攻击你的僵尸。
正如你所见,这种技术既可用于任何标准的flash游戏中也可用于休闲游戏。




OrbitingObjectsActivetuts.zip (53.32 KB, 下载次数: 16, 售价: 10 银子)

评分

参与人数 1银子 +66 金子 +1 贡献 +1 收起 理由
TKCB + 66 + 1 + 1 11RIA 星火燎原,重现燃烧的岁月.

查看全部评分

发表于 2018-12-9 00:18:33 | 显示全部楼层
对新手很有帮助的教程!
回复

使用道具 举报

发表于 2020-6-12 09:59:41 | 显示全部楼层

好东西都要收藏!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)



快速回复 返回顶部 返回列表