我的问题更多是逻辑/数学问题,而不是技术性问题。我希望这对于StackOverflow社区是可以的。我有一个使用加速度传感器的简单Android球类游戏,该传感器在SurfaceView中绘制球。它几乎可以正常工作。有时候除了球的行为。
我设法设置了一种逻辑,使球始终在屏幕边界内。 每当手机向一侧倾斜时,球都会移动并最终撞击屏幕边缘,并一直停留在屏幕边缘。一切正常,直到此处。
但是,当我决定退回球并将手机向相反方向倾斜时,在球开始向后移动之前会有很大的延迟。在边缘,即使手机朝相反的方向倾斜,我也希望球也立即朝相反的方向移动。
这是因为即使在初始倾斜过程中将球拖到屏幕边缘时,由于加速度计不断发出的值也会使球的实际位置(xPos或yPos)继续变化,因此差异越来越大。
最终,当我将手机翻转回相反的位置时,我必须等待那些加速度计的位置值返回到屏幕边缘,然后球才开始朝相反的方向移动。
这会导致巨大的延迟。例如,如果手机在X轴上向右倾斜10秒钟,那么当我在X轴的相反方向(向左)倾斜手机时,在球开始向后移动之前还有10秒的延迟。
这是到目前为止我拥有的更新球位置逻辑:
public void onSensorChanged(SensorEvent sensorEvent){
if (sensorEvent.sensor.getType() == Sensor.TYPE_ORIENTATION) {
yAcc = sensorEvent.values[1];
xAcc = sensorEvent.values[2];
float frameTime = 0.666f;
xVel += (xAcc * frameTime); // V[fin] = V[ini] + a*t
yVel += (yAcc * frameTime);
//travelled distance
float xS = (xVel /2)* frameTime; // d = V[fin]*t * 0.5
float yS = (yVel /2)* frameTime;
//switch values
xPos = -xS;
yPos = -yS;
//balls stays in borders
if (xPos > xScreenSize) { //ball hits right screen edge
xPos = xScreenSize;
} else if (xPos < 0) { //ball hits left edge
xPos = 0;
}
if (yPos > yScreenSize) { //ball hits top edge
yPos = yScreenSize;
} else if (yPos < 0) { //ball hits bottom edge
yPos = 0;
}
}
}
此外,如果需要进一步解决问题,我可以尝试提供一个gif图像,向您显示球的行为。
现在我正在考虑两种可能的解决方案,但是我无法实现它们。 一种是在屏幕上的x和y位置创建一个偏移量变量并跟踪偏移量,另一种是在需要时以某种方式将加速度计的发射值重新设置为0,这样每次球碰到边缘时都会对其进行重新校准。但是我不知道该怎么做,我不确定是否有可能。感谢所有帮助。