对于我正在开发的游戏,我想要沿路径设置对象的动画。这有三个方面;因此,我不确定哪种方法是最佳解决方案。
路径动画
目前,路径由一系列点构成,这意味着我只使用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。在不使解决方案过于复杂的情况下,满足这些要求的有效方法是什么?很可能有一些我忽略的方面,甚至是我不知道的其他选择。
答案 0 :(得分:1)
如果您现在切换到Bezier曲线,我认为您的问题会立即得到解决。贝塞尔曲线有一个参数空间,通常是[0,1],其中有点转换为速度(由于某种原因,曲线的参数通常在数学中用时间命名为t)。因此,如果您有曲线,无论是作为实际多项式还是作为de Casteljau评估的某些控制点,您需要了解的曲线上的进展是参数空间内的进展。
因此,勾选将是参数空间内的一定距离,如果1000个刻度是完成曲线所需的刻度数,则为1/1000。您只需将1/1000添加到参数的当前值并评估该曲线的曲线。
如果这对您来说不够顺畅,那么您可以执行以下操作:将下一个刻度位置视为您想要的位置,并以线性方式从当前位置开始动画。如果您的刻度线将曲线细分得足够精细,则没有人能够看到线性线段(这应该足够用于游戏,不会用于切割机)。