查看: 6178|回复: 22

[原创发布] 课余玩耍:抛物线的参数方程

[复制链接]

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2015-3-13 16:07:31 来自手机 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 taroxd 于 2015-3-13 18:07 编辑

写代码的动机:太鼓达人中音符飞起的效果大致是一个抛物线,且过两个定点(击打点,魂槽右侧)

于是在自修课无聊时间中构造了这样一个抛物线系:开口向下,过两个定点。以其中一个点为运动的起点,另一点为运动的终点。部分灵感来源于默认系统的“跳跃”功能的实现。(其实就是把运动分解为水平方向的匀速运动和竖直方向的匀加速直线运动)

既然构造出了参数方程,接下来当然就是要有使用方法啦~ 于是把使用参数方程更新坐标的精灵类也简单地实现了一下。
注:迭代器到达结尾时应捕捉 StopIteration 异常。如果 t 只取整数的话可以不用到迭代器。

然后发现… 窗口位置的匀速渐变是这个东西的特例。  @RyanBern

在学校电脑上测试了一下,效果还是不错的。实际使用的代码如下:https://github.com/taroxd/RGSS-T ... ew/play/note_fly.rb

下面是正文:

IMG_0193.JPG IMG_0192.JPG

评分

参与人数 5星屑 +296 赞 +1 收起 理由
miantouchi + 1 精品文章
89444640 + 85 看不懂代码,但是感觉很厉害
晴兰 + 85 迭代器太贵了,大量动画效果还得自己维护超.
RyanBern + 120 塞糖
永恒の未知数 + 6 我竟然能看懂一点点

查看全部评分

闇吼者の災悪眷族

梦石
0
星屑
1366
在线时间
2881 小时
注册时间
2014-7-29
回帖
6408
发表于 2015-3-13 17:57:08 | 显示全部楼层
天惹噜,抛物线怎么算我都忘记了……

点评

打不出平方···  发表于 2019-6-16 21:30
x=2py  发表于 2019-6-16 21:29

评分

参与人数 1星屑 +6 收起 理由
永恒の未知数 + 6 这次的头像......额......

查看全部评分

回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

 楼主| 发表于 2015-3-13 18:03:25 | 显示全部楼层
本帖最后由 taroxd 于 2015-3-13 18:06 编辑
三途亚梦 发表于 2015-3-13 17:57
天惹噜,抛物线怎么算我都忘记了……


没有计算抛物线啊。

既然 x = x(t) 是一次的,y = y(t) 是两次的,那么 y = f(x) 一定是一个抛物线。
而且这个参数方程满足 x(0) = x0, x(duration) = x1, y(0) = y0, y(duration) = y1
所以一定以 (x0, y0) 为起点,(x1, y1) 为终点。

总之,这个方程是构造的,不是算出来的。

点评

不不不,我是真的不忘记抛物线怎么算了。从这个主题中的一个发想而已,所以其实你说的这段我已经不明觉厉了。  发表于 2015-3-13 18:06
回复

使用道具 举报

梦石
0
星屑
701
在线时间
511 小时
注册时间
2012-4-8
回帖
193
发表于 2015-3-13 18:11:58 | 显示全部楼层
我是来看字的,写的很漂亮
武侠|养成|战棋游戏《以武证道》头秃开发中...
开发日记在此
回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2015-3-13 18:20:17 | 显示全部楼层
y=[-(x-x0)y1+(x-x1)y0]/(x0-x1) + a*(x-x0)(x-x1)
典型的抛物线系(过两定点)。
沿着二次曲线运动的脚本让我想到了XP的彩虹神剑。
不过那里应该是采用了这样的方式:
[pre lang="Ruby"]     #=======================================
     # 修改:更新算法,更新弹出
     #=======================================
     if @_damage_duration > 0
       @_damage_duration -= 1
       for damage in @_damage
         damage[0].x = self.x + self.viewport.rect.x -
                       self.ox + self.src_rect.width / 2 +
                       (40 - damage[1]) * damage[3] / 10
         damage[0].y -= damage[4]+damage[1]/10
         damage[0].opacity = damage[1]*20
         damage[1] -= 1
         if damage[1]==0
           damage[0].bitmap.dispose
           damage[0].dispose
           @_damage.delete(damage)
           next
         end
       end
     end
[/pre]
其中@_damage里面存的是若干数组:
[显示伤害的sprite, 伤害持续时间(时间参数), ???(似乎没用到这个参数), 水平飞行速度, 竖直飞行基础速度]
这样算出来也是一个二次曲线(不会往下掉的那种)
回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

 楼主| 发表于 2015-3-13 18:24:07 | 显示全部楼层
本帖最后由 taroxd 于 2015-3-13 18:29 编辑
RyanBern 发表于 2015-3-13 18:20
y=[-(x-x0)y1+(x-x1)y0]/(x0-x1) + a*(x-x0)(x-x1)
典型的抛物线系(过两定点)。
沿着二次曲线运动的脚本 ...


不知道为什么,在RM里画曲线我就是想用参数方程

感觉参数方程玩起来比较舒心呢~(大概是因为函数可以作为方法的参数吧) 其实和普通方程没什么本质的区别

写这段代码的时候想到了 https://rpg.blue/thread-375515-1-1.html 的 3
把计算 x,y,opacity 的函数作为参数传给精灵,再提供几个构造简单函数(比如线性,或者这个主题的抛物线)的函数,似乎也是一个挺好的思路呢

点评

话说我想要删掉 SkinSettings ,直接使用 View 里面的常量来设置位置。反正也没打算给每个歌曲一个皮肤,打 SkinSettings 感觉好累的= =  发表于 2015-3-13 18:55
话说你不是想要重构代码吗= = 权限给你了欢迎 push  发表于 2015-3-13 18:52
数组可以理解为数列,也是函数的一种特殊形式。在 Ruby 中都可以通过 [] 来提供参数,所以本质上没有区别。我为了减少计算也用了 Hash 缓存  发表于 2015-3-13 18:49
我现在还傻傻的专门新建一个特效类,以数组的方式一次性算出整个运动过程中每一帧的坐标并在这个特效类update时操作其绑定的精灵……  发表于 2015-3-13 18:43
参数方程里面的t在很多情况下指的是时间,所以比较符合自然认知吧。  发表于 2015-3-13 18:30
回复

使用道具 举报

梦石
0
星屑
1547
在线时间
688 小时
注册时间
2009-11-11
回帖
2692
发表于 2015-3-13 23:00:20 | 显示全部楼层
好厉害的样子,其实啊要做出漂亮的游戏 抛物线 的公式要用到的,悲剧的层主始终没学会

嘿。嘿。嘿
回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

 楼主| 发表于 2015-3-14 08:45:26 | 显示全部楼层
@晴兰
只是考虑到 t 不是按照 +1 递增的情况,实际使用(见顶楼链接)并未使用迭代器
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2015-3-14 08:52:11 | 显示全部楼层
三途亚梦 发表于 2015-3-13 00:57
天惹噜,抛物线怎么算我都忘记了……

x²=±2py或者y²=±2px
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

梦石
0
星屑
52
在线时间
704 小时
注册时间
2011-12-27
回帖
858
发表于 2015-3-14 11:58:06 | 显示全部楼层
我表示: 我的拋物線都只是條對稱的二次方程

点评

要是那两个定点对称我也不用这么脑残地玩了……  发表于 2015-3-14 12:07
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部