Project1

标题: 课余玩耍:抛物线的参数方程 [打印本页]

作者: taroxd    时间: 2015-3-13 16:07
标题: 课余玩耍:抛物线的参数方程
本帖最后由 taroxd 于 2015-3-13 18:07 编辑

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

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

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

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

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

下面是正文:



作者: 三途亚梦    时间: 2015-3-13 17:57
天惹噜,抛物线怎么算我都忘记了……
作者: taroxd    时间: 2015-3-13 18:03
本帖最后由 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:11
我是来看字的,写的很漂亮
作者: RyanBern    时间: 2015-3-13 18:20
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, 伤害持续时间(时间参数), ???(似乎没用到这个参数), 水平飞行速度, 竖直飞行基础速度]
这样算出来也是一个二次曲线(不会往下掉的那种)
作者: taroxd    时间: 2015-3-13 18:24
本帖最后由 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 的函数作为参数传给精灵,再提供几个构造简单函数(比如线性,或者这个主题的抛物线)的函数,似乎也是一个挺好的思路呢

作者: summer92    时间: 2015-3-13 23:00
好厉害的样子,其实啊要做出漂亮的游戏 抛物线 的公式要用到的,悲剧的层主始终没学会
作者: taroxd    时间: 2015-3-14 08:45
@晴兰
只是考虑到 t 不是按照 +1 递增的情况,实际使用(见顶楼链接)并未使用迭代器
作者: chd114    时间: 2015-3-14 08:52
三途亚梦 发表于 2015-3-13 00:57
天惹噜,抛物线怎么算我都忘记了……

x²=±2py或者y²=±2px
作者: zeldafd    时间: 2015-3-14 11:58
我表示: 我的拋物線都只是條對稱的二次方程
作者: 喵呜喵5    时间: 2015-3-14 14:07

作者: miantouchi    时间: 2019-6-16 16:44
你好,看过你主楼发的手抄版的跳跃代码还有以前VA中“跳跃”的参数方程,麻烦有时间看看我在XP区关于跳跃的问题。感觉你的代码能解决我的问题,但是具体不是太明白你的代码。https://rpg.blue/thread-477598-1-1.html




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1