我已经能够为我的精灵应用平滑动画并使用加速度计控制它。我的精灵被修复为沿着x-aixs左右移动。
从这里开始,我需要弄清楚如何为精灵创建垂直无限波浪线以尝试追踪。我的游戏的目的是让用户使用加速度计控制精灵的左/右移动,以尽可能地追踪永无止境的波浪线,同时精灵和相机都在垂直方向上移动以模拟“移动”沿着这条线。“如果线是随机生成的,那将是理想的。
我研究了花键,平面,贝塞尔曲线等,但我找不到任何与我想要实现的相近的东西。
我正在寻求一些指导,说明我可以使用哪些方法来实现这一目标。有什么想法吗?
答案 0 :(得分:2)
您可以使用4到5个正弦波的总和(每个具有不同的幅度,波长和相位差)。所有这三个参数都可以是随机的。
得到的曲线非常平滑(因为它主要是正弦曲线)但它看起来是随机的(它的时间周期是所有4到5个随机波长的LCM,这是一个巨大的数字)。
因此曲线不会重复很长时间,但记忆力并不难。关于计算复杂性,您可以随时通过使用FPS更改正弦项的数量来调整它。
应该是这样的。
实施起来也很容易。 (即使我可以生成上面的图像..哈哈)
希望这会有所帮助。数学摇滚。 :d
(这里的基本思想是有限的Fourier series我认为应该是你的用例的理想选择)
修改强>
您可以像这样创建每个术语,并为所有术语指定随机值。
public class SineTerm {
private float amplitude;
private float waveLength;
private float phaseDifference;
public SineTerm(float amplitude, float waveLength, float phaseDifference) {
this.amplitude = amplitude;
this.waveLength = waveLength;
this.phaseDifference = phaseDifference;
}
public float evaluate(float x) {
return amplitude * (float) Math.sin(2 * Math.PI * x / waveLength + phaseDifference);
}
}
现在创建一个SineTerm
的数组并添加evaluate(x)
返回的所有值(使用一个sprite坐标作为输入)。使用输出作为精灵的其他坐标。你应该好好去。
真正的诀窍是调整那些随机数。
祝你好运。