设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 4597|回复: 22
打印 上一主题 下一主题

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

[复制链接]

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

跳转到指定楼层
1
发表于 2015-3-13 16:07:31 手机端发表。 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

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

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

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

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

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

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

下面是正文:


评分

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

查看全部评分

Lv3.寻梦者

闇吼者の災悪眷族
不気味存在締造者

梦石
0
星屑
1366
在线时间
2881 小时
注册时间
2014-7-29
帖子
6491
2
发表于 2015-3-13 17:57:08 | 只看该作者
天惹噜,抛物线怎么算我都忘记了……

点评

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

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

3
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
701
在线时间
511 小时
注册时间
2012-4-8
帖子
255
4
发表于 2015-3-13 18:11:58 | 只看该作者
我是来看字的,写的很漂亮
武侠|养成|战棋游戏《以武证道》头秃开发中...
开发日记在此
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9532
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

5
发表于 2015-3-13 18:20:17 | 只看该作者
y=[-(x-x0)y1+(x-x1)y0]/(x0-x1) + a*(x-x0)(x-x1)
典型的抛物线系(过两定点)。
沿着二次曲线运动的脚本让我想到了XP的彩虹神剑。
不过那里应该是采用了这样的方式:
RUBY 代码复制
  1. #=======================================
  2.      # 修改:更新算法,更新弹出
  3.      #=======================================
  4.      if @_damage_duration > 0
  5.        @_damage_duration -= 1
  6.        for damage in @_damage
  7.          damage[0].x = self.x + self.viewport.rect.x -
  8.                        self.ox + self.src_rect.width / 2 +
  9.                        (40 - damage[1]) * damage[3] / 10
  10.          damage[0].y -= damage[4]+damage[1]/10
  11.          damage[0].opacity = damage[1]*20
  12.          damage[1] -= 1
  13.          if damage[1]==0
  14.            damage[0].bitmap.dispose
  15.            damage[0].dispose
  16.            @_damage.delete(damage)
  17.            next
  18.          end
  19.        end
  20.      end

其中@_damage里面存的是若干数组:
[显示伤害的sprite, 伤害持续时间(时间参数), ???(似乎没用到这个参数), 水平飞行速度, 竖直飞行基础速度]
这样算出来也是一个二次曲线(不会往下掉的那种)
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

6
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1332
在线时间
675 小时
注册时间
2009-11-11
帖子
2790
7
发表于 2015-3-13 23:00:20 | 只看该作者
好厉害的样子,其实啊要做出漂亮的游戏 抛物线 的公式要用到的,悲剧的层主始终没学会

嘿。嘿。嘿
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (版主)

…あたしは天使なんかじゃないわ

梦石
0
星屑
2208
在线时间
4033 小时
注册时间
2010-10-4
帖子
10779

开拓者贵宾

8
 楼主| 发表于 2015-3-14 08:45:26 | 只看该作者
@晴兰
只是考虑到 t 不是按照 +1 递增的情况,实际使用(见顶楼链接)并未使用迭代器
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9280
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

9
发表于 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
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
52
在线时间
704 小时
注册时间
2011-12-27
帖子
941
10
发表于 2015-3-14 11:58:06 | 只看该作者
我表示: 我的拋物線都只是條對稱的二次方程

点评

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

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-6 07:23

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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