我是 Android 游戏开发的初学者,我正在开发一个小游戏。 我在使用运动传感器时遇到了一些困难:加速度计。
这个游戏是横向模式。 我想如果我的手机向右倾斜,我的角色也会向右倾斜。 (左边也一样) 当我停止倾斜时,游戏中的角色应该停止移动。
但我不太了解加速度计的操作,
这是我的代码:
@Override
public void onSensorChanged(SensorEvent event) {
synchronized (this) {
long penchement = (long) (event.values[1]- 0.5);
if(penchement>0){
if(penchement>lastUpdate)
lastUpdate=penchement;
if(penchement>0.2){
booldroite=true; // boolean for going right
boolgauche=false; // boolean for going left
}
if(lastUpdate-penchement<0.2)
booldroite=false;
}
else{
if(penchement<lastUpdate)
lastUpdate=penchement;
if(penchement<-0.2){
boolgauche=true;
booldroite=false;
}
if(lastUpdate+penchement>-0.2)
boolgauche=false;
}
}
所以我的代码(有点)有效,但我的角色的 Action 一点也不流畅。有时我的手机倾斜但我的角色不动...
如果你能帮助我,非常感谢你。
最佳答案
传感器读数本质上是嘈杂的,这就是您的角色闪烁运动的原因。
您需要在读数后实现某种低通滤波器。 SensorEvent 中有一个基本的低通滤波器示例.
public void onSensorChanged(SensorEvent event) {
// alpha is calculated as t / (t + dT)
// with t, the low-pass filter's time-constant
// and dT, the event delivery rate
final float alpha = 0.8;
gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];
linear_acceleration[0] = event.values[0] - gravity[0];
linear_acceleration[1] = event.values[1] - gravity[1];
linear_acceleration[2] = event.values[2] - gravity[2];
}
您可能想使用 gravity[]
中的值来找出手机的“倾斜度”。此外,尝试使用 final float alpha
的值:接近 1.0 的值会提高平滑度,而接近 0.0 的较小值会获得更嘈杂的读数,但响应速度更快。
好机会!
关于Android加速度计的困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13935759/