沿着具有附加要求的路径制作动画

时间:2016-01-05 08:22:17

标签: java animation javafx

对于我正在开发的游戏,我想要沿路径设置对象的动画。这有三个方面;因此,我不确定哪种方法是最佳解决方案。

路径动画

目前,路径由一系列点构成,这意味着我只使用Path只有直线。但是我打算稍后将其更改为Bézier curve。目前,这些点的距离在5到8个像素之间。我还打算减少曲线上的控制点数量。 当我说动画时我正在考虑PathTransition,但我并没有这样做,因为基于各种约束,可能会有更好的解决方案。

沿着路径设置动画的对象是ImageView,但也可以像Shape一样简单(如Circle)。

持续时间

游戏由计时器驱动。计时器发送tick个事件。蜱虫的游戏时间是多少取决于蜱虫间隔:游戏时间刻度可以代表5分钟或1小时的过去时间。每100毫秒发生一次滴答。

根据节拍间隔,可以确定动画的初始持续时间:

int intervalInMinutes = 5;
int ingameAnimationDurationInMinutes = 60 * 24;
int nbTicks = ingameAnimationDurationInMinutes / 5; // = 288
int durationInMs = 100 * nbTicks; // 28800 ms = 28.8s

然而,滴答间隔可能在任何时间(例如5分钟 - > 30分钟)发生变化。这意味着剩下的动画应该加速6倍。 此时我看到以下选项:

  • 更新动画的持续时间。对于PathTransition这似乎很容易,但其他方法(如KeyFrame动画)可能会有问题。
  • 停止正在运行的动画,并从当前位置重新初始化动画。我认为这可能很困难,因为当前位置可能与曲线中的一个控制点不匹配,这意味着需要重新计算曲线(或至少第一个段)。
  • 迭代创建动画:沿着曲线仅为一个刻度设置动画。对于这种方法,同样的问题适用于上面的那个:当动画完成时,动画对象的位置必须在控制点。如果滴答间隔发生变化,控制点之间的段也会发生变化。

外部更新

动画对象的位置需要在其模型中更新,以便代码的其他部分可以对更改的位置做出反应。我可以在这里设想各种场景:

  • 在每个刻度查询中,动画对象的位置并更新其模型中的位置
  • 动画更新对象的位置。但是对于这种方法,我可能需要KeyFrame动画,甚至KeyFrame动画和Interpolator
  • 不要使用其中一个内置动画,但要更新每个刻度上的位置(因为只有10个刻度/秒,这不会产生平滑的动画)

在不使解决方案过于复杂的情况下,满足这些要求的有效方法是什么?很可能有一些我忽略的方面,甚至是我不知道的其他选择。

1 个答案:

答案 0 :(得分:1)

如果您现在切换到Bezier曲线,我认为您的问题会立即得到解决。贝塞尔曲线有一个参数空间,通常是[0,1],其中有点转换为速度(由于某种原因,曲线的参数通常在数学中用时间命名为t)。因此,如果您有曲线,无论是作为实际多项式还是作为de Casteljau评估的某些控制点,您需要了解的曲线上的进展是参数空间内的进展。

因此,勾选将是参数空间内的一定距离,如果1000个刻度是完成曲线所需的刻度数,则为1/1000。您只需将1/1000添加到参数的当前值并评估该曲线的曲线。

如果这对您来说不够顺畅,那么您可以执行以下操作:将下一个刻度位置视为您想要的位置,并以线性方式从当前位置开始动画。如果您的刻度线将曲线细分得足够精细,则没有人能够看到线性线段(这应该足够用于游戏,不会用于切割机)。