我正在创建一种设备,您可以通过将自行车放在培训师上并将其连接到平板电脑/手机来进行视频游戏自行车比赛,这将计算来自簧片开关或霍尔效应传感器的脉冲并计算您的速度,距离等,与普通自行车电脑相同,并用它来移动你的化身在游戏世界。它是用Java编写的libGDX。
我试图让数字自行车停下来停下来。如果你要达到给定的速度,使得脉冲之间的时间通常为100毫秒,那么如果我们检查时间增量并且自上次点击以来它已经是200毫秒,我们知道你不能超过你以前的速度的一半,我们应该每次更新你的速度时相应地调低,最后通过一些阈值,我们决定你有效地停止。
我希望速度沿大致对数曲线衰减,这样我希望能够估算出你的自行车在人行道上的速度范围。我还需要聪明地估计自上次点击以来你走过的距离,这样如果我们突然咔哒一声,你的距离就不会向前跳。
我怎样才能让自行车停下来停下来,我该如何定位自行车在游戏世界中的不确定性,直到下一次点击我们必须走多远?我已经在互联网上搜索自行车电脑的代码示例,但尚未找到任何代码,更不用说任何具有额外限制的东西,他们需要能够在游戏世界中呈现他们当前的位置。
以下是代码:
每当我们从自行车传感器获得另一个脉冲时,点击功能就会运行:
public void click() {
currentTime = System.currentTimeMillis();
int delta = (int) (currentTime - lastClick);
// If we have less than N samples, just add it to the list.
// Otherwise pop one off and fill it in with the new value.
if (samples.size() == SAMPLE_RESOLUTION) {
samples.remove(0);
}
samples.add(delta);
clicks += 1;
lastClick = currentTime;
}
averageSamples函数平均最后N个样本以平滑速度。它现在只是一个简单的平均值,但后来我打算对其进行加权,以使新数据的权重大于旧数据。
public double averageSamples() {
Integer sum = 0;
if (!samples.isEmpty()) {
for (Integer sample : samples) {
sum += sample;
}
return wheelCircumference / (sum.doubleValue() / samples.size());
}
return sum.doubleValue();
}
最后,更新功能会运行游戏的每一帧,因此大约每60秒一次。它应该计算你的速度和距离,根据自那时以来经过的时间量,猜测自上次点击以来你走了多远:
public void update() {
double newSpeed;
currentTime = System.currentTimeMillis();
int delta = (int) (currentTime - lastClick);
// The below line needs to adjust your speed downward if it's been too long since the last click. We're hoping for a smooth curve on the way to coasting to a stop.
newSpeed = averageSamples();
elapsedTime = currentTime - startTime;
instSpeed = newSpeed;
avgSpeed = (avgSpeed + instSpeed) / 2;
maxSpeed = Math.max(newSpeed,instSpeed);
/* This line needs to guess how far you've gone since the last click. Right now I'm using this value directly to draw the bike at a certain place in the game world, so we need to do this in a way that if we suddenly get a click, you don't end up jumping forward. */
distance = (long) (clicks * wheelCircumference);
}